编程中的函数、栈与指针深入解析
1. 不同架构代码示例及特点
1.1 ARM64 代码示例
以下是一个 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 生成的代码与未优化时相同。
超级会员免费看
订阅专栏 解锁全文
1081

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



