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

标签 c assembly x86

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

相关文章:

assembly - 是否可以在 GNU Assembler 中定义命名的美元本地标签?

assembly - 像 .size X,.-X 这样的代码模式有什么作用?

c - 在英特尔 64 位机器上启用/禁用缓存 : CD bit always set?

c - 汇编优化函数调用,允许从函数中取出常量吗?

c - 如何使用 SSE2 添加数组中的所有元素?

android - 如何为双显示器配置 Android x86(即克隆)?

c - 使用未知大小的数组元素初始化多维数组会出错

c - pthread_create 内存泄漏

c - select() 在服务器端有多个客户端

彩色碰撞C SFML