灵活的第二操作数
10.3 Flexible second operand (Operand2)
许多ARM和Thumb通用数据处理指令都有一个灵活的第二操作数。在指令的语法格式描述中这个灵活的第二操作数被表示为符号 Operand2。
Operand2可以是下列两种形式中的任意一种:
* 一个数字常量
* 一个带位移的寄存器
数字常量形式的第二操作数
10.4 Syntax of Operand2 as a constant
ARM指令中常量形式的第二操作数是一个有着数字值限制的数。
语法形式:
#constant
constant是一个数字表达式
用法说明:
在ARM指令中,constant可以是任意一个通过8位数字循环位移0到32中任意偶数位后得到的32位数字值。
在Thumb指令中,constant可以是下列形式中的任意一种:
* 任意一个通过左移一个8位数字值得到的一个32位数字,且左移的位数必须在0到32位之间。
* 任意一个形如 0x00XY00XY、0xXY00XY00 或 0xXYXYXYXY的数字,其中的X,Y是都是一个十六进制数字值。
例外情况:有一小些指令中的错constant的取值可以超出上述规定,具体说明请看具体指令的说明。
特殊说明:当constant和指令MOVS、MVNS、ANDS、ORRS、EORS、BICS、TEQ及TST一起使用时,如果常量大于255,且可以由一
个8位数通过移位得到,那么 状态寄存器中的C位被更新为常量的第31位的值。如果常量是其他常量,则标志位C不受影响。
指令替换:如果常量不符合格式要求,但是其逻辑取反或逻辑否定值符合常量格式要求,那么汇编器就会产生使用逻辑取反或否则形式的等价指令。
例如汇编器汇编时会把指令CMP Rd,#FFFFFFFE 替换为等价指令 CMN Rd,#02。
当对比反汇编指令和汇编源码时,一定要注意到这一点。
你可以使用汇编器命令行选项 --diag_warning 1645 来检查命令替换什么时候发生。
带可选移位的寄存器第二操作数语法格式
10.5 Syntax of Operand2 as a register with optional shift
当你在指令中使用寄存器作为第二个操作数时,这个寄存器可以带有移位操作
语法格式:
Rm {,shift }
Rm是保存第二操作数的寄存器
shift是将应用到Rm上的常量位移值或寄存器控制位移。shift的形式有如下6种:
ASR #n
1 <= n <=32, 算术右移n位
LSR #n
1 <= n <=31, 逻辑左移n位
LSR #n
1 <= n <=32, 逻辑右移n位
ROR #n
1 <= n <=31, 循环右移n位
RRX
循环右移1位,带状态标志位C扩展
type Rs
寄存器控制移位,仅在ARM指令中可用
* type 可取值为 ASR、LSL、LSR、ROR
* 提供位移量的寄存器,仅最低字节中的值有效
* shit如果被省略,寄存器Rm中的值不发生移位,等价于LSR #0
用法说明:
如果指定了shift,那么Rm中的值就会被进行移位操作,移位的结果被指令使用,但是Rm中的值不变化。
在某些指令中使用shift会更新状态寄存器中的C标志位。