对位运算指令及移位操作指令的总结
一、位运算指令
-
按位取反 (
not)-
not指令对操作数的每一位进行取反(0变1,1变0)。 -
只能操作寄存器或内存,不能为立即数。
-
示例:
-
mov bl, 01h ; bl = 00000001b
not bl ; bl = 11111110b (bl = FEh)
-
-
按位与 (
and)-
and指令对两个操作数的每一位进行与运算(两个位都为1时结果为1,否则为0)。 -
示例:and al, 00001001b ; al = al & 00001001b
-
-
按位或 (
or)-
or指令对两个操作数的每一位进行或运算(两个位都为0时结果为0,否则为1)。 -
示例:or al, 00001001b ; al = al | 00001001b
-
-
按位异或 (
xor)-
xor指令对两个操作数的每一位进行异或运算(两个位相同为0,不同为1)。 -
示例:xor al, 00001001b ; al = al ^ 00001001b
-
二、移位操作指令
-
逻辑移位 (
shl,shr)-
左移 (
shl):将操作数的所有位向左移动,左边丢弃,右边补0。-
shl al, 1表示将al左移1位。 -
如果立即数大于1,需要将移位次数存储到
cl寄存器。 -
示例:mov cl, 2
shl al, cl ; al 左移 2 位
-
-
右移 (
shr):将操作数的所有位向右移动,右边丢弃,左边补0(对于无符号数)。- 示例:shr al, 1 ; al 右移 1 位
-
-
算术移位 (
sal,sar)-
算术左移 (
sal):与逻辑左移相同,左移时丢弃左边的位并补0。- 示例:sal ax, 1 ; ax 左移 1 位
-
算术右移 (
sar):与逻辑右移不同,算术右移时,符号位(即最高位)会被保留,保持符号数的负号。- 示例:sar ax, 1 ; ax 算术右移 1 位
-
-
旋转移位 (
rol,ror,rcl,rcr)-
旋转左移 (
rol):将操作数的所有位循环向左移动,左边的位移到右边。- 示例:rol ax, 1 ; ax 左循环移位 1 位
-
旋转右移 (
ror):将操作数的所有位循环向右移动,右边的位移到左边。- 示例:ror ax, 1 ; ax 右循环移位 1 位
-
带进位旋转左移 (
rcl):将操作数的所有位循环向左移,并将进位(CF)包含在移位操作中。- 示例:rcl ax, 1 ; ax 左旋转并包含进位 1 位
-
带进位旋转右移 (
rcr):将操作数的所有位循环向右移,并将进位(CF)包含在移位操作中。- 示例:rcr ax, 1 ; ax 右旋转并包含进位 1 位
-
三、注意事项
-
shl和sal指令执行相同的操作,都是逻辑左移。 -
shr和sar指令执行相同的操作,都是逻辑右移与算术右移的区别。 -
rcl和rcr在旋转操作中,将 进位标志(CF)作为循环移位的一部分,这在某些场景下对数据处理非常重要。 -
立即数限制:对于
shl,shr,sal,sar等指令,移位的次数如果大于1时,必须将移位次数存放到cl寄存器。
这些指令是处理位级操作和数据操作时非常常见的指令,它们广泛应用于位图操作、加密算法、数据压缩等场景中。