如何做网站长尾关键词布局,网页编辑文字,建站园,网站开发好什么进行界面的优化精读内核源码就绕不过汇编语言#xff0c;鸿蒙内核有6个汇编文件#xff0c;读不懂它们就真的很难理解以下问题.
1.系统调用是如何实现的?
2.CPU是如何切换任务和进程上下文的?
3.硬件中断是如何处理的?
4.main函数到底是怎么来的?
5.开机最开始发生了什么?
6.关机…精读内核源码就绕不过汇编语言鸿蒙内核有6个汇编文件读不懂它们就真的很难理解以下问题.
1.系统调用是如何实现的?
2.CPU是如何切换任务和进程上下文的?
3.硬件中断是如何处理的?
4.main函数到底是怎么来的?
5.开机最开始发生了什么?
6.关机最后的最后又发生了什么?
以下是一个很简单的C文件编译成汇编代码后的注解. 读懂这些注解会发现汇编很可爱甚至还会上瘾并没有想象中的那么恐怖读懂它会颠覆你对汇编和栈的认知.
#include stdio.h
#include math.hint square(int aint b){return a*b;
}int fp(int b)
{int a 1;return square(abab);
}int main()
{int sum 1;for(int a 0;a 100; a){sum sum fp(a);}return sum;
}//编译器: armv7-a clang (trunk)
square(int int):sub sp sp #8 sp减去8意思为给square分配栈空间只用2个栈空间完成计算str r0 [sp #4] 第一个参数入栈str r1 [sp] 第二个参数入栈ldr r1 [sp #4] 取出第一个参数给r1ldr r2 [sp] 取出第二个参数给r2mul r0 r1 r2 执行a*b给R0返回值的工作一直是交给R0的add sp sp #8 函数执行完了要释放申请的栈空间bx lr 子程序返回等同于mov pclr即跳到调用处
fp(int):push {r11 lr} r11(fp)/lr入栈保存调用者main的位置mov r11 sp r11用于保存sp值函数栈开始位置 sub sp sp #8 sp减去8意思为给fp分配栈空间只用2个栈空间完成计算str r0 [sp #4] 先保存参数值放在SP4此时r0中存放的是参数mov r0 #1 r01str r0 [sp] 再把1也保存在SP的位置ldr r0 [sp] 把SP的值给R0ldr r1 [sp #4] 把SP4的值给R1add r1 r0 r1 执行r1abmov r0 r1 r0r1用r0r1传参bl square(int int)先mov lr pc 再mov pc square(int int) mov sp r11 函数执行完了要释放申请的栈空间 pop {r11 lr} 弹出r11和lrlr是专用标签弹出就自动复制给lr寄存器bx lr 子程序返回等同于mov pclr即跳到调用处
main:push {r11 lr} r11(fp)/lr入栈保存调用者的位置mov r11 sp r11用于保存sp值函数栈开始位置sub sp sp #16 sp减去8意思为给main分配栈空间只用2个栈空间完成计算mov r0 #0 初始化r0str r0 [r11 #-4] 作用是保存SUM的初始值 str r0 [sp #8] sum将始终占用SP8的位置str r0 [sp #4] a将始终占用SP4的位置b .LBB1_1 跳到循环开始位置
.LBB1_1: 循环开始位置入口ldr r0 [sp #4] 取出a的值给r0cmp r0 #99 跟99比较bgt .LBB1_4 大于99跳出循环 mov pc .LBB1_4b .LBB1_2 继续循环直接 mov pc .LBB1_2
.LBB1_2: 符合循环条件入口ldr r0 [sp #8] 取出sum的值给r0sp8用于写SUM的值str r0 [sp] 先保存SUM的值SP的位置用于读SUM值ldr r0 [sp #4] r0用于传参取出A的值给r0作为fp的参数bl fp(int) 先mov lr pc再mov pc fp(int)mov r1 r0 fp的返回值为r0保存到r1ldr r0 [sp] 取出SUM的值add r0 r0 r1 计算新sum的值由R0保存str r0 [sp #8] 将新sum保存到SP8的位置b .LBB1_3 无条件跳转直接 mov pc .LBB1_3
.LBB1_3: 完成a操作入口ldr r0 [sp #4] SP4中记录是a的值赋给r0add r0 r0 #1 r0增加1str r0 [sp #4] 把新的a值放回SP4里去b .LBB1_1 跳转到比较 a 100 处
.LBB1_4: 循环结束入口ldr r0 [sp #8] 最后SUM的结果给R0返回值的工作一直是交给R0的mov sp r11 函数执行完了要释放申请的栈空间pop {r11 lr} 弹出r11和lrlr是专用标签弹出就自动复制给lr寄存器bx lr 子程序返回跳转到lr处等同于 MOV PC LR这个简单的汇编并不是鸿蒙的汇编只是先打个底由浅入深 但看懂了它基本理解鸿蒙汇编代码没有问题 后续将详细分析鸿蒙内核各个汇编文件的作用. 开始分析上面的汇编代码.
第一: 上面的代码和鸿蒙内核用栈方式一样都采用了递减满栈的方式 什么是递减满栈? 递减指的是栈底地址高于栈顶地址满栈指的是SP指针永远在栈顶.一定要理解递减满栈否则读不懂内核汇编代码.举例说明:
square(int int):sub sp sp #8 sp减去8意思为给square分配栈空间只用2个栈空间完成计算str r0 [sp #4] 第一个参数入栈str r1 [sp] 第二个参数入栈ldr r1 [sp #4] 取出第一个参数给r1ldr r2 [sp] 取出第二个参数给r2mul r0 r1 r2 执行a*b给R0返回值的工作一直是交给R0的add sp sp #8 函数执行完了要释放申请的栈空间bx lr 子程序返回等同于mov pclr即跳到调用处首句汇编的含义就是申请栈空间 sp sp - 8 一个栈内单元(栈空间)占4个字节申请2个栈空间搞定函数的计算仔细看下代码除了在函数的末尾 sp sp 8 又恢复在之前的位置的中间过程SP的值是没有任务变化它的指向是不动的 这跟很多人对栈的认知是不一样的它只是被用于计算例如 ldr r1 [sp #4] 的意思是取出SP4这个虚拟地址的值给r1寄存器SP的值并没有改变的为什么要呢因为SP是指向栈顶的地址是最小的. 满栈就是用栈过程中对地址的操作不能超过SP所以你很少在计算过程中看到 把sp-4地址中的值给某个寄存器 除非是特别的指令否则不可能有这样的指令.
第二: sub sp sp #8 和 add sp sp #8 是成对出现的这就跟申请内存释放内存的道理一样这是内核对任务的运行栈管理方式一样用多少申请多少用完释放.空间大小就是栈帧这是栈帧的本质含义.
第三: push {r11 lr} 和 pop {r11 lr} 也是成对出现的主要是用于函数调用例如 A - B B要保存A的栈帧范围和指令位置 lr保存是是A函数执行到哪个指令的位置 r11干了fp的工作其实就是指向 A的栈顶位置如此B执行完后return回A的时候先mov pclr 内核就知道改执行A的哪条指令了同时又知道了A的栈顶位置.
第四: 频繁出现的R0寄存器的作用用于传参和返回值 A调用B之前假如有两个参数就把参数给r0 r1记录充当了A的变量 到了B中后先让 r0r1入栈目的是保存参数值 因为 B中要用r0r1 他们变成B的变量用了. 返回值都是默认统一给r0保存. B中将返回值给r0回到A中取出R0值对A来说这就是B的返回值.
这是以上为汇编代码的分析追问两个问题
第一:如果是可变参数怎么办? 100个参数怎么整 通过寄存器总共就12个不够传参啊 第二:返回值可以有多个吗?
也为了积极培养鸿蒙生态人才让大家都能学习到鸿蒙开发最新的技术针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群整理了一套纯血版鸿蒙HarmonyOS Next全栈开发技术的学习路线。大家可以进行参考学习https://qr21.cn/FV7h05 ①全方位更合理的学习路径 路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块六大实战项目贯穿始终由浅入深层层递进深入理解鸿蒙开发原理 ②多层次更多的鸿蒙原生应用 路线图将包含完全基于鸿蒙内核开发的应用比如一次开发多端部署、自由流转、元服务、端云一体化等多方位的学习内容让学生能够高效掌握鸿蒙开发少走弯路真正理解并应用鸿蒙的核心技术和理念。 ③实战化更贴合企业需求的技术点 学习路线图中的每一个技术点都能够紧贴企业需求经过多次真实实践每一个知识点、每一个项目都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果注重对学生的细致教学每一步都确保学生能够真正理解和掌握。 为了能让大家更好的学习鸿蒙HarmonyOS NEXT开发技术这边特意整理了《鸿蒙开发学习手册》共计890页希望对大家有所帮助https://qr21.cn/FV7h05
《鸿蒙开发学习手册》https://qr21.cn/FV7h05
如何快速入门
基本概念构建第一个ArkTS应用…… 开发基础知识https://qr21.cn/FV7h05
应用基础知识配置文件应用数据管理应用安全管理应用隐私保护三方应用调用管控机制资源分类与访问学习ArkTS语言…… 基于ArkTS 开发https://qr21.cn/FV7h05
Ability开发UI开发公共事件与通知窗口管理媒体安全网络与链接电话服务数据管理后台任务(Background Task)管理设备管理设备使用信息统计DFX国际化开发折叠屏系列…… 鸿蒙开发面试真题含参考答案https://qr21.cn/FV7h05 大厂鸿蒙面试题https://qr18.cn/F781PH 鸿蒙开发面试大盘集篇共计319页https://qr18.cn/F781PH
1.项目开发必备面试题 2.性能优化方向 3.架构方向 4.鸿蒙开发系统底层方向 5.鸿蒙音视频开发方向 6.鸿蒙车载开发方向 7.鸿蒙南向开发方向