对位运算指令及移位操作指令的总结

boranstars 发布于 2025-04-04 135 次阅读


一、位运算指令

  1. 按位取反 (not)
    • not 指令对操作数的每一位进行取反(0变1,1变0)。
    • 只能操作寄存器或内存,不能为立即数
    • 示例:
    • mov bl, 01h  ; bl = 00000001b
      not bl        ; bl = 11111110b (bl = FEh)
  2. 按位与 (and)
    • and 指令对两个操作数的每一位进行与运算(两个位都为1时结果为1,否则为0)。
    • 示例:and al, 00001001b ; al = al & 00001001b
  3. 按位或 (or)
    • or 指令对两个操作数的每一位进行或运算(两个位都为0时结果为0,否则为1)。
    • 示例:or al, 00001001b  ; al = al | 00001001b
  4. 按位异或 (xor)
    • xor 指令对两个操作数的每一位进行异或运算(两个位相同为0,不同为1)。
    • 示例:xor al, 00001001b ; al = al ^ 00001001b

二、移位操作指令

  1. 逻辑移位 (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 位
  2. 算术移位 (sal, sar)
    • 算术左移 (sal):与逻辑左移相同,左移时丢弃左边的位并补0。
      • 示例:sal ax, 1 ; ax 左移 1 位
    • 算术右移 (sar):与逻辑右移不同,算术右移时,符号位(即最高位)会被保留,保持符号数的负号。
      • 示例:sar ax, 1 ; ax 算术右移 1 位
  3. 旋转移位 (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 位

三、注意事项

  • shlsal 指令执行相同的操作,都是逻辑左移。
  • shrsar 指令执行相同的操作,都是逻辑右移与算术右移的区别。
  • rclrcr 在旋转操作中,将 进位标志(CF)作为循环移位的一部分,这在某些场景下对数据处理非常重要。
  • 立即数限制:对于 shl, shr, sal, sar 等指令,移位的次数如果大于1时,必须将移位次数存放到 cl 寄存器。

这些指令是处理位级操作和数据操作时非常常见的指令,它们广泛应用于位图操作、加密算法、数据压缩等场景中。

此作者没有提供个人介绍
最后更新于 2025-04-04