【发布时间】:2017-10-16 13:10:57
【问题描述】:
mov rax,QWORD PTR [rbp-0x10]
mov eax,DWORD PTR [rax]
add eax,0x1
mov DWORD PTR [rbp-0x14], eax
下一行用 C 编写,在 GNU/Linux 环境中使用 GCC 编译。
汇编代码用于 int b = *a + 1;.
...
int a = 5;
int* ptr = &a;
int b = *a + 1;
取消引用 a 地址中的内容并将其加 1。之后,存储在新变量下。
我不明白是汇编代码中的第二行。这是否意味着我将 QWORD 剪切为 DWORD(QWORD 的一部分)并将其存储到 eax 中?
由于代码只有几行,我很乐意将其分成几部分,以确认我在正确的轨道上,同时弄清楚第二行的作用。谢谢。
【问题讨论】:
-
您发布的程序集只是一个片段。例如,将
a初始化为5的指令丢失。如果你可以发布整个函数,解释可能会更容易产生。 -
int* 在 x64 代码中是 8 个字节,因此是 QWORD。取消引用指针会在 x64 代码中产生 int,4 个字节,因此是 DWORD。
-
@HansPassant 我相信这个答案可以满足我的需求。非常感谢。
-
int b = *a + 1;行如何编译?表达式*a无效,因为a的类型为int。你打错字了吗,应该改成int b = *ptr + 1;吗?
标签: c assembly compilation