笔者来聊聊ARM的函数的调用规则
笔者来聊聊ARM的函数的调用规则
+ 程序处理、内存以及栈 一个程序的内存通常会划分为几部分:Code、read-only static data、writeable static data、heap and stack,Code段里面会包括read-only static data,DATA段会包括初始化好的全局变量,BSS包括堆栈以及未初始化和初始化为0的全局变量 + stack 临时存储变量以及传递额外的参数(程序调用时寄存器数量不足), + 栈有范围限制,Limit < SP < Base + 其次必须4 byte对齐, + 程序必须访问栈的部分范围内区域(SP ,base-1),不能访问之外的区域,
+ 子程序调用 - BL指令会跳到目标程序,并且修改LR为当前PC的按顺序下一条指令地址,指的是没跳转之前的PC的下一条。 - 需要注意修改LR最低位表示当前为什么状态,,0:是arm状态,无需修改(因为地址都是word 2Byte对齐的),1:是thumb状态,需要修改,
可以看到R14以及PC的值都是奇数,代表是thumb指令。
R15(PC):0x0801247E 位于 DMA_GetFlagStatus,R14:0x08014ECB 位于 UART1_SentMsgL,保存了其返回的地址。 - 返回值 + R0:返回值是D-Word(32 bit),或者是单精度浮点型float, + R0-R1:返回值是Q-Word(64 bit),或者双精度浮点型double + R0-R3:返回值是128bit的向量
调用GetSysTime之后,r0则获取到值,然后r1计算好之后,则cmp进行比较r0,r1. - 参数传递 + R0-R3 和栈进行传递 + 参数少的函数,只用寄存器就可以了,减少访问内存带来的负载 + 优先寄存器,然后栈,寄存器从小到大,栈地址从小到大。 1、函数声明:void OLED_DrawBMP_test(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[],unsigned char state1,unsigned char state2); 2、共用7个参数:x0,y0,x1,y1,BMP[],state1,state2 3、前四个参数都分别存储在r0-r3, 4、后面三个参数存储在栈中,strd r7,r6,[r13] 以及str r6,[r13,#0x8] ,前面指令存储r7 r6 两个参数,后面地址偏移8之后,又存储一个参数,总计三个参数,存储顺序依次都是参数从左向右去存储。 5、不符合__cdecl、__stdcall、__fastcall这三种调用标准。
- 内部联合工作(ARM与Thumb指令) + 子程序调用和程序返回支持两张状态切换。bx或者blx都可以切换状态。### 2.2、ARM64## 参考文档 1、ARM Procedure Call Standard 2、Procedure Call Standard for the ARM 64-bit Architecture (AArch64)本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378853.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!