ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

rtos - 汇编基础

2022-04-08 19:00:43  阅读:208  来源: 互联网

标签:汇编 r0 0x00 r3 基础 SP rtos LDR PC


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有