我正在尝试在C中复制x86 mov指令,例如mov%ecx,-0x4(%ebp),并且对如何操作感到困惑。我有一个寄存器的int数组和一个int位移。如何将%ecx的值移动到比%ebp中存储的值小的内存地址4中?
我有:
int* destAddress=(int*)(displacement + registers[destination]);
*destAddress=registers[source];
我收到警告:从不同大小的整数转换为指针。
答案 0 :(得分:1)
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
:volatile int local = value;
。
但是在实际代码中没有充分的理由这样做。
功能
当然,正如您在汇编语言指令中看到的那样,在引擎盖下有指针解除引用,但它并没有在C表示中显示。
如果你想在那里得到一些指针表示法,比如你在堆栈上分配了一个数组值,并想初始化它的第一个成员:
int array[4];
array[0] = value; // set first element of array to 'value' (== ECX)
C代码中的位移(-4
)根本不会出现。 C编译器处理它。