x86 mov指令在不同大小的C指针中

时间:2017-05-04 03:48:13

标签: c assembly x86

我正在尝试在C中复制x86 mov指令,例如mov%ecx,-0x4(%ebp),并且对如何操作感到困惑。我有一个寄存器的int数组和一个int位移。如何将%ecx的值移动到比%ebp中存储的值小的内存地址4中?

我有:

int* destAddress=(int*)(displacement + registers[destination]);
*destAddress=registers[source];

我收到警告:从不同大小的整数转换为指针。

1 个答案:

答案 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中并不常见)。

另外,你可以强制它溢出通过变量volatilevolatile int local = value;
但是在实际代码中没有充分的理由这样做。 功能

当然,正如您在汇编语言指令中看到的那样,在引擎盖下有指针解除引用,但它并没有在C表示中显示。

如果你想在那里得到一些指针表示法,比如你在堆栈上分配了一个数组值,并想初始化它的第一个成员:

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

C代码中的位移(-4)根本不会出现。 C编译器处理它。