4204|7

45

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LM3S8962 ASM问题求助 [复制链接]

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 进行写操作就会出错,请问是什么原因?

最新回复

LZ没有明白我的意思,可能我表示有点模糊了。 我的意思是,无论LZ你是否执行PUSH或者是POP LR寄存器。硬件实现上还是会自动执行PUSH LR一次,返回时硬件自动实现POP LR一次。这样肯定会冲突的,因为入栈与出栈都是自动实现,无论你是否进行用户操作它都必须执行,比如LZ下面的POP LR吧,你是用户执行,在你操作这句的时候,硬件是没有自动实现POP的。但是你却执行了,你让硬件去执行什么喃?但近于规则,它还是会到堆栈中去找,即使POP到了一个数据到LR中,明显不是正确的地址。。。LZ认为这样可不会出错吗??  详情 回复 发表于 2011-5-9 12:25
 
点赞 关注

回复
举报

918

帖子

0

TA的资源

纯净的硅(中级)

沙发
 

回复 楼主 qqatscau 的帖子

不太清楚哦,看看权威指南
 
 

回复

7172

帖子

195

TA的资源

五彩晶圆(高级)

板凳
 
看汇编就头疼我 哎
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

4
 
看了一下,貌似LZ没有对LR进行写操作,只是压站和出站的操作。
的CM3看,链接寄存器会自动入栈,自动出站。如果要操作的话,LZ应该将CPU工作模式改了。。。
    不知道上面的理解对不对。。。。。查查LR人使用手册。。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

45

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 shilaike 的帖子

POP   {LR}   就是对LR进行写操作。
请问应该怎样改CPU的工作模式?
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

6
 

回复 5楼 qqatscau 的帖子

对。。POP实际上就是执行了一次写操作。
对于LR寄存器,在ARM里面,它就只有一个用途,当函数(或异常)返回时,将它里面的值送到PC。这也是它的唯一的用法,假如我们现在从0x10000000这个地址进入一个异常,此时硬件会自动将这个地址复制到LR中,再PUSH入栈保存。当异常返回主调用异常点时,会POP这个值到LR中,到将LR中的值送到PC。但是我们要知道,程序实现函数调用或进入异常的这断点地址是我们无法预知的,如果我们强行操作,会引起无法预知的结果。因为我们不可能知道这个断点地址到底是多少,上面程序会出错,以我个人观点就是,硬件已经默认执行了一次POP,也就是将断点地址释放到了LR中,如果我们再来一次POP,就是将下一个栈地址中的数据放到了LR中,再将LR送到了PC。这样肯定就不能回到原断点地址。程序当然无法执行。。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

45

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 shilaike 的帖子

POP 之前我已PUSH一次,不存在“就是将下一个栈地址中的数据放到了LR中”的问题。

在该例子中,PUSH/POP 从R0到R12中的任意一个或若干个寄存器都没有出错,但只要POP列表中有LR就会出错。实在想不明白。
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

8
 

回复 7楼 qqatscau 的帖子

LZ没有明白我的意思,可能我表示有点模糊了。
我的意思是,无论LZ你是否执行PUSH或者是POP LR寄存器。硬件实现上还是会自动执行PUSH LR一次,返回时硬件自动实现POP LR一次。这样肯定会冲突的,因为入栈与出栈都是自动实现,无论你是否进行用户操作它都必须执行,比如LZ下面的POP LR吧,你是用户执行,在你操作这句的时候,硬件是没有自动实现POP的。但是你却执行了,你让硬件去执行什么喃?但近于规则,它还是会到堆栈中去找,即使POP到了一个数据到LR中,明显不是正确的地址。。。LZ认为这样可不会出错吗??
 
个人签名只有想不到,没有做不到。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表