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

来源:互联网 发布:mac git 安装 编辑:程序博客网 时间:2024/06/01 21:56

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

  1. #include <stdio.h> 
  2. void f1() 
  3. void main() 
  4.   int d = 4; 
  5.   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