ARM 汇编中灵活的第二操作数(Flexible second operand)

灵活的第二操作数

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标志位。






























你可能感兴趣的:(ARM 汇编中灵活的第二操作数(Flexible second operand))