assembly - 如何在 i386 上将 "pushl 2000"从 AT&T asm 转换为 Intel 语法

标签 assembly x86 intel att i386

我正在尝试将以下内容从 AT&T 程序集转换为 Intel 程序集:

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部分。

我猜为什么push dword ptr [2000]没有工作是编译器意识到这对您来说是一件愚蠢的事情并“修复它”。通过强制使用 ds前缀表明你真的想在那里进行内存访问。

关于assembly - 如何在 i386 上将 "pushl 2000"从 AT&T asm 转换为 Intel 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710171/

相关文章:

C++ 数组大小 x86 和 x64

c - 在 CPU 上运行 OpenCL 代码有什么好处?

c++ - 具有 PinPlay RTN_InsertCall 回调的英特尔 Pin 未在重放时执行

c - C 中 int 汇编指令的精确控制流程,以及由此产生的段错误

assembly - 在命令行中传递参数,汇编编程

assembly - 为什么CMP(比较)有时会在8086组件中设置进位标志?

assembly - 寄存器与ascii字符的比较

c - 汇编代码泛化

assembly - 将处理后的位图图像写入文件

c - 在使用堆栈方面,为什么我们需要一个基指针和一个堆栈指针