一、位运算指令
- 按位取反 (
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
寄存器。
这些指令是处理位级操作和数据操作时非常常见的指令,它们广泛应用于位图操作、加密算法、数据压缩等场景中。
Comments NOTHING