从最简单的实例学习ARM指令集

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. #include <stdio.h> 
  2. void f1() 
  3. void main() 
  4.   int d = 4; 
  5.   f1(); 
#include <stdio.h>
void f1()
{
}
void main()
{
  int d = 4;
  f1();
}

      然后编译:arm-linux-gnueabihf-gcc test.c -o test4

      然后看看汇编代码:

0000835c <f1>:
1    835c:       b480            push    {r7}
2    835e:       af00            add     r7, sp, #0
3    8360:       46bd            mov     sp, r7
4    8362:       bc80            pop     {r7}

直接跳到main函数里调用此函数时保存的LR值:
5    8364:       4770            bx      lr
6    8366:       bf00            nop

00008368 <main>:

程序用到了r7寄存器,所以需要保护以免破坏之前的数据,同时因为本函数调用子函数f1,需要用到lr寄存器保存返回值,故需要保存LR到栈里:


7    8368:       b580            push    {r7, lr}
8    836a:       b082            sub     sp, #8
9    836c:       af00            add     r7, sp, #0
10    836e:       f04f 0304       mov.w   r3, #4
11    8372:       607b            str     r3, [r7, #4]

跳转到函数f1的地址,同时把返回地址保存到LR寄存器:
12    8374:       f7ff fff2       bl      835c <f1>
13    8378:       f107 0708       add.w   r7, r7, #8
14    837c:       46bd            mov     sp, r7

直接把第7行保存的LR值弹到PC寄存器上,下一条取地址指令就是取main函数的下一个地址:
15   837e:       bd80            pop     {r7, pc}

       汇编代码8-11是与从最简单的实例学习ARM 指令集(一)的范例test1.c一模一样。f1函数十分简单,相信大家都能看懂。

       下一篇讲讲参数的传递。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值