如何在i386上将“pushl 2000”从AT& T asm翻译成Intel语法

时间:2009-11-10 18:33:24

标签: assembly x86 intel att i386

我正在尝试将以下内容从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”?

2 个答案:

答案 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]