编程语言
首页 > 编程语言> > rtos - 汇编基础

rtos - 汇编基础

作者:互联网

  以一段简单的程序为例进行讲解:

1 int a = 0x123;
2 int32_t main(void)
3 {
4     volatile int b;
5     b = a;
6     return 0;
7 }

  相应的汇编代码:

1 0x00000420 B508      PUSH          {r3,lr}
2 0x00000422 4802      LDR           r0,[pc,#8]  ; @0x0000042C
3 0x00000424 6800      LDR           r0,[r0,#0x00]
4 0x00000426 9000      STR           r0,[sp,#0x00]
5 0x00000428 2000      MOVS          r0,#0x00
6 0x0000042A BD08      POP           {r3,pc}
7 0x0000042C 8004      DCW           0x8004
8 0x0000042E 1FFF      DCW           0x1FFF

 

1 0x00000420 B508      PUSH          {r3,lr}

  第一条PUSH指令执行之前,LR = 0x00000309,SP = 0x1FFF8408。PUSH执行完之后,SP = 0x1FFF8400,栈空间数据如下:

  

 

   R3入栈只是为了为局部变量b预留空间。

2 0x00000422 4802      LDR           r0,[pc,#8]  ; @0x0000042C

  从PC + 8的地址取数据,并写入R0,当前PC = 0x00000424,PC + 8 = [0x0000042C] = 0x1FFF8004,也就是变量a的地址,此时,r0 = 0x1FFF8004.

3 0x00000424 6800      LDR           r0,[r0,#0x00]

  从r0 + 0的地址里去变量a的数据,此时r0 = 0x123。

4 0x00000426 9000      STR           r0,[sp,#0x00]

  将r0的值写入当前sp指针指向的栈顶地址,此时栈空间如下:

  

5 0x00000428 2000      MOVS          r0,#0x00

  将0写入r0,作为返回值0。

6 0x0000042A BD08      POP           {r3,pc}

  将栈空间数据出栈,写入r3和PC寄存器。r3的数据不关心,将栈中保存的LR写入PC指针,就是跳转回LR寄存器的链接地址0x00000309继续执行。

 

  总结来说,以下几条汇编指令完成了大部分的程序执行。

1. 读内存:LDR dest, src
    LDR R0, [R1, #4]
2. 写内存:STR src, dest
    STR R0, [R1, #0]
3. 加减:ADD/SUB
    ADD R0, R1, R2
4. 比较:CMP R0, R1
5. 跳转:B(branch)、BL(branch and link,跳转并返回)
6. MOV:在Rx之间转移数据。
7. 入栈/出栈:PUSH、POP
    SP指向栈顶指针,入栈时先执行SP = SP + 4,然后将数据写入SP指针指向的地址;出栈时先将数据出栈,在执行SP = SP - 4。

标签:汇编,r0,0x00,r3,基础,SP,rtos,LDR,PC
来源: https://www.cnblogs.com/ivan0512/p/16119277.html