ARM汇编MOVS指令影响CPSR和BX状态切换指令的问题

BeanMrx 2010-02-03 01:48:07
问题一:MOV是怎么影响CPSR的

问题二:求证对BX用最后一位标志状态切换的一点猜想
程序代码如下:
AREA EX,CODE,READONLY
ENTRY
MAIN ADR RO,THUMBCODE+1
BX RO

CODE16
THUMBCODE MOV R2,#1
MOV R3,#2
ADD R2,R2,R3
ADR R0,ARMCODE
BX RO

CODE32
ARMCODE MOV R4,#3
MOV R5,#4
ADD R4,R5,R3
B MAIN
END
本人有预先猜想求证
1.跳转是通过修改pc完成的,无论thumb和ARM地址的都是按照最少2的倍数递增的,因此地址最后一位一直为0,所以BX指令可以通过最后一位标示要跳转的是thumb还是ARM指令
例如ARM指令pc从8004到8008最后一位的二进制是0100到1000,thumb的8004到8006最后一位是0100到0110
这样想对吗?
2.如果我在thumb中直接通过一个B指令分支到一个ARM指令行会出现什么样的情况呢?

小弟新入分数比较少,请各位体谅
...全文
2227 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ndd987 2011-03-09
  • 打赏
  • 举报
回复
学习学习,对MOVS指令也是丈二和尚摸不着头脑
CarvenCao 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxzhg 的回复:]
执行MOVS,一定会影响N,Z,C标志
比如MOVS r0, #1,执行后r0=1
Z=!r0=0; 是否为0
N=r0>>31=0;符号位
C=!(r0 >= 0)=0;是否有进位

SPSR是进入内核态时,比如进入中断,对CPSR的备份(spsr=cpsr),退出内核态时,再恢复回来(cpsr=spsr)
[/Quote]

MOV如果指定了 S,则这些指令将:
1、根据结果来更新 N 和 Z 标记
2、在 Operand2 的计算过程中更新 C 标记
MOVS r0, #1都没指定Operand2的计算,怎么会影响 C 标志?
lxzhg 2010-02-05
  • 打赏
  • 举报
回复
请多关注国产ARM板级软件仿真器的发展:
http://blog.csdn.net/lxzhg/archive/2010/01/06/5142441.aspx
BeanMrx 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxzhg 的回复:]
执行MOVS,一定会影响N,Z,C标志
比如MOVS r0, #1,执行后r0=1
Z=!r0=0; 是否为0
N=r0>>31=0;符号位
C=!(r0 >= 0)=0;是否有进位

SPSR是进入内核态时,比如进入中断,对CPSR的备份(spsr=cpsr),退出内核态时,再恢复回来(cpsr=spsr)
[/Quote]



高手一出手就是不一样 感谢啦
lxzhg 2010-02-05
  • 打赏
  • 举报
回复
执行MOVS,一定会影响N,Z,C标志
比如MOVS r0, #1,执行后r0=1
Z=!r0=0; 是否为0
N=r0>>31=0;符号位
C=!(r0 >= 0)=0;是否有进位

SPSR是进入内核态时,比如进入中断,对CPSR的备份(spsr=cpsr),退出内核态时,再恢复回来(cpsr=spsr)
BeanMrx 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lxzhg 的回复:]
问题一:MOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr
      MOVS总是会影响CPSR, 包括N,Z,C标志位
        执行MOV pc, lr,可能会影响到T标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态)

问题二:在Thumb代码里不能使用B跳转到ARM代码,因为T标志不会切换,即使跳到ARM代码,
        也会按照Thumb方式来执行,BX是跳特殊指令,会根据目标寄存器地址来切换T标志。

本人是ARM板级仿真开发者,对于ARM/Thumb指令集运行原理比较了解,请多关注国产软件仿真的发展:
http://blog.csdn.net/lxzhg/archive/2010/01/06/5142441.aspx

[/Quote]

但是MOVS指令什么情况下给N、Z、C置什么值呢 SPSR是怎么确定的
BeanMrx 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dxw777 的回复:]
MOV 指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S
选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位
的值。
[/Quote]


但是MOVS指令什么情况下给N、Z、C置什么值呢 SPSR是怎么确定的
lxzhg 2010-02-03
  • 打赏
  • 举报
回复
问题一:MOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr
MOVS总是会影响CPSR, 包括N,Z,C标志位
执行MOV pc, lr,可能会影响到T标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态)

问题二:在Thumb代码里不能使用B跳转到ARM代码,因为T标志不会切换,即使跳到ARM代码,
也会按照Thumb方式来执行,BX是跳特殊指令,会根据目标寄存器地址来切换T标志。

本人是ARM板级仿真开发者,对于ARM/Thumb指令集运行原理比较了解,请多关注国产软件仿真的发展:
http://blog.csdn.net/lxzhg/archive/2010/01/06/5142441.aspx
dxw777 2010-02-03
  • 打赏
  • 举报
回复
MOV 指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S
选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位
的值。
BeanMrx 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arnold9009 的回复:]
1. 基本上可以这么理解
2. B指令不带状态切换,所以通过B从thumb跳转到arm指令的结果不确定,最大的可能是取指异常,也有可能碰巧解码出来是合法的thumb指令,执行结果就难说了。。。

[/Quote]


那么第一个问题MOV是怎么影响CPSR的呢
Arnold9009 2010-02-03
  • 打赏
  • 举报
回复
1. 基本上可以这么理解
2. B指令不带状态切换,所以通过B从thumb跳转到arm指令的结果不确定,最大的可能是取指异常,也有可能碰巧解码出来是合法的thumb指令,执行结果就难说了。。。

21,619

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧