跳转指令
在ARM处理器中有两种方式可以实现程序流程的跳转:
- 使用专门的跳转指令
- 直接向程序计数器PC写入跳转地址值
通过向程序计数器PC写入跳转地址值,可以实现在4GB地址空间中的任意跳转,这种跳转指令称为长跳转。
在ARMv5版本以上的体系中,指令使用目标地址的bit[0]来确定程序的类型:
- bit[0]为1时,目标程序为Thumb指令
- bit[0]为0时,目标程序为ARM指令
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间内的跳转
助记符 指令功能描述 指令格式 b 跳转指令 b {<Cond>} <target_address> bl 带返回的跳转指令 bl {<Cond>} <target_address> bx 带返回状态的跳转指令 bx {<Cond>} <Rm> blx 带返回和状态切换的跳转指令 blx <target_address>
blx {<Cond>} <Rm>一旦遇到一个b指令,ARM处理器将立即跳转到给定的目标地址,并从那里继续执行。存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算。它是一个24位有符号数,左移两位后扩展为32位有符号数,表示的有效偏移为26位(前后32MB的地址空间)
使用bl指令跳转之前,会在寄存器r14中保存当前的PC内容。可以通过将r14的内容重新加载到PC中,来返回跳转指令之后的那个指令处执行
数据处理指令
助记符 | 指令功能描述 | 指令格式 |
---|---|---|
mov | 数据传送指令 | mov {<Cond>}{S} <Rd>, <shifter_operand> |
mvn | 数据取反传送指令 | mvn {<Cond>}<S> <Rd>, <shifter_operand> |
mov指令将立即数或者寄存器传送到目的寄存器
mvn指令将立即数或者寄存器按位取反后,传送到目的寄存器
比较指令
比较指令不保存运算结果,只更新CPSR中相应的条件标志位
助记符 | 指令功能描述 | 指令格式 |
---|---|---|
cmp | 比较指令 | cmp {<Cond>} <Rn>, <shifter_operand> |
cmn | 负数比较指令 | cmn {<Cond>} <Rn>, <shifter_operand> |
tst | 位测试指令 | tst {<Cond>} <Rn>, <shifter_operand> |
teq | 相等测试指令 | teq {<Cond>} <Rn>, <shifter_operand> |
1. CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更新条件标志位。标志位表示的是操作数1与操作数2的关系
2. CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位
3. TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置来特定的位
4. TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等