我试图翻译下面从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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top