什么是十六进制减法的借用? (部件)

时间:2014-02-18 19:34:37

标签: assembly hex subtraction carryflag

快速提问,我正在阅读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。查看以前的二进制加法,你有

     <00> 0000 0000 1100 0011 + 1111 1101 1001 0110 = 1111 1110 0101 1001

     

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

     

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

     

03D9 - 019B

     

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

     

03D9 + FE65 = 1023E

     <00> 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.我们可以这样做,并且“借”了,但书中说借款没有发生。

什么是借款?我知道你知道一个人是否因为一个进位发生在加法中但做了原始的减法,这真的是借用。我什么时候可以确定是否有人出现?

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

谢谢。

-Dan

2 个答案:

答案 0 :(得分:3)

在书中,他所谓的借款与传统的借款定义不同。他说只有当 ENTIRE 减法的结果为负时(换句话说,b> a),才会出现借位,而不一定是个别数字的结果。

答案 1 :(得分:2)

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

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

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

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

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

完成数学

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

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

现在走另一条路5 - 7.

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

所以答案是负二,RAW执行是0表示有借款。如果你的架构颠倒了执行,那么你会看到这是一个借用...

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。我们需要借用这一点,这是一个练习让读者尝试手工进行二进制减法(非常简单),但它不是硬件如何做到的......也许现在你明白为什么我们使用二进制补码了...

所以一般说来,减法意味着使用add运算,但是补码运算在进入加法器的过程中反转第二个操作数。强制进位为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

右边的子进位变为借入减法的进位。如果你的处理器体系结构在转到psr中的进位位时反转原始执行,那么该体系结构也会在通过借位进入减法的过程中将其反转。

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