首页 文章

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

提问于
浏览
0

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

我有:

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

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

1 回答

  • 1
    mov %ecx,-0x4(%ebp)
    

    或者,在Intel语法中:

    mov DWORD PTR [ebp-4], ecx
    

    ECX 中的值存储到内存位置 [ebp-4] .

    EBP 是"base pointer",通常用于(在未经优化的代码中)访问堆栈上的数据 . 基于负偏移量,该指令几乎肯定会将 ECX 的值存储到第一个DWORD大小的局部变量中 .

    如果你想将它翻译成C,那将是:

    int local = value;
    

    假设 value 映射到 ECX 寄存器, local 是在堆栈上分配的局部变量 . 真的,就是这样 .

    [除了C编译器通常会将这样的局部变量放在寄存器中,所以这实际上会转换为更像mov edx,ecx的东西 . 它会溢出到堆栈的唯一时间是它是否用完寄存器(这在寄存器不足的x86 ISA中并不少见) . 或者,您可以通过使变量volatile:force int local = value;来强制它溢出 . 但是在实际代码中没有充分的理由这样做 . ]

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

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

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

    位移( -4 )将不会出现在C代码中 . C编译器处理它 .

相关问题