LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1175|回复: 7

问一下arm7的MSR指令

[复制链接]
发表于 2005-3-30 16:56:10 | 显示全部楼层 |阅读模式
我调试的时候

执行

MSR  CPSR R0

发现SP(R13)寄存器的值居然改变了。

这是怎么回事?
 楼主| 发表于 2005-3-30 17:06:40 | 显示全部楼层
测试代码如下
  1.                 mov         R13,#0x30
  2.                 STMFD SP!,{R0-R1}
  3.                 MRS                R0,CPSR
  4.                 MSR                CPSR,R0
  5.                 MVN                R1,#0xFF
  6.                 AND                R0,R0,R1
  7.                 ORR                R0,R0, #0xD3
  8.                 MSR                CPSR,R0
  9.                 LDMFD        SP!,{R0-R1}
复制代码

我在执行到ORR之前,各寄存器都正常。
在执行到第二个MSR的时候,SP的值就加了2,再执行LDMFD的时候,SP又加了8。
LR寄存器的值也有改变.

初学,请教熟悉arm的兄弟!谢了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 17:15:23 | 显示全部楼层
注.这样做是因为我用的这个汇编器不支持CPSR_c的写法,所以只好迂回一下.

上述程序的目的是把MCU设成SVC模式.并不影响R0,R1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 17:27:50 | 显示全部楼层
MSR     CPSR_c, #(NO_INT | SVC32_MODE)

我的问题就是,编译器不支持 cpsr_c的写法.

如何重新实现这条语句?
回复 支持 反对

使用道具 举报

发表于 2005-4-1 21:38:06 | 显示全部楼层
有点记不清了,手头也没书。
是不是因为不同的处理器模式有不同的sp物理寄存器?
回复 支持 反对

使用道具 举报

发表于 2005-4-4 11:04:45 | 显示全部楼层
CPSR_c的意思是指CPSR中的控制位,即低八位CPSR[7:0].
而在ARM处理器中只有MSR可以直接设置CPSR或SPSR的值.
回复 支持 反对

使用道具 举报

发表于 2005-4-13 20:56:45 | 显示全部楼层
在u-boot的源代码中找到了你要的答案,方法如下:

/* set the cpu to SVC32 mode */
mrs   r0, cpsr                  /* cpsr -> r0 */
bic   r0, r0, #0x1f              /* r0 AND 11100000 */
orr    r0, r0, #0x13             /* r0 OR 00010011 */
msr   cpsr, r0                  /* r0 -> cpsr */

要是想不影响r0和r1,换成r2就可以了.
回复 支持 反对

使用道具 举报

发表于 2005-4-15 12:54:57 | 显示全部楼层
是不是改变了CPU的模式,
而每个模式都有不同的stack,
所以 stack 也切换了, sp 也改变了?

我猜的,不是太清楚。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表