Как перевести "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]