LM3S8962 ASM问题求助

2019-03-24 16:14发布

LM3S8962,
ASM问题求助
为什么以下代码可以正常运行:
OSIntCtxSw
PUSH {R4, R5}
LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception
LDR R5, =NVIC_PENDSVSET
STR R5, [R4]
POP {R4, R5}
BX LR
NOP


但如果改为以下就出错:
OSIntCtxSw
PUSH {LR}
PUSH {R4, R5}
LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception
LDR R5, =NVIC_PENDSVSET
STR R5, [R4]
POP {R4, R5}
POP {LR} // 只要对LR 进行写操作就会出错
BX LR
NOP

只要对LR 进行写操作就会出错,请问是什么原因? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
shilaike
2019-03-25 18:22
LZ没有明白我的意思,可能我表示有点模糊了。
我的意思是,无论LZ你是否执行PUSH或者是POP LR寄存器。硬件实现上还是会自动执行PUSH LR一次,返回时硬件自动实现POP LR一次。这样肯定会冲突的,因为入栈与出栈都是自动实现,无论你是否进行用户操作它都必须执行,比如LZ下面的POP LR吧,你是用户执行,在你操作这句的时候,硬件是没有自动实现POP的。但是你却执行了,你让硬件去执行什么喃?但近于规则,它还是会到堆栈中去找,即使POP到了一个数据到LR中,明显不是正确的地址。。。LZ认为这样可不会出错吗??

一周热门 更多>

相关问题

    相关文章