Sve*_*ier 6 x86 assembly intel i386 att
我正在尝试将以下内容从AT&T程序集转换为英特尔程序集:
pushl 2000
Run Code Online (Sandbox Code Playgroud)
现在这归结为:
ff 35 d0 07 00 00 pushl 0x7d0
Run Code Online (Sandbox Code Playgroud)
但无论我尝试什么,我都无法在英特尔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
Run Code Online (Sandbox Code Playgroud)
所以我没有线索,相当于"pushl 2000"?
我认为原始代码没有做你认为它正在做的事情.据msdev说,反汇编是:
003AFCFC FF 35 D0 07 00 00 push dword ptr ds:[7D0h]
Run Code Online (Sandbox Code Playgroud)
这相当于推动:
*((DWORD*)2000)
Run Code Online (Sandbox Code Playgroud)
不要将值2000推入堆栈.但是 - 如果那真的是你想要的那么指令是:
push dword ptr ds:[2000]
Run Code Online (Sandbox Code Playgroud)
ds:表示使用ds段寄存器.段寄存器是令人讨厌的16位日的暂停.主要的是cs- 代码段,ds- 数据段和ss- 堆栈段(以及fs存储线程本地的位置).将它们视为内存的基本偏移.默认情况下,数据访问不在该ds段中.
我猜测为什么push dword ptr [2000]不起作用的是编译器意识到你使用和"修复它"是一件很愚蠢的事情.通过强制使用ds前缀,您可以表明您真的想在那里进行内存访问.