我正在尝试将以下内容从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”?
答案 0 :(得分:7)
我认为原始代码没有做你认为它正在做的事情。据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 :(得分:1)
对我来说,在GNU汇编程序2.18中,对于32位目标
.intel_syntax
push dword [2000]
生成:
0: ff 35 d0 07 00 00 pushl 0x7d0
和nasm:
push dword [dword 2000]