高级会员

- 积分
- 593
- 金钱
- 593
- 注册时间
- 2015-4-14
- 在线时间
- 47 小时
|
20金钱
本帖最后由 坏男孩 于 2018-6-26 08:11 编辑
[mw_shl_code=asm,true]PendSV_Handler
CPSID I
MRS R0, PSP
CBZ R0, PendSV_Handler_Nosave
TST R14, #0x10
IT EQ
VSTMDBEQ R0!, {S16-S31}
SUBS R0, R0, #0x20
STM R0, {R4-R11}
LDR R1, =OSTCBCur
LDR R1, [R1]
STR R0, [R1]
PendSV_Handler_Nosave
PUSH {R14}
LDR R0, =OSTaskSwHook
BLX R0
POP {R14}
LDR R0, =OSPrioCur
LDR R1, =OSPrioHighRdy
LDRB R2, [R1]
STRB R2, [R0]
LDR R0, =OSTCBCur
LDR R1, =OSTCBHighRdy
LDR R2, [R1]
STR R2, [R0]
LDR R0, [R2]
LDM R0, {R4-R11}
ADDS R0, R0, #0x20
TST R14, #0x10
IT EQ
VLDMIAEQ R0!, {S16-S31}
MSR PSP, R0
ORR LR, LR, #0x04
CPSIE I
BX LR
NOP
end [/mw_shl_code]
其中第11 12行部分
SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack
STM R0, {R4-R11}
这两行百思不得其解,大神给指点下
R0此时指向SP,R0自减0x20,就是SP自减0x20,为啥是这个数值,可否解释一下,还有就是STM指令解释下用法,手册中的都是STMIA,STMDM,啥的,没有纯粹的STM的用法
|
最佳答案
查看完整内容[请看2#楼]
这个问题最终自己解决了,也许这就是学习的过程吧,自己提问,然后自己解答
SUBS R0, R0, #0x20
这行代码表示R0保存的地址(SP)减去0x20(32),地址为啥呀减去32呢,SP是堆栈栈顶指针,SP减去32就是4*8,这里内存的地址是4个字节间隔访问的,应该是32位的缘故吧,因此也就是SP减去了8个内存的单元,为啥呢?因为马上要手动存储CPU的寄存器R4-R11了,STM R0, {R4-R11} ;保存剩余的R4-R11寄存器
从上面的指令看是先存储R4, ...
|