4.4数据处理指令
指令只有在条件满足时才会执行,图10显示指令编码。
指令在两个或一个操作数之间执行指定的算术或逻辑运算,第一个操作数一般为寄存器(Rn),第二个操作数根据指令I位的值,可以是可移位寄存器,也可以是循环的8位立即数。根据指令中的S位,CPSR中的条件代码可以被保留或者更新(依据指令执行的结果)。一些操作
(TST,TEQ,CMP,CMN)不会写结果到Rd寄存器中,它们只是用于测试,并根据指令执行结果设置条件代码,并且s位总是置’1’。这些指令和执行结果在表4中列出。
312827262524212000IS条件代码操作码19RN1615RD1211操作数目标寄存器寄存器操作数0设置条件代码0=不改变条件代码1=设置条件代码操作代码0000=AND-Rd:=Op1ANDOp20010=SUB-Rd:=Op1-Op20011=RSB-Rd:=Op2-Op10100=ADD-Rd:=Op1+Op20101=ADC-Rd:=Op1+Op2+C0110=SBC-Rd:=Op1-Op2+C0111=RSC-Rd:=Op2-Op1+C1000=TST–设置条件代码,根据Op1ANDOp21001=TEQ-设置条件代码,根据Op1EOROp21010=CMP-设置条件代码,根据Op1-Op21011=CMN-设置条件代码,根据Op1+Op21100=ORR-Rd:=Op1OROp21101=MOV-Rd:=Op21110=BIC-Rd:=Op1ANDNOTOp21111=MVN-Rd:=NOTOp2立即操作数0=操作数2为寄存器SHIFTRM位移量第二个操作数寄存器1=操作数2为立即数Rotate立即数表10数据处理指令位移量无符号8位立即数26
This file is generated by AlienTools PDF Generator, unregister version
????μμóé Foxit Reader ±à?-4.4.1CPSR标志位
°?è¨??óD ·-°?2?????1??à1à?£
数据处理操作可以归纳为逻辑和算术运算,逻辑运算
(AND,EOR,TST,TEQ,ORR,MOV,BIC,MVN)对操作数相应的位或者整个操作数进行逻辑运算,如果S位置’1’(Rd不是R15),CPSR中的标志位V不会受影响,C标志位为桶形移位器的进位输出(或者保持不变,执行指令LSL#0),当且仅当执行结果所有的位为0,Z标志被置1,N标志为运算结果的第31位。指令操作码AND0000操作数1与操作数2EOR0001操作数1EOR与操作数2SUB0010操作数1-与操作数2RSB0011操作数2-与操作数1ADD0100操作数1+与操作数2ADC0101操作数1+与操作数2+进位SBC0110操作数1-与操作数2+进位-1RSC0111操作数2-与操作数1+进位-1TST1000和AND操作相似,结果不写入TEQ1001和EOR操作相似,结果不写入CMP1010和SUB操作相似,结果不写入CMN1011和ADD操作相似,结果不写入ORR1100操作数一或操作数2MOV1101操作数2(操作数一被忽略)
BIC1110操作数一与操作数2的非(BITCLEAR)MVN
1111
操作数2取反(操作数一被忽略)表4:ARM数据处理指令
ARM算术运算指令(SUB,RSB,ADD,ADC,SBC,RSC,CMP,CMN)将每一个操作数当作32位的整数(有符号和无符号结果一样)。如果S位置1(且Rd不是R15),运算结果的第31位有溢出产生,则CPSR中的V标志位将会被置1,如果两个操作数为无符号数,则可以忽略,但如果操作数为有符号数,编译器会报出可能产当两个操作数都为无符号数生错误的警告。C标志位为ALU运算结果的第31的进位输出,当且仅当执行结果的所有位为0,Z标志被置1,N标志为运算结果的第31位(如果操作数为有符号数,表明运算结果为负数)。
27
This file is generated by AlienTools PDF Generator, unregi
4.4.2移位
如果第二个操作数指定为可移位寄存器,桶形移位器的操作由指令中的移位区域控制。此区域说明了被执行的移位操作的类型(逻辑左或右,算术右或循环右)。寄存器的位移量在指令的立即数区表明,或者是另一寄存器(不包含R15)的低字节,图11显示了不同类型移位的编码。1176504移位类型00=逻辑左01=逻辑右10=数学右11=循环右
位移量11Rs876541移位寄存器位移量在Rs的低字节指定移位类型00=逻辑左01=逻辑右10=数学右11=循环右指令指定的位移量
图11ARM移位操作
当位移量在指令中指定,它包含5位,可以是从0到31的任意数。逻辑左移(LSL)将Rm中的数值左移指定的位数,右边空位补0,左边丢掉多余的位,最后一位将要被丢掉的位为移位寄存器的进位输出,当ALU操作为逻辑类型时,输出位被锁存到CPSR寄存器的C标志。例:LSL#5的运行结果在图12中显示。
图12:逻辑左移
注意:LSL#0是一种特殊情况,移位寄存器的进位输出是CPSR中原有的C标志,Rm中的值直接作为第二操作数。
逻辑右移指令也如此,只是寄存器Rm中的值向右移,LSR#5运行结果如图13。
28
This file is generated by AlienTools PDF Generator, unregister version
LSR#32移位区域的格式同LSR#0一样(结果为0,Rm的31位作为进位输出)。逻辑右移0位和逻辑左移0一样是多余的指令,编译器将LSR#0(ASR#0,ROR#0)当作LSL#0,允许操作LSR#32。
算术右移(ASR)同逻辑右移相似,只是是高位将由Rm的第31位填补而不是0,这样就保持符号位不变。例:ASR#5的运行结果在图14显示。
算术右移
ASR#0移位区域的格式同样用于ASR#32,Rm的31位用于进位输出,操作数2的每一位等于Rm的第31位,结果根据Rm31位为全0或全1。
循环右移操作将逻辑右移操作中废弃的位重新应用,放到左边最高位。ROR#5运行结果如图15。
29
This file is generated by AlienTools PDF Generator, unregister version
图15:循环右移
ROR#0的移位区域的格式用于编码桶形移位器的特殊功能,带扩展的循环右移(RRX)。它将CPRS的C标志位当作最高位,和Rm中的值组成一个33位的操作数。
寄存器指定的位移量
Rs寄存器的最低字节指定了位移量,Rs为任意通用寄存器(不包含R15)。
如果此字节为0,Rm中的内容将毫无改变地应用到第二个操作数,CPSR中原来的C标志值作为移位寄存器的进位输出。
如果这个字节的值在0到31之间,移位结果将同指令指定位移量(相同的移位操作,相同的位移量)的操作结果一样。
如果这个值为32或者更大的数,结果为上面描述的移位操作的逻辑扩展:(1)(2)(3)(4)(5)(6)(7)
LSL#32结果为0,进位输出为Rm的最低位。LSL#大于32的值,结果为0,进位输出为0。LSR#32结果为0,进位输出为Rm的最高位。LSR#大于32,结果为0,进位输出为0。
ASR大于等于32,结果和进位输出为都为Rm的最高位。ROR#32结果为Rm,进位输出为Rm的最高位。
ROR#n,结果将同ROR#n-32一样,重复地减去32,直到操作数结果在32同0之间,运算结果同ROR#m相同,m=n-x32(0 要注意在寄存器控制位移的指令中,指令第7位为0时非常必要的,如果为1,将导致指令为乘法或者为无定义指令。 30 This file is generated by AlienTools PDF Generator, unregister version