首页 > 解决方案 > Irvine 书中的这个 SWORD 零扩展示例真的正确吗?

问题描述

我是个初学者,一直在阅读 Irvine 的《Assembly Language for x86》。我在有符号整数除法部分,遇到了一个让我很困惑的例子。

它旨在作为您不签署扩展时发生的情况的示例。这是代码行:

.data

 wordval SWORD -101      ;009Bh

.code

  mov DX, 0
  mov ax, wordVal         ; DX:AX = 0000009Bh (+155)
  mov bx, 2               ; BX is the divisor
  idiv bx                 ; divide DX:AX by BX (signed operation)

然后它说因为 ax 实际上等于 +155,所以产生的商是 +77,而不是预期的结果。

为什么-101在第二行代码中变量 wordVal 表示为 009B 而不是 FF9B?

这是我的逻辑:十进制的 101 是 65h。SWORD 是 16 位,所以二进制补码应该是 0FF9Bh。然后 DX 设置为 0 并且 DX:AX 将等于 0000FF9Bh 因此如果没有符号扩展,该数字将被解释为 65435 十进制。


我本来希望代码如下所示:

.data

 wordval SWORD -101        ;FF9Bh

.code

 mov DX, 0
 mov ax, wordVal           ; DX:AX = 0000FF9Bh (+65435)
 mov bx, 2                 ; BX is the divisor
 idiv bx                   ; divide DX:AX by BX (signed operation)

商为 32717。

(或者将正常cwd设置为 16-bit idiv,它实际上会计算-101 / 2=-50余数-1。或者使用算术右移有效地除以 2,AX = -51CF=1。)

这是书中的错误还是我遗漏了什么?

标签: assemblyx86masmtwos-complementirvine32

解决方案


推荐阅读