Как перевести «pushl 2000» из AT & T asm в синтаксис Intel на i386 - PullRequest
6 голосов
/ 10 ноября 2009

Я пытаюсь перевести следующее из сборки AT & T в сборку Intel:

pushl 2000

Теперь это компилируется в:

ff 35 d0 07 00 00       pushl  0x7d0

Но что бы я ни пытался, я не могу получить то же самое в Intel Synax, я пробовал:

intel asm
disassembly after compiling to at&t

push 2000
68 d0 07 00 00          push   $0x7d0

push [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr 2000
68 d0 07 00 00          push   $0x7d0

Так что я не в курсе, что эквивалентно "pushl 2000"?

Ответы [ 2 ]

7 голосов
/ 10 ноября 2009

Я думаю, что оригинальный код не делает то, что вы думаете, он делает. Согласно 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] не сработало, заключается в том, что компилятор понял, что это глупо для вас, и «исправил». Принудительно используя префикс ds, вы указываете, что действительно хотите получить доступ к памяти.

1 голос
/ 10 ноября 2009

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

.intel_syntax
push dword [2000]

генерирует:

0:   ff 35 d0 07 00 00       pushl  0x7d0

и для носа:

push dword [dword 2000]
...