3.函数本质

[TOC]

补充

CPU

高速缓存,1级64k,2级8M

成本高,所以只有少的

高速缓存于PC内指令的关系??

寄存器 补充

8086中使用cs、ds、ss、es来保存地址段,而在<u>arm64中直接将sp直接指向,而不再需要段地址+偏移地址来寻址</u>

 sub sp, sp, #0x20 ==> sp = sp - 0x20
 [sp, #0x10] // 指针偏移到sp+0x10处

通用寄存器

​ 64位:x0 - x30, XZR(零寄存器)

​ 32位:w0 - w30, WZR(零寄存器)

PC 寄存器(program counter)为指令寄存器,指示CPU当前要读取指令的地址;

拉伸向低地址,读写向高地址

sp 是x30寄存器?~~ x30是lr寄存器:lr是x30,存放函数返回的地址;sp是存放栈顶的地址;

<u>在以前,通过sp偏移一次存放一个数据,而在arm64中,是先用sp指示出一片区域,后通过sp的地址偏移来存放数据。</u>(因为内存空间够大了吧,先开辟后存放,不会浪费资源),所以现在对栈的判断就是通过sp的地址,sp指向的位置就是栈的空间。

fp是x29?是,在arm64中被弱化,基本没有用到

栈是存在于内存中的

sp 保存的是栈顶位置?那么栈底在什么位置,栈顶位置和栈底位置应该是固定不动的,否则函数栈的空间会进行变化?

sp是保存栈顶地址,对于栈底,在arm64中,调用一个函数sp会的值会相应的减少,相等于开辟栈空间,新开辟的栈空间即是新调用函数的空间,在函数调用结束后sp的值会相应的增加,可以保持栈的平衡,所以fp就被弱化。所以在内存中新调用函数时才会进行栈空间,调用结束就对栈进行平衡操作。

sp和fp定义了栈的空间,fp是x29寄存器,某时刻可以用来保存栈底的地址

str、ldr —变形升级—》 stp、ldp:操作两个寄存器

函数

bl和ret

寄存器读写

register write lr ***
register read lr ***
// 2种简写
[sp, #-0x10]! == > 
sub sp, sp, #0x10

[sp],#0x10 == >
add sp, sp, #0x10

对齐? 对栈的操作(开辟空间/恢复平衡)必须保持为16的倍数

在函数有嵌套调用时需要将x30入栈,即现场保护;

参数&返回值

sp 拉伸是16对齐的,即16的倍数,指的是栈开辟的空间大小;不是指的数据的,数据在存入时可以任意大小地存入到所开辟的栈空间内;

在调用叶子函数时,不进行栈开辟操作,内部的临时变量是如何储存的?向低地址空间直接存储?那么其他函数不会覆盖的原因是什么? (视频参数&返回值,11’)

suma,,叶子函数不开辟空间解释

调用叶子函数(callee)时,sp的值已经固定了,因为是叶子函数所以后续没有其他函数调用,不会在开辟新的栈空间;因此,在叶子函数中的局部变量需要使用内存时,直接在sp的基础上进行向低地址偏移即可,而不会影响到调用函数(caller)的栈空间中的数据;而在叶子函数调用结束后数据都不在需要了,当有新其他函数进入时会将新的数据先写入栈中,然后在从其中读取出来。(多进程、多线程时如何保证)

函数返回值,通常存放在x0;void *是函数指针8个字节一个寄存器可以存储下; 返回类型可能为结构体,不能用x0;

参数存放在x0到x7这8个寄存器中,超过8个的参数所有参数都进行入栈操作,返回值通过放在x0;

需要入栈操作的情况下,不是一开始就将所有值都依次从x0开始存入,注意x0, x1需要先进行保存,而后在进入调用函数前将最后的两个参数复制给他们。

为啥将sp偏移过后的地址存放在x29中?相当于是对栈底的保护。

// 将x29、x30放入sp偏移16字节的空间中
// x29和x30,都是64位的,即8字节,8+8=16,整好都存入对应的地址中

stp x29,x30 [sp,#0x10]!

函数的局部变量

  1. 普通函数,参数个数小于8时,直接存放在x0-x7(或w0-w7)中;在参数个数超过8个会进行入栈,先对栈进行拉伸,后再通过sp向高地址写入数据;
  2. 叶子函数,参数直接在sp的基础上进行向下偏移进行储存;
  3. 嵌套调用时,如:
int funcA (int a, int b){
    int d = sum(a, b);
    int e = sum(a, b)
    return e;
}
main() {
    funcA(10,20);
}

此时需要对a,b这2个参数进行入栈保护,原因是首次传入时,x0,x1分别被赋值为10、20,这第一次调用sum后x0被赋值于返回值,所以无法再次获取10这个值,因此先保存到栈中后从栈中取出来。称之为现场保护

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 组件 计算机是一种数据处理设备,它由CPU和内存以及外部设备组成。CPU负责数据处理,内存负责存储,外部设备负责数...
    哆啦灬少A梦阅读 1,567评论 1 2
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,585评论 1 19
  • bl和ret指令 bl标号 将下一条指令的地址放入lr(x30)寄存器 转到标号处执行指令 注意:当我们遇到bl指...
    struggle3g阅读 7,708评论 0 1
  • 关于CPU的补充 寄存器 CPU除了有控制器、运算器还有寄存器。其中寄存器的作用就是进行数据的临时存储。 CPU的...
    lukyy阅读 487评论 0 0
  • 图文/迦墨南 高中的课文,到如今记忆深刻的没有几句,但“庭有枇杷树,吾妻死之年所手植也,今已亭亭如盖矣。”算是一句...
    迦墨南阅读 524评论 2 2