Assembly 如何翻译;pushl 2000“;来自美国电话电报公司,;i386上的asm到Intel语法

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

我正在尝试将以下内容从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 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,它成为了事实上的标准。