Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么是十六进制减法?(大会)_Assembly_Hex_Subtraction_Carryflag - Fatal编程技术网

Assembly 什么是十六进制减法?(大会)

Assembly 什么是十六进制减法?(大会),assembly,hex,subtraction,carryflag,Assembly,Hex,Subtraction,Carryflag,快速提问,我正在阅读Richard C.Detmer编写的题为“80x86汇编语言和计算机体系结构简介”的教科书,在第21页和第22页,它谈到了什么是借用的概念,但它并没有真正描述它到底是什么。全文如下: 在计算机中,数字a和b的减法a-b通常是通过取b的2的补数并将结果加在a上来实现的。这相当于添加b的否定。例如,对于十进制减法195-618=-423 00C3-026A 更改为添加FD96,即2的026A补码 00C3+FD96=FE59 十六进制数字FE59表示-423。查看前面的二进制加

快速提问,我正在阅读Richard C.Detmer编写的题为“80x86汇编语言和计算机体系结构简介”的教科书,在第21页和第22页,它谈到了什么是借用的概念,但它并没有真正描述它到底是什么。全文如下:

在计算机中,数字a和b的减法a-b通常是通过取b的2的补数并将结果加在a上来实现的。这相当于添加b的否定。例如,对于十进制减法195-618=-423

00C3-026A

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

00C3+FD96=FE59

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

0000 0000 1100 0011+111111011001=1111110101001

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

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

03D9-019B

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

03D9+FE65=1023E

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

丢弃额外的1,十六进制数字023E表示574。此加法具有进位,因此在相应的减法中没有借用

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

什么是借钱?我知道你知道,如果一个发生在加法中是否有进位,但进行原始减法,那么什么才是真正的借钱。我什么时候可以确定是否发生了这种情况

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

多谢各位


-丹

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

取一些4位数字使其更简单,位数无关紧要32位的工作原理相同,只是更多列

实际上,我们不进行减法,而是将负数a-b=a+(-b)相加,我们知道,对于两个补一个数的负数,你可以“倒过来加一”

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

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

完成数学

 11111
  0111
+ 1010 
=======
  0010
 011
  01
+ 00
=====
  10
所以答案是0010,是2位小数。这是正确的答案。现在,如果原始执行位为1,则表示没有借用。我看到了raw,因为在某些架构中,如果操作是减法运算,则将raw进位放在处理器状态寄存器进位标志中时,会反转raw进位。有些架构可以,有些可以,有些不可以,只要你知道它是如何工作的,并且可以创建一个简单的测试,你不需要记住

现在走另一条路5-7

 00011
  0101
+ 1000 (inverted 0111)
=======
  1110
所以答案是否定的2,原始执行值是0,表示存在借用。如果您的架构反转了执行,那么您会将其视为借用的1

添加操作的进位结果需要与添加进位操作的进位结果相匹配。如果您的体系结构具有该指令,那么子操作的结果需要作为带借用的减法操作返回

在这个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
=====
然后完成数学

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

所以我们的答案是0010
     1
  0101
+ 1100 
=======
 11011
  0101
+ 1100 
=======
  0010
 110  011
  01   01
+ 11   00 
====   ===
  00   10
     1
  0101
+ 1110
=======
 11111
  0101
+ 1110
=======
  0100
 111  111
  01   01
+ 11   10
====   ===
  01   00