我正在尝试在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)


或者,以Intel语法:

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强制它溢出:。但是没有充分的理由在真实代码中执行此操作。]


当然,正如您在汇编语言指令中看到的那样,在内部有指针取消引用的情况,但是它没有体现在C表示形式中。

如果要在其中获得一些指针符号,请说您在堆栈上分配了一个值数组,并希望初始化其第一个成员:

int array[4];
array[0] = value;   // set first element of array to 'value' (== ECX)


位移(volatile int local = value;)完全不会出现在C代码中。 C编译器可以处理。

关于c - 不同大小的C指针中的x86 mov指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43773556/

10-12 15:02