【问题标题】:How a negative value stored in emu8086 registers? [duplicate]emu8086寄存器中如何存储一个负值? [复制]
【发布时间】:2020-12-08 15:26:26
【问题描述】:

我使用 8086 模拟器 有一个指令 mov dx,-16 执行此指令后,我得到如下结果 enter image description here

谁能告诉我这个值是怎么来的?

【问题讨论】:

标签: assembly x86 twos-complement emu8086


【解决方案1】:

负数由设置的最高位指示。 如果你从 0 中减去 1,那么你会得到 0xffff = -1,因为寄存器会环绕。

0xffff = -1
0xfffe = -2
...
0xfff0 = -16

但这是一个约定,您如何解释数字(或在某些操作中使用它),因为如果您将相同的值视为无符号,那么您的范围为 0...65535 | 0...0xffff。

所以基本上,因为最高位表示负值,这意味着值的范围是-32768 ... +32767的一半。

【讨论】:

    【解决方案2】:

    最高位用作符号标志。如果设置为 0,剩下的只是一个没有最高位的正常值。如果它是 1,那么你必须取 2 的位数的幂 - 符号标志为 1(在这种情况下为 15),然后添加正常值。或者你只取 0x10000 并减去绝对值。

    这样做的好处是,例如,当您只有 8 位寄存器(我是 C64 人)时,您可以将 0xFF(表示 -1)添加到例如 0x05,然后得到 0x104 .但由于没有第 9 位,所以只有 0x04。因此,CPU 对这种有符号数字具有某种“原生支持”,因为您几乎可以将它们视为普通数字。

    对于您的情况,这意味着您取 0x10000,然后减去 16,得到 0xFFF0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2019-04-21
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多