03 arm程序调用标准(APCS)



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"











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值