在装配中将二进制数转移到右侧

时间:2013-12-26 20:29:12

标签: assembly x86-16 shift

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

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

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

为什么?

3 个答案:

答案 0 :(得分:2)

SHR指令执行无符号的转移权限:

Input:  1001 0001
        |      |\
        +------+ +--> lost
            v
         +------+
         |      |
Output: 0100 1000
        ^
        +-- added by SHR

另一方面,SAR指令执行签名右移,将最高位解释为符号:

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

答案 1 :(得分:1)

算术右移除2,向负无穷大舍入。

答案 2 :(得分:0)

  

我们知道当我们向右移动二进制数时,它除以2

这就是混乱开始的地方! shl shr sal sar只是转变 - 仅此而已。如果某种类型的转变类似于2除以它或多或少的奖励。我们不能称这种行为是对还是错。