本节介绍算术运算指令,包括加法指令、减法指令和乘法指令。
1.ADDS<Rd>,<Rn>,<Rm>
该指令将Rn寄存器的内容和Rm寄存器的内容相加,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.32所示。从该指令的机器码格式可知,寄存器Rm、Rn和Rd可用的范围为R0~R7。
图4.32 ADDS<Rd>,<Rn>,<Rm>指令的机器码格式
指令ADDS R0,R1,R2,其机器码为(1888) 16 。该指令将R1寄存器的内容和R2寄存器的内容相加,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
2.ADDS<Rd>,<Rn>,#imm3
该指令将Rn寄存器的内容和立即数imm3相加,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.33所示。从该指令的机器码格式可知,寄存器Rn和Rd可用的范围为R0~R7。
图4.33 ADDS<Rd>,<Rn>,#imm3指令的机器码格式
注: 图中imm3的范围为0~7。
指令ADDS R0,R1,#0x07,其机器码为(1DC8) 16 。该指令将R1寄存器的内容和立即数0x07相加,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
3.ADDS<Rd>,#imm8
该指令将Rd寄存器的内容和立即数imm8相加,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.34所示。从该指令的机器码格式可知,寄存器Rd可用的范围为R0~R7。
图4.34 ADDS<Rd>,#imm8指令的机器码格式
注: 图中imm8的范围为0~255。
指令ADDS R0,#0x01,其机器码为(3001) 16 。该指令将R0寄存器的内容和立即数0x01相加,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
4.ADD<Rd>,<Rm>
该指令将Rd寄存器的内容和Rn寄存器的内容相加,将结果保存在寄存器Rd中,不更新寄存器APSR中的标志,该汇编助记符指令的机器码格式如图4.35所示。从该指令的机器码格式可知,寄存器Rm可用的范围为R0~R15,DN与Rd组合后可用的范围为R0~R15。
图4.35 ADD<Rd>,<Rm>指令的机器码格式
指令ADD R0,R1,其机器码为(4408) 16 ,该指令将R0寄存器的内容和R1寄存器的内容相加,将结果保存在寄存器R0中,不更新寄存器APSR中的标志。
5.ADCS<Rd>,<Rm>
该指令将Rd寄存器的内容、Rm寄存器的内容和进位标志相加,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.36所示。从该指令的机器码格式可知,寄存器Rm和Rd可用的范围为R0~R7。
图4.36 ADCS<Rd>,<Rm>指令的机器码格式
指令ADCS R0,R1,其机器码为(4148) 16 。该寄存器将R0寄存器的内容、R1寄存器的内容和进位标志相加,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
6.ADD<Rd>,PC,#imm
该指令将PC寄存器的内容和立即数#imm相加,将结果保存在寄存器Rd中,不更新寄存器APSR中的标志。该汇编助记符指令的机器码格式与指令ADR <Rd>,<label>相同,如图4.37所示。
图4.37 ADR<Rd>,<label>指令的机器码格式
注: (1)在相加的时候,必须将PC寄存器的内容与字对齐,即Align(PC,4)。
(2)该汇编语言助记符指令中允许的立即数imm的范围为0~1020(10位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位(零扩展),然后得到该汇编指令中立即数在机器码中的编码格式为imm8,即为8位立即数。
(3)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm8<<2)。
指令ADD R0,PC,#0x04,该指令的机器码为(A001) 16 。该指令将PC寄存器的内容(字对齐)和立即数0x04相加,将结果保存在寄存器R0中,不更新寄存器APSR中的标志。
7.ADR<Rd>,<label>
该指令将PC寄存器的内容与标号所表示的偏移量进行相加,将结果保存在寄存器Rd中,不更新APSR中的标志。<label>为将地址加载到<Rd>中的指令或文字数据项的标号。汇编器计算从ADR指令的Align(PC,4)值到该标签的偏移量所需要的值。偏移量的允许值是0~1020范围内的整数(4的倍数)。
指令ADR R3,JumpTable,该指令将JumpTable的地址加载到寄存器R3中。
8.ADD(SP加立即数指令)
该类型指令有两个指令类型。
(1)ADD<Rd>,SP,#imm
该指令实现将堆栈指针SP的内容和立即数imm相加,相加的结果写到寄存器Rd中。该汇编助记符指令的机器码格式如图4.38所示。从该指令的机器码格式可知,寄存器Rd可用的范围为R0~R7。
图4.38 ADD<Rd>,SP,#imm指令的机器码格式
注: (1)imm8的含义同图4.37。
(2)该指令中imm的范围为0~1020,且imm为4的整数倍。
指令ADD R3,SP,#0x04,其机器码为(AB01) 16 ,该指令实现将堆栈指针SP的内容和立即数0x04相加,相加的结果写到寄存器R3中。
(2)ADD SP,SP,#imm
该指令实现将堆栈指针SP的内容和立即数imm相加,相加的结果写到堆栈指针中。该汇编助记符指令的机器码格式如图4.39所示。
图4.39 ADD SP,SP,#imm指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~508(9位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位(零扩展),然后得到该汇编指令中立即数在机器码中的编码格式为imm7,即为7位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm7<<2)。
指令ADD SP,SP,#08,其机器码为(B002) 16 ,该指令实现将堆栈指针SP的内容和立即数0x08相加,相加的结果写到堆栈指针SP中。
1.SUBS<Rd>,<Rn>,<Rm>
该指令将寄存器Rn的内容减去寄存器Rm的内容,将结果保存在Rd中,同时更新寄存器APSR寄存器中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.40所示。从该指令的机器码格式可知,寄存器Rm、Rn和Rd可用的范围为R0~R7。
图4.40 SUBS<Rd>,<Rn>,<Rm>指令的机器码格式
指令SUBS R0,R1,R2,其机器码为(1A88) 16 。该指令将寄存器R1的内容减去寄存器R2的内容,将结果保存在R0中,同时更新寄存器APSR寄存器中的标志。
2.SUBS<Rd>,<Rn>,#imm3
该指令将Rn寄存器的内容和立即数imm3相减,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.41所示。从该指令的机器码格式可知,寄存器Rn和Rd可用的范围为R0~R7。
图4.41 SUBS<Rd>,<Rn>,#imm3指令的机器码格式
注: imm3的范围为0~7。
指令SUBS R0,R1,#0x01,其机器码为(1E48) 16 。该指令将R1寄存器的内容和立即数0x01相减,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
3.SUBS<Rd>,#imm8
该指令将Rd寄存器的内容和立即数#imm8相减,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.42所示。从该指令的机器码格式可知,寄存器Rd可用的范围为R0~R7。
图4.42 SUBS<Rd>,#imm8指令的机器码格式
注: imm8的范围为0~255。
指令SUBS R0,#0x01,其机器码为(3801) 16 。该指令将R0寄存器的内容和立即数0x01相减,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
4.SBCS<Rd>,<Rm>
该指令将Rd寄存器的内容、Rm寄存器的内容和借位标志相减,将结果保存在寄存器Rd中,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.43所示。从该指令的机器码格式可知,寄存器Rd和Rm可用的范围为R0~R7。
图4.43 SBCS<Rd>,<Rm>指令的机器码格式
指令SBCS R0,R1,其机器码为(4188) 16 。该寄存器将R0寄存器的内容、R1寄存器的内容和借位标志相减,将结果保存在寄存器R0中,同时更新寄存器APSR中的标志。
5.RSBS<Rd>,<Rn>,#0
该指令用数字0减去寄存器Rn中的内容,将结果保存在寄存器Rd中,并且更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.44所示。从该指令的机器码格式可知,寄存器Rd和Rn可用的范围为R0~R7。
图4.44 RSBS<Rd>,<Rm>,#0指令的机器码格式
指令RSBS R0,R0,#0,其机器码为(4240) 16 。该指令用数字0减去寄存器R0中的内容,将结果保存在寄存器R0中,并且更新寄存器APSR中的标志。
6.SUB SP,SP,#imm
该指令将堆栈指针SP的内容减去立即数imm,将结果保存在堆栈指针SP中,该指令不影响APSR中的标志,该汇编助记符指令的机器码格式如图4.45所示。
图4.45 SUB SP,SP,#imm7指令的机器码格式
注: imm7的含义同图4.39。
指令SUB SP,SP,#0x18,其机器码为(B086) 16 ,该指令实现将堆栈指针SP的内容和立即数0x18相减,相减的结果写到堆栈指针SP中。
MULS<Rd>,<Rn>,<Rd>
该指令将寄存器Rn的内容和寄存器Rd的内容相乘,低32位结果保存在Rd寄存器中,同时更新寄存器APSR中的N和Z标志,但不影响C和V标志,该汇编助记符指令的机器码格式如图4.46所示。从该指令的机器码格式可知,寄存器Rd和Rn可用的范围为R0~R7。
图4.46 MULS<Rd>,<Rn>,<Rd>指令的机器码格式
指令MULS R0,R1,R0,其机器码为(4348) 16 。该指令将寄存器R1的内容和寄存器R0的内容相乘,将结果保存在R0寄存器中,同时更新寄存器APSR中的标志。
1.CMP<Rn>,<Rm>
该指令比较寄存器Rn和寄存器Rm的内容,得到(Rn)-(Rm)的结果,但不保存该结果,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.47所示。从该指令的机器码格式可知,寄存器Rn和Rm可用的范围为R0~R7。
图4.47 CMP<Rn>,<Rm>指令的机器码格式
指令CMP R0,R1,其机器码为(4288) 16 。该指令比较寄存器R0和寄存器R1的内容,得到(R0)-(R1)的结果,但不保存该结果,同时更新寄存器APSR中的标志。
2.CMP<Rn>,#imm8
该指令将寄存器Rn的内容和立即数#imm8进行比较,得到(Rn)-imm8的结果,但不保存该结果,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.48所示。从该指令的机器码格式可知,寄存器Rn可用的范围为R0~R7。
图4.48 CMP<Rn>,#imm8指令的机器码格式
注: 图中立即数imm8的范围为0~255,imm=0扩展到32位。
指令CMP R0,#0x01,其机器码为(2801) 16 。该指令将寄存器R0的内容和立即数0x01进行比较,得到(R0)-0x01的结果,但不保存该结果,同时更新寄存器APSR中的标志。
3.CMN<Rn>,<Rm>
该指令比较寄存器Rn的内容和对寄存器Rm取反后内容,得到(Rn)+(Rm)的结果,但不保存该结果,同时更新寄存器APSR中的N、Z、C和V标志,该汇编助记符指令的机器码格式如图4.49所示。从该指令的机器码格式可知,寄存器Rn和Rm可用的范围为R0~R7。
图4.49 CMN<Rn>,<Rm>指令的机器码格式
指令CMN R0,R1,其机器码为(42C8) 16 。该指令比较寄存器R0和对寄存器R1取反后的内容,得到(R0)+(R1)的结果,但不保存该结果,同时更新寄存器APSR中的标志。
思考与练习4.8:将保存在寄存器R0和R1内的64位整数,与保存在寄存器R2和R3内的64位整数相加,将结果保存在寄存器R0和R1中。使用ADDS和ADCS指令实现该64位整数相加功能。
思考与练习4.9:将保存在寄存器R1、R2和R3内的96位整数,与保存在寄存器R4、R5和R6内的96位整数相减,结果保存在寄存器R4、R5和R6中。使用SUBS和SBCS指令实现该96位整数相减功能。