本节介绍右移和左移操作指令,下面对这些指令进行详细介绍。
1.ASRS<Rd>,<Rm>
该指令执行算术右移操作。将保存在寄存器Rd中的数据向右移动Rm所指定的次数,移位的结果保存在寄存器Rd中,即Rd=Rd>>Rm。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。算术右移操作如图4.56(a)所示。
图4.56 算术和逻辑右移操作
该汇编助记符指令的机器码格式如图4.57所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.57 ASRS<Rd>,<Rm>指令的机器码格式
指令ASRS R0,R1,其机器码为(4108) 16 。该指令将保存在寄存器R0中的数据向右移动R1所指定的次数,移位的结果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
2.ASRS<Rd>,<Rm>,#imm
该指令执行算术右移操作。将保存在寄存器Rm中的数据向右移动立即数imm所指定的次数,移位的结果保存在寄存器Rd中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志,该汇编助记符指令的机器码格式如图4.58所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.58 ASRS<Rd>,<Rm>,#imm指令的机器码格式
注: (1)汇编指令中立即数imm的范围为1~32。
(2)当imm<32时,imm5=imm;当imm=32时,imm5=0。
指令ASRS R0,R1,#0x01,其机器码为(1048) 16 。该指令将保存在寄存器R1中的数据向右移动1次,移位的结果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
3.LSRS<Rd>,<Rm>
该指令执行逻辑右移操作。将保存在寄存器Rd中的数据向右移动Rm所指定的次数,移位的结果保存在寄存器Rd中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。逻辑右移操作如图4.56(b)所示。该汇编助记符指令的机器码格式如图4.59所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.59 LSRS<Rd>,<Rm>指令的机器码格式
指令LSRS R0,R1,其机器码为(40C8) 16 。该指令将保存在寄存器R0中的数据向右移动R1所指定的次数,移位的结果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
4.LSRS<Rd>,<Rm>,#imm
该指令执行逻辑右移操作。将保存在寄存器Rm中的数据向右移动立即数#imm所指定的次数,移位的结果保存在寄存器Rd中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。该汇编助记符指令的机器码格式如图4.60所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.60 LSRS<Rd>,<Rm>,#imm指令的机器码格式
注: (1)汇编指令中立即数imm的范围为1~32。
(2)当imm<32时,imm5=imm;当imm=32时,imm5=0。
指令LSRS R0,R1,#0x01,其机器码为(0848) 16 。该指令将保存在寄存器R1中的数据向右移动1次,移位的结果保存在寄存器R0中。在右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
5.RORS<Rd>,<Rm>
该指令执行循环右移操作。将保存在寄存器Rd中的数据向右循环移动Rm所指定的次数,移位的结果保存在寄存器Rd中。在循环右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。循环右移操作如图4.61所示。该汇编助记符指令的机器码格式如图4.62所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.61 循环右移操作
图4.62 RORS<Rd>,<Rm>指令的机器码格式
指令RORS R0,R1,其机器码为(41C8) 16 。该指令将保存在寄存器R0中的数据向右循环移动R1所指定的次数,移位的结果保存在寄存器R0中。在循环右移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
1.LSLS<Rd>,<Rm>
该指令执行逻辑左移操作。将保存在寄存器Rd中的数据向左移动Rm所指定的次数,移位的结果保存在寄存器Rd中。在左移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。逻辑左移操作如图4.63所示。该汇编助记符指令的机器码格式如图4.64所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.63 逻辑左移操作
图4.64 LSLS<Rd>,<Rm>指令的机器码格式
指令LSLS R0,R1,其机器码为(4088) 16 。该指令将保存在寄存器R0中的数据向左移动R1所指定的次数,移位的结果保存在寄存器R0中。在左移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
2.LSLS<Rd>,<Rm>,#imm
该指令执行逻辑左移操作。将保存在寄存器Rd中的数据向左移动立即数imm所指定的次数,移位的结果保存在寄存器Rd中,在左移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。该汇编助记符指令的机器码格式如图4.65所示。从该指令的机器码格式可知,寄存器Rm和Rd的范围为R0~R7。
图4.65 LSLS<Rd>,<Rm>,#imm指令的机器码格式
注: imm5与imm之间的关系参见LSRS指令。
指令LSLS R0,R1,#0x01,其机器码为(0048) 16 。该指令将保存在寄存器R1中的数据向左移动1次,移位的结果保存在寄存器R0中。在左移过程中,最后移出去的位保存在寄存器APSR的C标志中,也更新N和Z标志。
思考与练习4.11:说明以下指令实现的功能。
(1)ASRS R7,R5,#9____________________________________
(2)LSLS R1,R2,#3____________________________________
(3)LSRS R4,R5,#6____________________________________
(4)RORS R4,R4,R6_____________________________________