APCS(arm procedure call standard) arm程序(不管什么语言)的调用标准。 也就是返回值,参数怎么传递。怎样返回调用函数的位置等的一套标准做法.
1). PC寄存器是存放从哪个内存地址上取指令.
程序执行其实一条条的指令进行取指,译码,执行.
程序里调用一个函数,需要等这个被调用的函数主动返回才可以接着执行,而且被调用的函数的返回地址得刚好为调用函数的下一条指令的地址.
如:
指令A
b myfunc //当myfunc函数执行完毕返回时, 需要让"pc = 指令B地址"才可以让程序接着执行.
指令B
但在写myfunc函数时,我们根本无法确定是什么时候,哪条指令后被调用,也无法确定返回的地址.所以必须得由调用者在调用此函数时准备好返回的地址,以便myfunc执行完时可返回到正确的地址接着执行.
调用者必须给被调用者准备返回地址,此返回地址按APCS的标准是放在寄存器r14(lr), 被调用执行完成后,只要根据lr寄存里存放的地址返回即可(mov pc, lr).
返回值按标准是存放在r0, 必须在返回前准备好返回值.
函数A ---> 调用函数B
函数B里 ---> 调用函数C
函数A调用函数B时需准备返回地址在lr寄存器里, 函数B调用函数C时又得准备返回地址,
一个工作模式下只有一个lr寄存器,这种情况可以先把lr寄存器里的地址压栈再改变lr寄存器里的地址,以便函数C返回.
2). 传参数.
调用函数时,传的参数从r0寄存器开始存放第1个参数, 直到r3寄存器存放第4个参数. 如还有参数则放入栈里.
被调用的函数会自动从栈里取超出的参数.
/////////////////////////////////
16. mov lr, pc
17. b myfunc
18. nop
取指 --> 译码 ---> 执行
16 x x
17 16 x
18 17 16 //当16行指令执行时, pc存放的是18指令的地址
//////////////////////////////////
bl myfunc // 就是先"mov lr, pc"再"b myfunc"
03 arm程序调用标准(APCS)
最新推荐文章于 2022-04-30 20:54:39 发布