知方号

知方号

ARM汇编指令中灵活的第二操作数<汇编语言循环左移指令有哪些>

ARM汇编指令中灵活的第二操作数

许多A32和T32的一般数据处理具有灵活的第二操作数(Operand2)。比如下面MOV这条指令:MOV{S}{cond} Rd, Operand2

那么Operand2可以是什么。Operand2可以有下面两种形式:

常量(取值范围是受限的)寄存器(可以对其进行移位)Operand2是一个常量

Operand2作为常量的语法格式

语法格式:#constantconstant可以是一个表达式,其计算结果应为一个数值。

在A32指令中,constant可以通过对一个8位值的数旋转右移偶数个位(32位范围内的)来产生。

例子:mov r1,#0x00110000

如果是下面这样,armasm编译器会报错,不能用0-255和一个旋转来表示mov r1,#0x00110011

对T32指令则有所不同,有下面四种方式可用的constant:

形如0x00XY00XY的常量形如0xXY00XY00的常量形如0xXYXYXYXY的常量对一个8位值左移任意个位数(32位范围内的)

备注:其中X和Y代表的是16进制的数字。当然有少数的指令能拥有的值的范围比这更广。

当Operand2和MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ/TST这些指令一起使用时,如果常量的值大于255并且可以通过移位一个8位值来产生的话,进位标志会被更新为常量的bit[31]。当然如果常量是其他值的话,则不会对进位标志造成影响。

指令替代如果Operand2并不是上面讨论的有效值,但是它的逻辑反或者逻辑负是上面讨论的有效值的话,则汇编器会根据该指令产生一条等效的指令,对该变量取反或者取负。

比如对下面这条指令CMP Rd, #0xFFFFFFFE

汇编器可能会产生一条等效的指令如下:CMN Rd, #0x2你可以通过把反汇编代码和源码进行比较来确认这一点。

Operand2是一个带可选移位的寄存器

语法格式:Rm {, shift}Rm保存着第二个操作数的数据。shift是可选的,基于常量或者寄存器控制的移位位数,其格式如下:

ASR #n; 1 ≤ n ≤ 32LSL #n; 1 ≤ n ≤ 31LSR #n; 1 ≤ n ≤ 32ROR #n; 1 ≤ n ≤ 31-;等价于LSL #0表示不移位RRXtype Rs; type是ASR, LSL, LSR, ROR中的一个。Rs只用到Rs最低的那个字节来提供移位位数。

备注:type Rs格式只支持A32的指令集。同时移位完的结果并不会写回Rm。对某些指令对寄存器进行移位操作可能会更新进位标志(carry flag)。

移位操作

上面介绍了Operand2的移位操作,Operand2是嵌于指令进行使用的。当然移位操作也有单独的指令进行直接移位操作比如ASR, LSR, LSL, ROR, RRX等这些单独指令。这两种移位操作的效果是一样的,下面分别对这5种移位操作进行介绍。

ASR

ASR(Arithmetic shift right),算术右移或者可以说是带符号位的右移(符号位是bit[31])。ASR #n操作可以对寄存器的内容进行算术右移n位,左边被移走的n位用寄存器的符号位bit[31]进行填充,如图13-1。

不管是单独的ASRS指令或者和Operand2(ASR #n)进行配合使用的MOVS, MVNS, ANDS,ORRS, ORNS, EORS, BICS, TEQ , TST这些指令,进位标志会根据寄存器Rm最后一位被移除掉的位的值bit[n-1]进行更新。比如下面ASR #3的移位示意图,bit[2]被更新到进位标志中。

image.png

备注:当32 > 3

LSR

LSR(Logical shift right),逻辑右移或者说是无符号的右移。LSR #n操作可以对寄存器的内容进行逻辑右移n位,左边被移走的n位全部被清零,如图13-2。

不管是单独的LSRS指令或者和Operand2(LSR #n)进行配合使用的MOVS, MVNS, ANDS,ORRS, ORNS, EORS, BICS, TEQ , TST这些指令,进位标志会根据寄存器Rm最后一位被移除掉的位的值bit[n-1]进行更新。比如下面LSR #3的移位示意图,bit[2]被更新到进位标志中。

image.png

备注:当33 3

LSL

LSL(Logical shift left),逻辑左移。LSL #n操作可以对寄存器的内容进行逻辑左移n位,右边被移走的n位全部被清零,如图13-3。

不管是单独的LSLS指令或者和Operand2(LSL #n)进行配合使用的MOVS, MVNS,ANDS, ORRS, ORNS, EORS, BICS, TEQ, TST这些指令,进位标志会根据寄存器Rm最后一位被移除掉的位的值bit[32-n]进行更新。比如下面LSL #3的移位示意图,bit[29]被更新到进位标志中。

image.png

备注:当33

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。