深入探究代码中的函数、栈与指针
1. 不同架构下的代码示例
首先来看一个 main() 函数返回 uint64_t 类型值的示例代码:
#include <stdio.h>
#include <stdint.h>
uint64_t main()
{
printf ("Hello!\n");
return 0;
}
在非优化的GCC 4.8.1环境下,使用 objdump 查看代码,其中 MOV 指令如下:
4005a4:
d2800000
mov
x0, #0x0
// #0
这里的 LDP (Load Pair)指令用于恢复 X29 和 X30 寄存器。指令后没有感叹号,意味着先从栈中加载值,然后将栈指针 SP 增加16,这被称为后索引。
在ARM64架构中,出现了新指令 RET ,它的功能与 BX LR 类似,但添加了一个特殊的提示位,告知CPU这是函数返回,而非普通的跳转指令,从而能更高效地执行。由于该函数简单,优化后的GCC生成的代码与非优化时相同。
超级会员免费看
订阅专栏 解锁全文

1921

被折叠的 条评论
为什么被折叠?



