6

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

4

2 回答 2

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前缀,您表明您确实打算在那里进行内存访问。

于 2009-11-10T18:42:49.473 回答
1

对我来说,在 GNU 汇编器 2.18 中,用于 32 位目标

.intel_syntax
push dword [2000]

生成:

0:   ff 35 d0 07 00 00       pushl  0x7d0

对于 nasm :

push dword [dword 2000]
于 2009-11-10T18:46:42.297 回答