如何翻译从AT&T汇编“pushl 2000”对i386的Intel语法
题
我试图翻译下面从AT&T组件英特尔组件:
pushl 2000
现在这个编译成:
ff 35 d0 07 00 00 pushl 0x7d0
但无论我怎么努力,我不能让英特尔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相当于”?
解决方案
我觉得原来的代码是没有做什么你觉得它在做什么。根据MSDEV拆卸是:
003AFCFC FF 35 D0 07 00 00 push dword ptr ds:[7D0h]
它等于推动:
*((DWORD*)2000)
NOT推值2000压入堆栈。但是 - 如果这是真的,你想要什么,然后指令是:
push dword ptr ds:[2000]
ds:
是使用ds
段寄存器的指示。段寄存器从讨厌的16位天保持了过来。其中主要有cs
- 代码段,ds
- 数据段和ss
- 堆栈段(和fs
其是其中螺纹当地人被存储)。把它们当作基础偏移到内存中。默认情况下,数据访问是关闭ds
段。
我的,为什么push dword ptr [2000]
没有工作的猜测是,编译器意识到这是一个愚蠢的事情让你使用和“固定它。通过强制使用ds
前缀表明您真的是做一个内存访问那里。
其他提示
对我来说,在GNU汇编2.18,对于32位的目标
.intel_syntax
push dword [2000]
产生
0: ff 35 d0 07 00 00 pushl 0x7d0
和用于NASM:
push dword [dword 2000]
不隶属于 StackOverflow