汇编(七)

image.png

函数的局部变量

接下来我们新建项目,在main.m文件中写下如下代码

int sum(int a,int b){
    return a+b;
}
int main(int argc,char * argv[]){
    sum(10,20);
    return 0;
}

断点断住sum函数.我们看看sum函数内部的汇编.


image.png

我们可以看到.sp拉伸了16个字节.
接下来我们修改一下代码在看看sum函数的汇编

int sum(int a,int b){
    int c = 10;
    int d = 20;
    int f = 30;
    return a+b;
}
int main(int argc,char * argv[]){
    sum(10,20);
    return 0;
}
image.png

接来下sum函数里面.栈拉伸了32个字节(ARM64中对sp的操作是16字节对齐的,也就是16的整数倍).
那么我们刚才在sum函数中定义的局部变量,就被放在了函数的栈空间中.

函数的局部变量是放在函数的栈空间中的.

函数的嵌套调用

那么刚才的函数属于"叶子"函数.也就是说,这个函数内部没有再调用其他函数了.
如果函数是嵌套调用会怎样呢?我们来看下下面的案例:

int sum(int a,int b){
    int c = 10;
    int d = 20;
    printf("%d",d);
    return a+b;
}
int main(int argc,char * argv[]){
    sum(10,20);
    return 0;
}

从汇编可以看出.我们一旦是嵌套调用,就立刻多开辟了16个字节的空间.
因为只要是嵌套调用,我们需要保护x29和x30两个寄存器(本函数调用的返回地址,"回家的路").


image.png

讲解视频
前面几节课的复盘

ARM汇编入门(一) — 进制本质
ARM汇编入门(二) — 寄存器&pc&bl指令
ARM汇编入门(三) — 寄存器&cpu补充
ARM汇编入门(四) — 栈SP&FP寄存器
ARM汇编入门(五) — bl&ret函数的调用与返回
ARM汇编入门(六) — 函数的参数和返回值
ARM汇编入门(七) — 函数的局部变量与嵌套调用
ARM汇编入门(八) — 状态寄存器
ARM汇编入门(九) — 内存分区全局变量和局部变量
ARM汇编入门(十) — 循环选择判断
待续…

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,521评论 8 114
  • Loop指令 Loop指令和CX寄存器配合使用,用于循环操作类似高级语言的for, while 使用格式 mov...
    林大鹏阅读 224评论 0 0
  • Loop指令 loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for、while 使用格式 loop指...
    为自己丶拼个未来阅读 269评论 0 0
  • 脏脏的方糖,你也要来一颗吗(⁎⁍̴̛ᴗ⁍̴̛⁎)
    玉之丞喵阅读 84评论 0 0
  • 有天早上下大雨,上班路上,等红绿灯;路口一片地势较低,蓄了很多雨水。话说刚来的时候那条路本来就是很好的,南京河西属...
    Henry亨利王阅读 250评论 0 1