我正在尝试在 C 中复制 x86 mov 指令,例如 mov %ecx,-0x4(%ebp),但对如何执行它感到困惑。我有一个用于寄存器的 int 数组和一个 int 位移。如何将 %ecx 的值移动到比 %ebp 中存储的值小 4 的内存地址中?
我有:
int* destAddress=(int*)(displacement + registers[destination]);
*destAddress=registers[source];
我收到警告:从不同大小的整数转换为指针。
最佳答案
mov %ecx,-0x4(%ebp)
或者,采用英特尔语法:
mov DWORD PTR [ebp-4], ecx
正在将ECX
中的值存储到内存位置[ebp-4]
中。
EBP
是“基指针”,通常用于(在未优化的代码中)访问堆栈上的数据。根据负偏移量,该指令几乎肯定会将 ECX
的值存储到第一个 DWORD 大小的局部变量中。
如果你想把它翻译成 C,那就是:
int local = value;
假设value
映射到ECX
寄存器,并且local
是分配在堆栈上的局部变量。真的,就是这样。
[除了 C 编译器通常会将这样的局部变量放入寄存器中,因此这实际上会转换为更像 mov edx, ecx
的内容。唯一一次溢出到堆栈的情况是寄存器用完(这在寄存器非常匮乏的 x86 ISA 中并不罕见)。
或者,您可以通过以下方式强制它溢出:变量 volatile
: volatile int local = value;
。
但在实际代码中没有充分的理由这样做。]
当然,正如您在汇编语言指令中看到的那样,这里在幕后发生了指针取消引用,但它并没有在 C 表示中体现出来。
如果您想在其中获取一些指针表示法,假设您在堆栈上分配了一个值的数组,并且想要初始化其第一个成员:
int array[4];
array[0] = value; // set first element of array to 'value' (== ECX)
位移 (-4
) 根本不会出现在 C 代码中。 C 编译器会处理这个问题。
关于c - 不同大小的C指针中的x86 mov指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43773556/