Assembly 如何翻译;pushl 2000“;来自美国电话电报公司,;i386上的asm到Intel语法
我正在尝试将以下内容从AT&T汇编转换为英特尔汇编:Assembly 如何翻译;pushl 2000“;来自美国电话电报公司,;i386上的asm到Intel语法,assembly,x86,intel,att,i386,Assembly,X86,Intel,Att,I386,我正在尝试将以下内容从AT&T汇编转换为英特尔汇编: 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
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”的等价物?我认为原始代码没有做你认为它正在做的事情。根据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
前缀,您表明您确实想在那里进行内存访问。对于我来说,在GNU汇编程序2.18中,对于32位目标
.intel_syntax
push dword [2000]
生成:
0: ff 35 d0 07 00 00 pushl 0x7d0
对于nasm:
push dword [dword 2000]
同样的代码为我生成了这个“0:68 d4 07 00 push$0x7d4”,作为2.20传递它--32。这看起来确实是正确的翻译。我不能说我非常理解原始代码(我也不想),但我想把它翻译成英特尔语法。你能解释一下“ds:”是从哪里来的吗?好吧-我在答案中添加了一点关于
ds
的描述。你知道我怎么会不想那么聪明吗?对不起-不。我的猜测是,很久以前有人在编译器中制造了一个bug,它成为了事实上的标准。