4、深入探究代码中的函数、栈与指针

深入探究代码中的函数、栈与指针

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生成的代码与非优化时相同。

2. MIPS架构中的“全局指针”概念
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值