shl和shr是逻辑移位指令,后面的课程中我们要用到移位指令,这里进行一下讲解
shl是逻辑左移指令,它的功能为:
(1)将一个寄存器或内存单元中的数据向左移位;
(2)将最后移出的一位写入CF中;
(3)最低位用0补充。
指令:
mov al,01001000b shl al,1 ;将al中数据左移一位
执行后(al)=10010000b,CF=0
我们来看一下shl al,l的操作过程。
(1)左移
原数据: 01001000 左移后: 01001000
(2)将最后移出的一位写入CF中
原数据: 01001000 左移后: 1001000 CF=0
(3)最低位用0补充
原数据: 01001000 左移后: 10010000
如果接着上面,继续执行一条shl a1,1,则执行后:(al)=OO100000b. CF=1 shl指令的操作过程如下。
(1)左移
原数据: 10010000 左移后: 10010000
(2)将最后移出的一位写入CF中
原数据: 10010000 左移后: 0010000 CF=1
(3)最低位用0补充
原数据: 10010000 左移后: 00100000
注意:
如果移动位数大于1时,必须将移动位数放在cl中。
比如,指令:
mov al,01010001b mov cl,3 shl al,cl
执行后(al)=10001000b,因为最后移出的一位是0,所以CF=0。
可以看出,将x逻辑左移一位,相当于执行x=x*2
比如:
mov al,00000001b ;执行后(al)=00000001b=1 shl al,1 ;执行后(al)=00000010b=2 shl al,1 ;执行后(al)=00000100b=4 shl al,1 ;执行后(al)=00001000b=8 mov cl,3 shl al,cl ;执行后(al)=0100000b=67
Shr是逻辑右移指令,它和shl所进行的操作刚好相反。
(1)将一个寄存器或内存单元中的数据向右移位;
(2)将最后移出的一位写入CF中;
(3)最高位用0补充。
指令:
mov a1,10000001b shr al,1 ;将al中的数据右移一位
执行后(al)=01000000b, CF=1
如果接着上面,继续执行一条shr al, l,则执行后:(al)=00100000b, CF=0
如果移动位数大于1时,必须将移动位数放在cl中
比如 指令:
mov al,01010001b mov cl,3 shr al,cl
执行后(al)=00001010b,因为最后移出的一位是0,所以CF=0
可以看出将x逻辑右移一位,相当于执行x=x/2