3

快速提问,我正在阅读 Richard C. Detmer 的题为“80x86 汇编语言和计算机体系结构简介”的教科书,在第 21 页和第 22 页上,它讨论了借用的概念,但它并没有真正描述它的真正含义. 以下是正文:

在计算机中,数字 a 和 b 的减法 a - b 通常通过取 b 的 2 的补码并将结果加到 a 来执行。这对应于添加 b 的否定。例如,对于十进制减法 195 - 618 = -423,

00C3 - 026A

改为加FD96,即026A的2的补码。

00C3 + FD96 = FE59

十六进制数字 FE59 表示 -423。查看前面的二进制加法,您有

0000 0000 1100 0011 + 1111 1101 1001 0110 = 1111 1110 0101 1001

请注意,加法中没有进位。但是,这个减法确实涉及借用。当 b 大于 a 作为无符号数时,a - b 减法中会出现借位。计算机硬件可以通过查看相应的加法中是否出现进位来检测减法中的借位。如果加法没有进位,则减法中有借位。如果加法中有进位,则减法中没有借位。(请记住,“携带”本身就是“执行”。)

这是另一个例子。使用字长 2 的补码表示进行十进制减法 985 - 411 = 574,

03D9 - 019B

改为添加 FE65,即 019B 的 2 补码。

03D9 + FE65 = 1023E

0000 0011 1101 1001 + 1111 1110 0110 0101 = 1 0000 0010 0011 1110

去掉多余的 1,十六进制数字 023E 代表 574。这个加法有一个进位,所以在相应的减法中没有借位。

什么是减法借位?我想当例如 00C3 - 026A 时,A 大于 3,所以我们必须从相应的 C 中“借用”,将其设为 B,现在将其设为 13(以 16 为底)减去 A。我们可以这样做,但是发生了“借”。在这个特定的例子中,确实发生了本书上下文中的借用。但是当我们看下一个例子时,他们给了我们 03D9 - 019B,B 比 9 大,所以我们必须从 D 中“借用”它,将其设为 C 并将 9 设为 19(以 16 为底)减去 B。我们可以做到,并且发生了“借用”,但书上说没有发生借用。

什么是借?我知道你知道是否发生了一个进位是否发生在加法中但进行原始减法,什么是真正的借位。我什么时候可以确定是否发生了?

例如,您知道发生进位是因为有一个额外的十六进制数字。长度超出了您的两个十六进制数字的长度(希望保持在其中的长度)。

谢谢你。

-担

4

2 回答 2

4

在书中,他所说的借用不同于传统的借用定义。他说只有当整个减法的结果为负(换句话说,b>a) 时才会发生借位,而不一定是单个数字的结果。

于 2014-02-18T19:39:42.753 回答
2

取一些 4 位数使其更容易,位数无关紧要 32 位的工作方式相同,只是更多的列......

我们实际上并没有减去我们添加负数 a - b = a + (-b) 并且我们知道对于二进制补码您“反转并加一”的数字的负数。

所以要减去 7 - 5,我们要加上 0111 + ((~0101) + 1)

     1 plus one
  0111
+ 1010 inverted 0101
=======

我们将第二个操作数 0101 反转为 1010,并且第一列的进位是一个。

完成数学

 11111
  0111
+ 1010 
=======
  0010

所以答案是 0010,即小数点后 2。这是正确的答案。现在,如果原始进位位为 1,则表示没有借位。我看到原始是因为某些体系结构,如果操作是减法,则会在将原始进位放入处理器状态寄存器进位标志时反转原始进位。有些架构可以,有些则不行,只要您知道它是如何工作的并且可以创建一个您不必记住的简单测试......

现在走另一条路 5 - 7。

 00011
  0101
+ 1000 (inverted 0111)
=======
  1110

所以答案是否定的 2,RAW 进位是 0,表示有借位。如果您的架构反转执行,那么您会将其视为借用的 1...

ADD 操作的进位输出需要与 add 和进位操作的进位相匹配。如果您的体系结构具有该指令,则 SUB 操作的结果需要作为带有借位操作的减法返回。

借位发挥作用的地方是这种 5-7=-2 的情况,将 4 位减法视为

  10101  0101 plus a fifth bit there to borrow from if we need it
 - 0111
========
   1110

如果你在计算器上减去 0x1A - 0x7,你会得到 0xE。我们需要借用那个位,这是读者尝试手动进行二进制减法的练习(非常容易),但它不是硬件如何做到的......也许现在你明白我们为什么使用二进制补码了.. .

因此,通常减法意味着使用加法运算,但补码在进入加法器的过程中反转第二个操作数。要么强制进位为 1,要么反转进位(反转进位并反转第二个操作数)。一些反转进位(反转进位反转第二个操作数反转执行如果减去)。

阅读您的其他问题。让我们将我们的四位系统级联成两个两位系统,例如,假设我们要减去 4 位数字 5 - 3. 0101 - 0011,但我们只有两位寄存器和一个两位加法器。我们必须先从低位两位开始 01 - 11 = 01 + (-01) = 01 + ((~01) + 1)

像这样的设置,减法

   1
  01
+ 00
=====

然后完成数学

 011
  01
+ 00
=====
  10

所以我们答案的低两位是 10,现在我们必须将进位作为进位级联到下一个操作中借位减法操作数是 01 和 00(0101 - 0011 的高位)

  110 carry out from lower order operation
   01
+  11 inverted operand
=======
   00

所以我们的整个答案是 0010 并且执行是 1 所以没有借位。5-3=2 有效。

让我们把它看成一个四位

设置

     1
  0101
+ 1100 
=======

执行

 11011
  0101
+ 1100 
=======
  0010

为了将其拆分为两个位操作,我们从右边开始以两个位间隔将其拆分

 110  011
  01   01
+ 11   00 
====   ===
  00   10

最右边的低位运算是一个带有固定 1 作为进位的正常减法。带有借位的减法用于其他高位的任何进一步操作,并且先前操作的进位是当前减法的进位借。

这就是为什么最后的进位是重要的而不是沿途的单个进位,因为当我们使用处理器执行更大的操作时,执行是反转或不反转到我们 psr 中的进位标志的那个,然后是用作借位减法中的进位(反转与否)(如果您的处理器有一个)。

我们也可以做一个进位也是一个... 5 - 1

四位设置

     1
  0101
+ 1110
=======

四位执行

 11111
  0101
+ 1110
=======
  0100

然后从字面上将其拆分为两位操作,看看如果我们有 2 位寄存器和 alu 而不是 4 位,它会是什么样子。

 111  111
  01   01
+ 11   10
====   ===
  01   00

右边 sub 的进位变成了借位减法的进位。如果您的处理器架构在进入 psr 中的进位位时将原始进位反转,那么该架构也会在进入减法的途中将其反转并借位。

有时,处理器文档是这样的,您可以从有符号和无符号分支中判断是否小于或大于等是否反转进位标志。有时做一个实验更容易。

于 2014-02-18T19:49:32.183 回答