设计一个简易的多任务 rtos 1 - 汇编基础
以一段简单的程序为例进行讲解:
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。