Как перевести “pushl 2000” из AT&T asm к синтаксису Intel на i386

Это - веб-сайт сотрудничества. Все участники в команде могут обновить единственный календарь и загрузить совместно использованные документы единому репозиторию.

6
задан starblue 10 November 2009 в 19:06
поделиться

2 ответа

Я думаю, что исходный код не делает то, что вы думаете. Согласно msdev, дизассемблирование выглядит следующим образом:

003AFCFC FF 35 D0 07 00 00 push        dword ptr ds:[7D0h] 

Что эквивалентно нажатию:

*((DWORD*)2000)

НЕ помещает значение 2000 в стек. Однако - если это действительно то, что вам нужно, тогда инструкция:

push dword ptr ds:[2000]

ds: указывает на использование сегментного регистра ds . Сегментные регистры - это пережиток неприятных 16-битных дней. Основными из них являются cs - сегмент кода, ds - сегмент данных и ss - сегмент стека (и fs , где локальные потоки хранятся). Думайте о них как о базовых смещениях в памяти. По умолчанию доступ к данным отключен от сегмента ds .

Я предполагаю, почему push dword ptr [2000] didn ' Работа заключается в том, что компилятор понял, что это было глупо для вас, и «исправил это». Принудительное использование префикса ds означает, что вы действительно имеете в виду доступ к памяти.

7
ответ дан 16 December 2019 в 21:41
поделиться

для меня в ассемблере GNU 2.18 для 32-битной цели

.intel_syntax
push dword [2000]

генерирует:

0:   ff 35 d0 07 00 00       pushl  0x7d0

и для nasm:

push dword [dword 2000]
1
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: