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-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行