逻辑移位和算术移位

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

逻辑移位和算术移位

主要是位运算中的右移会有这样的问题

比如:

11110000右移一位,前面补0还是补1?

所以就有了逻辑右移和算术右移,而左移统一补0.

逻辑右移:不管最左边一位是0还是1,都补0.

算术右移:右移是按最左边(高位)来补的(即如果是1就补1,如果是0就补0,不改变该位的值)

●算术左移SLA、算术右移SRA:把操作数看成带符号数。对寄存器操作数进行移位(要移动数

的第0 位——符号位不变。右移时空出的其余位补与第0 位相同的 1 或0 ;

左移时空出的位补0 ),位数由有效地址决定。

●逻辑左移SLL、逻辑右移SRL:把操作数看成无符号数。对寄存器操作数进行移位(不管左右

移,要移动数空出的位补0 ),位数由有效地址决定。

算术与逻辑左移的操作完全相同,但逻辑右移的目标操作数的左端移入0,而算术右移则保持目标操作数的符号位(即最高有效位)不变。

循环指令有不通过进位位与通过进位位的循环指令,通过进位位的循环指令把CF标志作为目标操作数的扩展,参与循环操作。和移位指令不同之处是:循环移位时移出的目标操作数位并不丢失,而是循环送回目标操作数的另一端。

1.汇编语言中的逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。

2.高级语言右移运算符(>>)是将一个数的二进位全部右移若干位,低位移出部分舍弃,左补0。

3.高级语言右移和汇编语言中的逻辑右移功能一样,但不同于算术右移

逻辑移位(不管是左移位还是右移位)都是空缺处补0

例如:mov ax , 1100_0111_0110_1000B

mov cl , 3

shl ax , cl ; 结果ax = 0011_1011_0100_0000

mov ax , 1100_0111_0110_1000B

mov cl , 3

shr ax , cl ; 结果ax = 0001_1000_1110_1101

算术移位要保证符号位的不改变(逻辑左移位补0, 逻辑右移位看符号位)

例如:mov ax , 1100_0111_0110_1000B

mov cl , 3

sal ax , cl ; 结果ax = 0011_1011_0100_0000

mov ax , 1100_0111_0110_1000B

mov cl , 3

sar ax , cl ; 结果ax = 1111_1000_1110_1101

mov ax , 0100_0111_0110_1000B

mov cl , 3

sar ax , cl ; 结果ax = 0000_1000_1110_1101

可以总结如下:

算术左移同逻辑左移

算术右移移入的位用符号位填

逻辑右移移入的位用0填

相关文档
最新文档