汇编 – 如何在i386上将“pushl 2000”从AT&T asm翻译为Intel语法

我正在尝试将以下内容从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)

不要将值2000推入堆栈.但是 – 如果那真的是你想要的那么指令是:

push dword ptr ds:[2000]

ds:表示使用ds段寄存器.段寄存器是令人讨厌的16位日的暂停.主要的是cs – 代码段,ds – 数据段和ss – 堆栈段(以及存储线程本地的fs).将它们视为内存的基本偏移.默认情况下,数据访问不在ds段中.

我猜为什么推dword ptr [2000]不起作用的是编译器意识到你使用和“修复它”这是一个愚蠢的事情.通过强制使用ds前缀,您可以表明您确实想要在那里进行内存访问.

相关文章
相关标签/搜索