ARM上函数调用参数超过四个的时传递方法

众所周知,ARM架构下,函数参数是通过 r0~r4寄存器传递的;但是如果参数超过四个,就要借助于栈了。

下面以一个例子说明。

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. int func(int a1, int a2, int a3, int a4, int a5, int a6)  
  2. {  
  3.     return a1 + a2 + a3 + a4 + a5;  
  4. }  
  5.   
  6. int main(void)  
  7. {  
  8.     func(1, 2, 3, 4, 5, 6);  
  9.     return 0;  
  10. }  
main()的汇编如下:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. 0x00010418 <+0>:  push    {r11, lr}  
  2. 0x0001041c <+4>:  add r11, sp, #4  
  3. 0x00010420 <+8>:  sub sp, sp, #8  
  4. 0x00010424 <+12>: mov r3, #5  
  5. 0x00010428 <+16>: str r3, [sp]  
  6. 0x0001042c <+20>: mov r3, #6  
  7. 0x00010430 <+24>: str r3, [sp, #4]  
  8. 0x00010434 <+28>: mov r0, #1  
  9. 0x00010438 <+32>: mov r1, #2  
  10. 0x0001043c <+36>: mov r2, #3  
  11. 0x00010440 <+40>: mov r3, #4  
  12. -> 0x00010444 <+44>:   bl  0x103c8 <func>  
  13. 0x00010448 <+48>: mov r3, #0  
  14. 0x0001044c <+52>: mov r0, r3  
  15. 0x00010450 <+56>: sub sp, r11, #4  
  16. 0x00010454 <+60>: pop {r11, pc}  
这个时候(执行到箭头指向的位置),栈的状态如下:


函数 func的汇编如下:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. 0x000103c8 <+0>:  push    {r11}       ; (str r11, [sp, #-4]!)  
  2. 0x000103cc <+4>:  add r11, sp, #0  
  3. 0x000103d0 <+8>:  sub sp, sp, #20  
  4. 0x000103d4 <+12>: str r0, [r11, #-8]  
  5. 0x000103d8 <+16>: str r1, [r11, #-12]  
  6. 0x000103dc <+20>: str r2, [r11, #-16]  
  7. 0x000103e0 <+24>: str r3, [r11, #-20] ; 0xffffffec  
  8. 0x000103e4 <+28>: ldr r2, [r11, #-8]  
  9. 0x000103e8 <+32>: ldr r3, [r11, #-12]  
  10. 0x000103ec <+36>: add r2, r2, r3  
  11. 0x000103f0 <+40>: ldr r3, [r11, #-16]  
  12. 0x000103f4 <+44>: add r2, r2, r3  
  13. 0x000103f8 <+48>: ldr r3, [r11, #-20] ; 0xffffffec  
  14. -> 0x000103fc <+52>:   add r2, r2, r3  
  15. 0x00010400 <+56>: ldr r3, [r11, #4]  
  16. 0x00010404 <+60>: add r3, r2, r3  
  17. 0x00010408 <+64>: mov r0, r3  
  18. 0x0001040c <+68>: sub sp, r11, #0  
  19. 0x00010410 <+72>: pop {r11}       ; (ldr r11, [sp], #4)  
  20. 0x00010414 <+76>: bx  lr  

此时,栈状态如下:


[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. ldr r3, [r11, #4]  
上面这一句汇编代码就是从栈上取回保存的第5个参数的值。

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. (gdb) x /x $r11 + 4  
  2. 0xbefffcd0: 0x00000005  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值