【问题标题】:Explanation of setting the overflow flag设置溢出标志的说明
【发布时间】:2015-11-06 18:13:30
【问题描述】:

在 Kip Irvine 的书中,他谈到了设置溢出标志的机制,他写道:

CPU 使用一种有趣的机制来确定在加法或减法操作后溢出标志的状态。进位标志与结果的高位异或。结果值被放置在溢出标志中。

我写了一个简单的程序,显示在 al 寄存器中将 5 加到 127 会设置溢出标志:

0111 1111 + 0000 0101 = 1000 0100 carry flag = 0, high bit = 1, overflow = 1

但是在al寄存器中加5到255不会设置溢出标志:

1111 1111 + 0000 0101 = 0000 0100 carry flag = 1, high bit = 0, overflow = 0

为什么第二个例子中设置的溢出标志不满足条件语句,即;进位标志 = 1 高位 = 0?

【问题讨论】:

  • 我认为你在书中发现了一个错误 ;) 请注意它之前说过:当两个加法操作数的符号不同时,永远不会发生溢出所以也许他的意思是那个公式仅在符号不匹配时适用。
  • 进位基本上是“无符号溢出”溢出是“有符号”溢出。不确定你的书,但一个捷径是如果两个操作数具有相同的符号并且结果是不同的符号然后有符号溢出。从技术上讲,如果进位和执行不一样,则在 msbit 上,那么您有签名溢出。如果您添加 -n 和 -y 并获得一些正数,那么您在寄存器中没有足够的位来存储结果。例如 0x80+0x80 = 0x00。所以 Jester 的评论肯定是有道理的。
  • 啊,当然,如果溢出的先决条件是两个符号相同,那么确保异或是判断两个位是否相同或不同的简单方法。因此,如果操作数 msbit 匹配,则 xor 结果 msbit 与任一操作数 msbit 如果为 1,则两个位都匹配,如果为零,则它们不匹配。我认为 x86 是一种反转进位以使其成为减法借位的方法,因此您必须小心在正确的时间抓住进位。
  • 为了演示这些东西,我发现采用 3 或 4 位数字最容易,即使在纸上,您也可以浏览所有组合或所有有趣的位模式组合,在脑海中转换它们对有符号或无符号数字进行数学运算,依此类推。溢出等对 300 位的工作方式与对 3 位的工作方式相同
  • 感谢大家的解释,我想我知道现在何时设置溢出标志了。我只是希望找到一个更机械的例子来说明使用位和标志正在发生的事情。似乎在幕后进行了一些步骤。详述您所写的内容对于将操作数 MSB 与结果 MSB 进行比较是有意义的,

标签: assembly x86 masm


【解决方案1】:

在第二个示例255 + 5 中未设置溢出标志的原因是因为它与有符号算术有关。您正在添加-1 + 5,它给出了 4。没有溢出:结果是正确的。正如@Jester 评论的那样,你的书中一定有错误。

我的 8086 书中提到了溢出标志:

如果从第 6 位到第 7 位有内部进位( 符号位),并且没有外部进位。它也将在何时设置 从位 6 到位 7 没有内部进位,并且有一个 外置进位。

编辑

段落继续:

对于有技术头脑的读者,溢出标志设置为 对第 7 位(符号位)的进位和进位进行异或运算。

在第二个示例中,执行 1(进位标志),并且由于所有位都已设置,因此在内部加法期间必须有内部进位,即使结果 b7 为 0。

【讨论】:

  • 谢谢你的回答,你有什么书?
  • 古代 ISBN 0-89588-120-9 8086/8088 编程 作者:James W. Coffron (Sybex)。
  • 您能否添加到您的答案中:使用您书中的解释,为什么在您的答案的第二个示例中没有设置溢出?是因为从第 6 位到第 7 位有内部进位并且有外部进位吗?因此异或失败
  • @Boo 当内部和外部进位都发生时,书中引用的条件都不是真的,所以没有设置溢出标志。这与 -1 + 5 不设置溢出标志一致。
【解决方案2】:

您可以编写一个简单的程序来检查逻辑对 3 位加法/减法的作用。

#include <stdio.h>
int main ( void )
{
    unsigned int ra;
    unsigned int rb;
    unsigned int rc;
    unsigned int rd;
    unsigned int re;
    unsigned int cy;
    unsigned int ov;
    unsigned int ovx;
    unsigned int ovy;
    int sa;
    int sb;
    int sc;
    int sd;
    for(ra=0;ra<8;ra++)
    {
        for(rb=0;rb<8;rb++)
        {
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
            printf(" :");
            if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
            if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
            sc = sa + sb;
            //printf("%u(%2d) + %u(%2d)",ra,sa,rb,sb);
            printf("%2d + %2d = %2d",sa,sb,sc);
            printf("  :");
            rc=rb;
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
            printf(" + 0 = ");
            rd=ra+rc+0;
            if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
            re=(ra&3)+(rc&3)+0;
            ov=0;
            if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
            ovy=0;
            if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
            ovx = ((rd>>3)&1) ^ ((re>>2)&1);
            printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
            printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
            if(sc>3) printf("X");
            if(sc<(-4)) printf("X");
            printf("\n");
        }
    }
    for(ra=0;ra<8;ra++)
    {
        for(rb=0;rb<8;rb++)
        {
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" - ");
            printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
            printf(" :");
            if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
            if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
            sc = sa - sb;
            //printf("%u(%2d) - %u(%2d)",ra,sa,rb,sb);
            printf("%2d - %2d = %2d",sa,sb,sc);
            printf(" : ");
            rc=(~rb)&7;
            printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
            printf(" + ");
            printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
            printf(" + 1 = ");
            rd=ra+rc+1;
            if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
            re=(ra&3)+(rc&3)+1;
            ov=0;
            if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
            ovx = ((rd>>3)&1) ^ ((re>>2)&1);
            ovy=0;
            if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
            printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
            printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
            sc = sa - sb;
            if(sc>3) printf("X");
            if(sc<(-4)) printf("X");
            printf("\n");
        }
    }
}

给予

000 + 000 : 0 +  0 =  0  :000 + 000 + 0 = 000 C 0 O 0 0 0 
000 + 001 : 0 +  1 =  1  :000 + 001 + 0 = 001 C 0 O 0 0 0 
000 + 010 : 0 +  2 =  2  :000 + 010 + 0 = 010 C 0 O 0 0 0 
000 + 011 : 0 +  3 =  3  :000 + 011 + 0 = 011 C 0 O 0 0 0 
000 + 100 : 0 + -4 = -4  :000 + 100 + 0 = 100 C 0 O 0 0 0 
000 + 101 : 0 + -3 = -3  :000 + 101 + 0 = 101 C 0 O 0 0 0 
000 + 110 : 0 + -2 = -2  :000 + 110 + 0 = 110 C 0 O 0 0 0 
000 + 111 : 0 + -1 = -1  :000 + 111 + 0 = 111 C 0 O 0 0 0 
001 + 000 : 1 +  0 =  1  :001 + 000 + 0 = 001 C 0 O 0 0 0 
001 + 001 : 1 +  1 =  2  :001 + 001 + 0 = 010 C 0 O 0 0 0 
001 + 010 : 1 +  2 =  3  :001 + 010 + 0 = 011 C 0 O 0 0 0 
001 + 011 : 1 +  3 =  4  :001 + 011 + 0 = 100 C 0 O 1 1 1 X
001 + 100 : 1 + -4 = -3  :001 + 100 + 0 = 101 C 0 O 0 0 0 
001 + 101 : 1 + -3 = -2  :001 + 101 + 0 = 110 C 0 O 0 0 0 
001 + 110 : 1 + -2 = -1  :001 + 110 + 0 = 111 C 0 O 0 0 0 
001 + 111 : 1 + -1 =  0  :001 + 111 + 0 = 000 C 1 O 0 0 0 
010 + 000 : 2 +  0 =  2  :010 + 000 + 0 = 010 C 0 O 0 0 0 
010 + 001 : 2 +  1 =  3  :010 + 001 + 0 = 011 C 0 O 0 0 0 
010 + 010 : 2 +  2 =  4  :010 + 010 + 0 = 100 C 0 O 1 1 1 X
010 + 011 : 2 +  3 =  5  :010 + 011 + 0 = 101 C 0 O 1 1 1 X
010 + 100 : 2 + -4 = -2  :010 + 100 + 0 = 110 C 0 O 0 0 0 
010 + 101 : 2 + -3 = -1  :010 + 101 + 0 = 111 C 0 O 0 0 0 
010 + 110 : 2 + -2 =  0  :010 + 110 + 0 = 000 C 1 O 0 0 0 
010 + 111 : 2 + -1 =  1  :010 + 111 + 0 = 001 C 1 O 0 0 0 
011 + 000 : 3 +  0 =  3  :011 + 000 + 0 = 011 C 0 O 0 0 0 
011 + 001 : 3 +  1 =  4  :011 + 001 + 0 = 100 C 0 O 1 1 1 X
011 + 010 : 3 +  2 =  5  :011 + 010 + 0 = 101 C 0 O 1 1 1 X
011 + 011 : 3 +  3 =  6  :011 + 011 + 0 = 110 C 0 O 1 1 1 X
011 + 100 : 3 + -4 = -1  :011 + 100 + 0 = 111 C 0 O 0 0 0 
011 + 101 : 3 + -3 =  0  :011 + 101 + 0 = 000 C 1 O 0 0 0 
011 + 110 : 3 + -2 =  1  :011 + 110 + 0 = 001 C 1 O 0 0 0 
011 + 111 : 3 + -1 =  2  :011 + 111 + 0 = 010 C 1 O 0 0 0 
100 + 000 :-4 +  0 = -4  :100 + 000 + 0 = 100 C 0 O 0 0 0 
100 + 001 :-4 +  1 = -3  :100 + 001 + 0 = 101 C 0 O 0 0 0 
100 + 010 :-4 +  2 = -2  :100 + 010 + 0 = 110 C 0 O 0 0 0 
100 + 011 :-4 +  3 = -1  :100 + 011 + 0 = 111 C 0 O 0 0 0 
100 + 100 :-4 + -4 = -8  :100 + 100 + 0 = 000 C 1 O 1 1 1 X
100 + 101 :-4 + -3 = -7  :100 + 101 + 0 = 001 C 1 O 1 1 1 X
100 + 110 :-4 + -2 = -6  :100 + 110 + 0 = 010 C 1 O 1 1 1 X
100 + 111 :-4 + -1 = -5  :100 + 111 + 0 = 011 C 1 O 1 1 1 X
101 + 000 :-3 +  0 = -3  :101 + 000 + 0 = 101 C 0 O 0 0 0 
101 + 001 :-3 +  1 = -2  :101 + 001 + 0 = 110 C 0 O 0 0 0 
101 + 010 :-3 +  2 = -1  :101 + 010 + 0 = 111 C 0 O 0 0 0 
101 + 011 :-3 +  3 =  0  :101 + 011 + 0 = 000 C 1 O 0 0 0 
101 + 100 :-3 + -4 = -7  :101 + 100 + 0 = 001 C 1 O 1 1 1 X
101 + 101 :-3 + -3 = -6  :101 + 101 + 0 = 010 C 1 O 1 1 1 X
101 + 110 :-3 + -2 = -5  :101 + 110 + 0 = 011 C 1 O 1 1 1 X
101 + 111 :-3 + -1 = -4  :101 + 111 + 0 = 100 C 1 O 0 0 0 
110 + 000 :-2 +  0 = -2  :110 + 000 + 0 = 110 C 0 O 0 0 0 
110 + 001 :-2 +  1 = -1  :110 + 001 + 0 = 111 C 0 O 0 0 0 
110 + 010 :-2 +  2 =  0  :110 + 010 + 0 = 000 C 1 O 0 0 0 
110 + 011 :-2 +  3 =  1  :110 + 011 + 0 = 001 C 1 O 0 0 0 
110 + 100 :-2 + -4 = -6  :110 + 100 + 0 = 010 C 1 O 1 1 1 X
110 + 101 :-2 + -3 = -5  :110 + 101 + 0 = 011 C 1 O 1 1 1 X
110 + 110 :-2 + -2 = -4  :110 + 110 + 0 = 100 C 1 O 0 0 0 
110 + 111 :-2 + -1 = -3  :110 + 111 + 0 = 101 C 1 O 0 0 0 
111 + 000 :-1 +  0 = -1  :111 + 000 + 0 = 111 C 0 O 0 0 0 
111 + 001 :-1 +  1 =  0  :111 + 001 + 0 = 000 C 1 O 0 0 0 
111 + 010 :-1 +  2 =  1  :111 + 010 + 0 = 001 C 1 O 0 0 0 
111 + 011 :-1 +  3 =  2  :111 + 011 + 0 = 010 C 1 O 0 0 0 
111 + 100 :-1 + -4 = -5  :111 + 100 + 0 = 011 C 1 O 1 1 1 X
111 + 101 :-1 + -3 = -4  :111 + 101 + 0 = 100 C 1 O 0 0 0 
111 + 110 :-1 + -2 = -3  :111 + 110 + 0 = 101 C 1 O 0 0 0 
111 + 111 :-1 + -1 = -2  :111 + 111 + 0 = 110 C 1 O 0 0 0 
000 - 000 : 0 -  0 =  0 : 000 + 111 + 1 = 000 C 1 O 0 0 0 
000 - 001 : 0 -  1 = -1 : 000 + 110 + 1 = 111 C 0 O 0 0 0 
000 - 010 : 0 -  2 = -2 : 000 + 101 + 1 = 110 C 0 O 0 0 0 
000 - 011 : 0 -  3 = -3 : 000 + 100 + 1 = 101 C 0 O 0 0 0 
000 - 100 : 0 - -4 =  4 : 000 + 011 + 1 = 100 C 0 O 1 1 1 X
000 - 101 : 0 - -3 =  3 : 000 + 010 + 1 = 011 C 0 O 0 0 0 
000 - 110 : 0 - -2 =  2 : 000 + 001 + 1 = 010 C 0 O 0 0 0 
000 - 111 : 0 - -1 =  1 : 000 + 000 + 1 = 001 C 0 O 0 0 0 
001 - 000 : 1 -  0 =  1 : 001 + 111 + 1 = 001 C 1 O 0 0 0 
001 - 001 : 1 -  1 =  0 : 001 + 110 + 1 = 000 C 1 O 0 0 0 
001 - 010 : 1 -  2 = -1 : 001 + 101 + 1 = 111 C 0 O 0 0 0 
001 - 011 : 1 -  3 = -2 : 001 + 100 + 1 = 110 C 0 O 0 0 0 
001 - 100 : 1 - -4 =  5 : 001 + 011 + 1 = 101 C 0 O 1 1 1 X
001 - 101 : 1 - -3 =  4 : 001 + 010 + 1 = 100 C 0 O 1 1 1 X
001 - 110 : 1 - -2 =  3 : 001 + 001 + 1 = 011 C 0 O 0 0 0 
001 - 111 : 1 - -1 =  2 : 001 + 000 + 1 = 010 C 0 O 0 0 0 
010 - 000 : 2 -  0 =  2 : 010 + 111 + 1 = 010 C 1 O 0 0 0 
010 - 001 : 2 -  1 =  1 : 010 + 110 + 1 = 001 C 1 O 0 0 0 
010 - 010 : 2 -  2 =  0 : 010 + 101 + 1 = 000 C 1 O 0 0 0 
010 - 011 : 2 -  3 = -1 : 010 + 100 + 1 = 111 C 0 O 0 0 0 
010 - 100 : 2 - -4 =  6 : 010 + 011 + 1 = 110 C 0 O 1 1 1 X
010 - 101 : 2 - -3 =  5 : 010 + 010 + 1 = 101 C 0 O 1 1 1 X
010 - 110 : 2 - -2 =  4 : 010 + 001 + 1 = 100 C 0 O 1 1 1 X
010 - 111 : 2 - -1 =  3 : 010 + 000 + 1 = 011 C 0 O 0 0 0 
011 - 000 : 3 -  0 =  3 : 011 + 111 + 1 = 011 C 1 O 0 0 0 
011 - 001 : 3 -  1 =  2 : 011 + 110 + 1 = 010 C 1 O 0 0 0 
011 - 010 : 3 -  2 =  1 : 011 + 101 + 1 = 001 C 1 O 0 0 0 
011 - 011 : 3 -  3 =  0 : 011 + 100 + 1 = 000 C 1 O 0 0 0 
011 - 100 : 3 - -4 =  7 : 011 + 011 + 1 = 111 C 0 O 1 1 1 X
011 - 101 : 3 - -3 =  6 : 011 + 010 + 1 = 110 C 0 O 1 1 1 X
011 - 110 : 3 - -2 =  5 : 011 + 001 + 1 = 101 C 0 O 1 1 1 X
011 - 111 : 3 - -1 =  4 : 011 + 000 + 1 = 100 C 0 O 1 1 1 X
100 - 000 :-4 -  0 = -4 : 100 + 111 + 1 = 100 C 1 O 0 0 0 
100 - 001 :-4 -  1 = -5 : 100 + 110 + 1 = 011 C 1 O 1 1 1 X
100 - 010 :-4 -  2 = -6 : 100 + 101 + 1 = 010 C 1 O 1 1 1 X
100 - 011 :-4 -  3 = -7 : 100 + 100 + 1 = 001 C 1 O 1 1 1 X
100 - 100 :-4 - -4 =  0 : 100 + 011 + 1 = 000 C 1 O 0 0 0 
100 - 101 :-4 - -3 = -1 : 100 + 010 + 1 = 111 C 0 O 0 0 0 
100 - 110 :-4 - -2 = -2 : 100 + 001 + 1 = 110 C 0 O 0 0 0 
100 - 111 :-4 - -1 = -3 : 100 + 000 + 1 = 101 C 0 O 0 0 0 
101 - 000 :-3 -  0 = -3 : 101 + 111 + 1 = 101 C 1 O 0 0 0 
101 - 001 :-3 -  1 = -4 : 101 + 110 + 1 = 100 C 1 O 0 0 0 
101 - 010 :-3 -  2 = -5 : 101 + 101 + 1 = 011 C 1 O 1 1 1 X
101 - 011 :-3 -  3 = -6 : 101 + 100 + 1 = 010 C 1 O 1 1 1 X
101 - 100 :-3 - -4 =  1 : 101 + 011 + 1 = 001 C 1 O 0 0 0 
101 - 101 :-3 - -3 =  0 : 101 + 010 + 1 = 000 C 1 O 0 0 0 
101 - 110 :-3 - -2 = -1 : 101 + 001 + 1 = 111 C 0 O 0 0 0 
101 - 111 :-3 - -1 = -2 : 101 + 000 + 1 = 110 C 0 O 0 0 0 
110 - 000 :-2 -  0 = -2 : 110 + 111 + 1 = 110 C 1 O 0 0 0 
110 - 001 :-2 -  1 = -3 : 110 + 110 + 1 = 101 C 1 O 0 0 0 
110 - 010 :-2 -  2 = -4 : 110 + 101 + 1 = 100 C 1 O 0 0 0 
110 - 011 :-2 -  3 = -5 : 110 + 100 + 1 = 011 C 1 O 1 1 1 X
110 - 100 :-2 - -4 =  2 : 110 + 011 + 1 = 010 C 1 O 0 0 0 
110 - 101 :-2 - -3 =  1 : 110 + 010 + 1 = 001 C 1 O 0 0 0 
110 - 110 :-2 - -2 =  0 : 110 + 001 + 1 = 000 C 1 O 0 0 0 
110 - 111 :-2 - -1 = -1 : 110 + 000 + 1 = 111 C 0 O 0 0 0 
111 - 000 :-1 -  0 = -1 : 111 + 111 + 1 = 111 C 1 O 0 0 0 
111 - 001 :-1 -  1 = -2 : 111 + 110 + 1 = 110 C 1 O 0 0 0 
111 - 010 :-1 -  2 = -3 : 111 + 101 + 1 = 101 C 1 O 0 0 0 
111 - 011 :-1 -  3 = -4 : 111 + 100 + 1 = 100 C 1 O 0 0 0 
111 - 100 :-1 - -4 =  3 : 111 + 011 + 1 = 011 C 1 O 0 0 0 
111 - 101 :-1 - -3 =  2 : 111 + 010 + 1 = 010 C 1 O 0 0 0 
111 - 110 :-1 - -2 =  1 : 111 + 001 + 1 = 001 C 1 O 0 0 0 
111 - 111 :-1 - -1 =  0 : 111 + 000 + 1 = 000 C 1 O 0 0 0

所以对于添加,您将拥有一个这样的(根据定义,有符号溢出标志用于将位解释为有符号时)

011 + 001 : 3 +  1 =  4  :011 + 001 + 0 = 100 C 0 O 1 1 1 X

所以 1 + 3 (001 + 011) = 位模式 100,在三位二进制补码世界中的值为 -4 所以 1 + 3 = -4 这是错误的,所以有符号溢出,我们不能表示 + 4 三个位。在 x86 上,这相当于 127+1 (0x7F + 0x01) 的 8 位加法。基本上所有的正数组合都会导致 128(或更大)126+2、125+3 124+4 等等。都有这个问题。

010 + 010 : 2 +  2 =  4  :010 + 010 + 0 = 100 C 0 O 1 1 1 X

我做了加法和减法。减法逻辑上来自二进制补码概念反转和加 1。所以减法 c = a - b 使用 c = a + (-b),从二进制补码我们知道这意味着 c = a + ((~b)+1 ) 或 c = a + ~b + 1。加法是 c = a + b + 0。后面的 1 或 0 是 lsbit 的进位。

现在更进一步,加法 c = a + b + cin,减法 c = a + ~b + ~cin。您反转第二个操作数和进位。但是这是特定于处理器的,因为某些处理器会反转进位(我认为 x86 是一个),使其成为“借用”而不是“进位”进行减法。如果你有这些指令,那么这就会混淆进位的概念,如果你有这些指令(这些指令的逻辑不会在 sbb 上反转 cin)

我以三种不同(真的吗?)方式计算了溢出标志。

    ov=0;
    if((ra&4)==(rc&4)) ov = ((rd>>3)&1) ^ ((rd>>2)&1);
    ovx = ((rd>>3)&1) ^ ((re>>2)&1);
    ovy=0;
    if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;

ov 就像您正在阅读的文本一样,如果进入加法器的符号相同,则溢出将与结果的 msbit 进行异或运算。

ovx 是相对于 msbit 进位的溢出进位的定义

如果您想计算溢出但没有 N+1 位用于寄存器,您可以使用 ovy 快捷方式(在看不到执行结果的语言中,如何使用 32 位变量计算溢出?我在代码中展示了很多方法,但只需检查 msbits 也可以)。

然后最后的 X 也是溢出的定义,如果结果不适合可用的位数,那么你就溢出了。真为无符号(进位)和有符号(溢出)溢出。因为这是关于溢出,所以这是关于有符号数,所以对于我的三位系统,你只能从 -4 到 +3 任何高于 +3 或低于 -4 的东西都不适合,并且打印输出末尾的 X 表明,所以这是在这个简化示例中显示溢出的第四种方式。

同样,上面的输出是通用逻辑的执行方式,然后您会看到处理器系列的细微差别,带有进位标志,一些处理器反转进位以使其成为借位,而有些处理器在执行减法时不会。真正的逻辑会将一堆 3 个输入(两个操作数和进位)级联在一起,两个输出(结果和进位)加法器一起,尽管在 HDL 语言中你可以使用加号运算符并解决这个问题(在那些语言中也需要一个这些快捷方式中不检查进位与执行)

如果您使用布尔方程,您应该能够发现计算溢出的三种方法是等效的,不仅像这里那样在实验上,而且在数学上。

【讨论】:

    【解决方案3】:

    我在你的号码中看到的一件事是号码是“0111 1111”+ “0000 0101”都是正数,因为左边的第一个数字是 0,但在第二个例子中,第一个数字是“1111 1111”,这意味着它是负数,第二个是“0000 0101”,这也意味着它是正数!请记住:OF(溢出标志)何时设置,两个数字具有相同的符号。在第二个中,由于 2 个不同的数字符号 OF = 0;

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多