Как перевести "pushl 2000" с AT&T asm на синтаксис Intel на i386

Я пытаюсь перевести следующее из сборки 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   x7d0

push [2000]
68 d0 07 00 00          push   x7d0

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

push dword ptr 2000
68 d0 07 00 00          push   x7d0

Итак, у меня нет подсказок, что такое эквивалент "pushl 2000"?

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 где хранятся локальные потоки). Думайте о них как о базовых смещениях в памяти. По умолчанию доступ к данным с


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

.intel_syntax
push dword [2000]

выдает :

0:   ff 35 d0 07 00 00       pushl  0x7d0

и для nasm:

push dword [dword 2000]