参考野火的程序:
; OSTCBCurPtr = OSTCBHighRdyPtr;
LDR R0, = OSTCBCurPtr ; 加载 OSTCBCurPtr 指针的地址到R0,这里LDR属于伪指令
分析:运行后R0=0x20000018=&OSTCBCurPtr
LDR R1, = OSTCBHighRdyPtr ; 加载 OSTCBHighRdyPtr 指针的地址到R1,这里LDR属于伪指令
分析:R1=0x2000001C=&OSTCBHighRdyPtr
LDR R2, [R1] ; 加载 OSTCBHighRdyPtr 指针到R2,这里LDR属于ARM指令
分析:R2=0x20000008=&Task1TCB=OSTCBHighRdyPtr
STR R2, [R0] ; 存储 OSTCBHighRdyPtr 到 OSTCBCurPtr
分析:OSTCBCurPtr=R2=0x20000008==OSTCBHighRdyPtr
LDR R0, [R2] ; 加载 OSTCBHighRdyPtr 到 R0
分析:R0 = 0x20000038 = OSTCBCurPtr->StkPtr = &Task1Stk[4] (初始化后剩余的栈顶地址)
LDMIA R0!, {R4-R11} ; 加载需要手动保存的信息到CPU寄存器R4-R11
分析:R0 = 0x20000058 = &Task1Stk[12] (加载R4-R11共8个寄存器,R0自动增加4*8=32;0x38+0x20=0x58)
MSR PSP, R0 ; 更新PSP的值,这个时候PSP指向下一个要执行的任务的堆栈的栈底(这个栈底已经加上刚刚手动加载到CPU寄存器R4-R11的偏移)
分析:PSP = 0x20000058