当前位置: 首页 > 知识库问答 >
问题:

为什么在这个代换方程中设置进位标志?

苏涵润
2023-03-14

在本文中,它说:

1111 0001=0000(进位标志打开)

据我所知,当结果不适合一定数量的位(本例中为4位)时,就会发生进位,因此上述等式确实导致了进位(因为结果实际上是10000,不适合4位)。

但请看同一篇文章中的以下内容:

0000 - 0001 = 1111 (carry flag is turned on)

我不明白为什么在这种情况下设置进位标志,我的意思是结果是1111,所以它适合4位!

共有3个答案

孟茂
2023-03-14

我们从小学就知道a-b=a(-b),我们知道用二补语否定某事意味着反转和加一。有些人知道处理器不会减去它们而是加一

  0000
 -0001
=======

真的是

      1
   0000
+  1110
========

倒置并添加一个,因为我们无论如何都必须进行,我们在那里添加一个,而不是做额外的工作。所以我们反转进位,然后在进入加法器的过程中反转第二个操作数

  00001
   0000
+  1110
========
   1111

你是对的,这是答案,但一些处理器反转执行,这听起来像你正在使用的一个这样。为什么?因为如果你检查其他一些数字集,你会发现该位可以用作借用位或不借用位,而不是无符号溢出,这就是无符号数字的含义,如本例中所示。0000 1111=1111,这不是无符号溢出。

因此,从一个架构到下一个架构(ARM、MIPS、AVR、x86等),如果您想使用该标志(而不是MIPS),您可以阅读留档,或者做一个实验,因为文档在这个主题上不太好。有时使用进位加法或使用借用减法的减法指令会暗示架构的工作方式(在减法之外反转进位标志)。

梁研
2023-03-14

在大多数CPU(包括x86 CPU)上,进位标志对加法和减法的行为如下:

进位标志是将数字的“长度”扩展一位时结果的最高位。

例子:

 1110 +  0011 = 01110 + 00010 (extending 4 bits to 5 bits)
01110 + 00011 = 10001 (5 bit result)
 1110 +  0011 =  0001, Carry=1 (highest of the 5 bits is the carry flag)

 0010 -  0011 = 00010 - 00010 (extending 4 bits to 5 bits)
00010 - 00011 = 11111 (5 bit result)
 0010 -  0011  = 1111, Carry=1 (highest of the 5 bits is the carry flag)

(然而,有些CPU的进位标志在减法上的变化不同;例如:历史上的6502)

叶茂
2023-03-14

如果忽略类型的大小,则

1111 + 0001 = 10000

这就是为什么会得到进位(简单地表示结果大于存储的0)。如果必须添加其他(十六进制)“数字”,这一点很重要。

使用减法,可以得到类似的问题:

0000 - 0001 = 1111

实际上是0-1=15。这不是真的,所以进位设置为指示执行了借用,即或多或少执行了以下操作:

10000 - 0001 = 1111 (16 - 1 = 15)

在十进制中进行减法时也会执行相同的操作:

    34
    18
  ---- -

要从4中减去8,你必须从下一个数字中借用1,得到14− 8=6。需要借用以正确减去下一对较高数字。3.− 1=2,但你也必须减去借来的,所以现在是3− 1.− 借用=1。这就是为什么你(正确地)得到16而不是26。

    34
    18
  ---- -
    16

二进制借位具有相同的功能:它存储在进位标志中,可以使用SBB(带借位的减法)而不是普通的SUB(减法)进行减法(例如在x86汇编程序中)。进位标志(现在用作“借用标志”)的值从两个操作数中另外减去:

Value1  DW      0x1234  ; alternatively: DB 0x34,0x12
Value2  DW      0x0678  ;                DB 0x78,0x06  
Result  DW      0

        MOV     AL,BYTE PTR [Value1]      ; 0011 0100
        SUB     AL,BYTE PTR [Value2]      ; 0111 1000
        MOV     BYTE PTR [Result],AL      ; 0xBC = 1011 1100, but a borrow was needed!
        MOV     AL,BYTE PTR [Value1 + 1]  ; 0001 0010
        SBB     AL,BYTE PTR [Value2 + 1]  ; 0000 0110 (0x12 - 0x06 - carry = 0x0B)
        MOV     BYTE PTR [Result + 1],AL  ; 0x0B = 0000 1011 
 类似资料:
  • 问题内容: 因此,该资源(http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html)建议在该线程不处理中断本身时将其设置为“ 这样,调用堆栈中更高级别的代码就可以了解中断并在需要时对其进行响应 。” 假设我正在使用ExecutorService在其他线程中运行某些内容。我构造一个Callable并将此Callable传

  • 给定,设置任意位数和位位置(0-63) 对位置X或更低的位进行计数或在X处的位未设置时返回0的最有效的方法是什么 注意:如果设置了该位,则返回值将始终至少为1 注意:这不是一个如何计算32位整数中设置位数的dup吗?因为它询问的是0到X范围以外的所有位

  • 我需要帮助我的错误就像 代码:

  • 我想把这段代码添加到我的Java文件中: 但我不知道在哪。这是我的Java文件:包sherdle.donald.duck.app;导入android.app.activity;导入Android.os.bundle;导入Android.View.Window;导入android.webkit.webchromeclient;导入android.webkit.webview;导入Android.We

  • 因此,该资源(http://www . IBM . com/developer works/Java/library/j-jtp 05236/index . html)建议,当线程本身不处理中断时,在线程中设置中断位,“以便调用堆栈中更高层的代码可以了解到中断,并在需要时做出响应。” 假设我正在使用执行器服务在不同的线程中运行某些内容。我构造了一个可调用的,并将这个可调用传递给执行器服务.subm

  • 我已经将内部的设置为,但主页图标没有居中。 null null 这就是我所看到的: