LSR和ASR的区别
时间: 2024-06-20 11:01:10 浏览: 335
LSR (Logic Shift Right) 和 ASR (Arithmetic Shift Right) 的主要区别在于它们在执行右移操作时对待位模式的不同方式。LSR 是逻辑右移,它会用 0 填充被移动位的空缺,保持原始二进制数值的逻辑状态。例如,如果有一个二进制数 1010,LSR 后得到的是 0101,因为最右边的 0 会被复制到左移的位置。
相比之下,ASR 是算术右移,如果操作数是无符号数,它也会用 0 填充空缺,但如果是有符号数(如二进制补码表示的负数),ASR 会在空缺处填充符号位(对于二进制,通常是 1)。这会导致数值的实际大小减小,例如负数的 ASR 可能会变成更小的负数。
举个例子[^1],无符号的 1010 ASR 会得到 0010,而有符号的 -1010 ASR 则会变成 -0010,因为最右边的 1 代表负号,所以整体变得更小。
相关问题
常用的逻辑运算指令AND\ORR\EOR\LSL\LSR\ASR
以下是常用的逻辑运算指令的介绍和示例:
1. AND(与)指令:将operand2的值与寄存器Rn的值按位作逻辑“与”操作,结果保存到Rd中。
```assembly
AND Rd, Rn, operand2
```
2. ORR(或)指令:将operand2的值与寄存器Rn的值按位作逻辑“或”操作,结果保存到Rd中。
```assembly
ORR Rd, Rn, operand2
```
3. EOR(异或)指令:将operand2的值与寄存器Rn的值按位作逻辑“异或”操作,结果保存到Rd中。
```assembly
EOR Rd, Rn, operand2
```
4. LSL(逻辑左移)指令:将寄存器Rm的值左移指定的位数,并将结果保存到Rd中。
```assembly
LSL Rd, Rm, #shift
```
5. LSR(逻辑右移)指令:将寄存器Rm的值右移指定的位数,并将结果保存到Rd中。
```assembly
LSR Rd, Rm, #shift
```
6. ASR(算术右移)指令:将寄存器Rm的值右移指定的位数,并将结果保存到Rd中。在ASR指令中,右移时保留符号位。
```assembly
ASR Rd, Rm, #shift
```
分别解释ADD、SUB、AND、ORR、EOR、LSL、LSR、ASR
ADD:ADD指令用于实现加法运算,它可以将两个操作数相加,并将结果存储到指定的目的寄存器中。例如,ADD R0, R1, #2表示将R1和2相加,结果存储到R0寄存器中。
SUB:SUB指令用于实现减法运算,它可以将两个操作数相减,并将结果存储到指定的目的寄存器中。例如,SUB R0, R1, #2表示将R1减去2,结果存储到R0寄存器中。
AND:AND指令用于实现与运算,它可以将两个操作数进行与运算,并将结果存储到指定的目的寄存器中。例如,AND R0, R1, #0xFF表示将R1和0xFF进行与运算,结果存储到R0寄存器中。
ORR:ORR指令用于实现或运算,它可以将两个操作数进行或运算,并将结果存储到指定的目的寄存器中。例如,ORR R0, R1, #0xFF表示将R1和0xFF进行或运算,结果存储到R0寄存器中。
EOR:EOR指令用于实现异或运算,它可以将两个操作数进行异或运算,并将结果存储到指定的目的寄存器中。例如,EOR R0, R1, #0xFF表示将R1和0xFF进行异或运算,结果存储到R0寄存器中。
LSL:LSL指令用于实现逻辑左移运算,它可以将一个操作数向左移动指定的位数,并将结果存储到指定的目的寄存器中。例如,LSL R0, R1, #2表示将R1向左移动2位,结果存储到R0寄存器中。
LSR:LSR指令用于实现逻辑右移运算,它可以将一个操作数向右移动指定的位数,并将结果存储到指定的目的寄存器中。例如,LSR R0, R1, #2表示将R1向右移动2位,结果存储到R0寄存器中。
ASR:ASR指令用于实现算术右移运算,它可以将一个操作数向右移动指定的位数,并将结果存储到指定的目的寄存器中。与LSR指令不同的是,ASR指令在右移的过程中会保留符号位。例如,ASR R0, R1, #2表示将R1向右移动2位,结果存储到R0寄存器中,并且在右移的过程中保留符号位。
阅读全文