rtos - 汇编基础
2022/4/8 20:19:57
本文主要是介绍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 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。
这篇关于rtos - 汇编基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南