使用 SAR 与 SHR 进行汇编时将二进制数右移

Amm*_*sfi 4 x86 assembly bit-shift x86-16

我们知道,当我们将一个二进制数右移时,它会被2除。对于数字:1001 0001。假设它存储在AX寄存器中:

  • 如果我们将其视为无符号数(在十进制中等于145): SHR AX, 1将使AX等于在十进制中0100 1000等于72,这是正确的。

  • 但是,如果我们将其视为有符号数(等于-111十进制):SAR AX, 1AX等于十进制中的1100 0100等于-56,这是错误的,因为它应该等于-55十进制。

为什么?

Ond*_*cny 5

SHR指令执行无符号右移,移入零:

Input:  1001 0001
        |      |\
        +------+ +--> lost
            v
         +------+
         |      |
Output: 0100 1000
        ^
        +-- added by SHR
Run Code Online (Sandbox Code Playgroud)

另一方面,该SAR指令执行有符号右移,将最高有效位解释为符号。它移动符号位的副本:

Input:  1001 0001
        |      |\
        +------+ +--> lost
        |   v
        |+------+
        v|      |
Output: 1100 1000
        ^
        +-- preserved (copied) by SAR
Run Code Online (Sandbox Code Playgroud)