精华内容
下载资源
问答
  • 进位标志和溢出标志

    千次阅读 2018-06-25 20:55:51
    1.对于非符号数来说,不存在溢出的问题,它的进位就相当...一个正数一个负数相加不可能溢出ps:x1, x2 为补码形式OF:溢出标志; CF:进位标志x1 = 01100000>0, x2 = 01110000>0x1+x2 = 1101000 &...

    1.对于非符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出.
    2.而对于符号数来说,不存在进位的问题.两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了.一个正数和一个负数相加不可能溢出

    ps:x1, x2 为补码形式

    OF:溢出标志; CF:进位标志
    x1 = 0110 0000>0, x2 = 0111 0000>0
    x1+x2 = 1101 0000 < 0,  结果错误有溢出 OF=1, 有溢出、无进位

    x1=0011 1100 , x2 = 1111 0010
    x1+x2 = (1)0010 1110, 结果正确,不会溢出(正加负)OF=0, 有进位 CF=1,无溢出、有进位

    展开全文
  • 进位标志和溢出标志的含义和理解

    千次阅读 多人点赞 2020-05-05 19:23:59
    进位标志和溢出标志 这次大概总结一下进位标志(Carry Flag, CF)和溢出标志(Overflow Flag, OF)的含义和理解方式 首先明确一点基本认识,处理器本身并不在意也不知道参与算术运算或者逻辑运算的操作数是有符号的...

    进位标志和溢出标志

    这次大概总结一下进位标志(Carry Flag, CF)和溢出标志(Overflow Flag, OF)的含义和理解方式

    首先明确一点基本认识,处理器本身并不在意也不知道参与算术运算或者逻辑运算的操作数是有符号的还是无符号的。ALU总是为给定的操作数做二进制运算,并根据结果设置相应的标志位。

    因此,视参与运算的整数的实际情况,CF或者OF会被独立的置位或者清零。他们的含义是有程序设计者赋予的,在进行无符号运算时,我们需要检查CF来确定运算结果是否正确,而在进行有符号运算时,则通过检查OF来判断结果是否发生溢出。

    1. Carry Flag

    CF 会在两种情况下变成1:

    1. 运算结果的最高有效位向更高位进位
    2. 运算结果的最高有效位从更高位借位

    只要在这两种情况以外,CF 总是0。

    2. Overflow Flag

    OF 会在下面两种情形变为1:

    1. 两个最高有效位均为0的数相加,得到的结果最高有效位为1
    2. 两个最高有效位均为1的数相加,得到的结果最高有效位为0

    除了这两种情况以外,OF 为0。

    使用补码表示有符号数时,最高有效位为0表示正数,最高有效位为1表示负数。因此上面的论述也可以表示为,两个正数相加得到负数,或者两个负数相加得到正数OF 置位,否则复位。

    对于减法来说也是一样的,正数减去负数得到负数,或者负数减去正数得到正数OF 置位,否则均复位。

    有符号数溢出总是发生在 0x7f-0x80 这个位置,也就是符号改变的时候。异号的两个数字求和结果位于他们之间,只要操作数本身没有溢出那么结果肯定就不会溢出,因此正数和负数相加不可能导致 OF 置位。

    此外,OF 还有另一种理解方式,当次高位向最高有效位的进位值和最高有效位的溢出值不同的时候,OF 为1,否则为0。显然这个规律可以通过亦或运算来表示:$OF=Carray_In \bigoplus Carry_Out $ 。

    展开全文
  • 加法器中进位溢出位的区别 二级标题 三级标题 四级标题 五级标题 六级标题

    一:加法器中进位与溢出位的区别

    1.首先要说的是,对于无符号数我们讨论的是它的进位位;对于有符号数我们讨论的是它的溢出位,因为有符号数的进位位就是溢出位。
    2.在微机原理或计算机运算中,进位是指运算的结果对更高一位形成+了1的进位或-1的借位,进位标志位表示为CF(Carry Flag);溢出是指运算的结果超出了规定位宽所能装载的数值范围,溢出标志位表示为OF(Overflow Flag).。
    3.进位与溢出对运算结果的影响:通过以下一个例子的对比来讨论无符号数的进位标志位和有符号数的溢出标志位对结果的影响:
    假设研究对象是8位数据的加法器,则对于无符号数其表示范围是0-255,有符号数其表示范围为-128~127。
    那计算机是如何知道现判断的是无符号数还是有符号数的呢?
    通常计算机会直接把对象当作无符号数来处理,但是具体要用哪个标志位(OF或CF)则由程序员自行决定。
    (1)溢出标志位:
    以 7FH(0111 1111B)+02H(0000 0010B)=81H(1000 0001B)为例:
    如果把它当作无符号数来运算,那么运算结果是81H(+129),此时没有发生进位,即CF=0;
    如果把它当作有符号数来运算,那么运算结果是81H(由于负数以补码来表示,因此为-127),此时可以发现,结果(-127)与理论运算结果(129)不同,发生了错误,因为产生了溢出(此时溢出位OF=1)。可以发现溢出位的置位规律为:当两个相加数(A和B)的符号位相同同时它们的和与它们有不同的符号,就会产生溢出。通常溢出标志位的逻辑表达式为:
    OF=(A[n-1]&&B[n-1]&&~ sum[n-1] )+(~ A[n-1]&&~ B[n-1]&&sum[n-1]);
    (2)进位标志位:
    以1000B+1100B=10100B为例
    如果把它当作无符号数处理,则最高位的1就体现出了“进位”,此时计算结果并没有发生错误,而是在更高的bit体现了 进位,结果仍然是10100B(即十进制的20),此时进位标志位CF=1;
    如果把它当作有符号数处理,那么此时计算结果的最高位被舍弃(“弃位”),结果为0100B(也就是十进制的+4),可以发现这时出现了溢出,对结果产生了影响,溢出标志位也被置位:OF=1

    二:verilog中进位与溢出的实现

    1.四位无符号数进位加法器的实现:

    /*****带有进位标输入和输出的无符号数加法器******/
    module cf_add(a,b,cin,cout,sum);
    
    input   [3:0]a,b;
    input   cin;
    output  cout;
    output  [3:0]sum;
    
    assign {cout,sum}=a+b+cin; 
    endmodule 
    
    

    RTL仿真图解(也许是叫RTL吧QAQ)

    2.八位有符号数带溢出加法器的实现:

    module of_add(a,b,s,overflow);
    
    input [7:0] a;
    input [7:0] b;
    output [7:0] s;
    output overflow;
        
    assign s = a+b;
    assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);
        
    endmodule 
    
    /*另一种实现方法如下:
       wire [8:0] t;
    	assign t = {a[7], a} + {b[7], b};
    	assign s = t[7:0];
    	assign overflow = t[8] ^ t[7];
    */
    

    RTL电路仿真结果

    时序仿真结果(在HDLBits上有相关题目和解答 题目传送门:HDLBits中带有溢出的有符号数加法器题目; 解答传送门:知乎解答):

    本文综合自己学习中遇到的问题总结而成,同时也借鉴了其它答主的一些回答和想法,关于溢出的具体原理,csdn上也有非常好的回答:溢出和进位 By景彪
    第一次写博客,如果有漏洞或者笔误还请多多指教。

    展开全文
  • 汇编语言:进位标志溢出标志

    千次阅读 2014-06-12 15:49:58
    对于非符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出. 而对于符号数来说,不存在进位的问题.两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,...一个正数一个负数相加不可能溢出


    1、

    对于非符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出.
    而对于符号数来说,不存在进位的问题.两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了.一个正数和一个负数相加不可能溢出


    OF:溢出标志; CF:进位标志
    x1 = 01100000>0, x2 = 01110000>0
    x1+x2 = 1101000 < 0,  结果错误有溢出 OF=1, 不产生进位================有溢出、无进位

    x1=00111100 , x2 = 11110010
    x1+x2 = (1)00101110, 结果正确,不会溢出(正加负)OF=0, 有进位(1)CF=1,====================无溢出、有进位
    ps:x1, x2 为补码形式



    2、

           最近开一段逆向汇编代码,在一处if 判断语句处用到了NEG+SBB ,虽然这两个汇编的意思能理解,但是当时没理解为什么这么写,后来google之,知道了原理;详解:

          NEG指令是求补码,补码即操作数连同符号位一起求反+1,如果操作数是0的话CF标志位是0,如果不为0,CF标志位是1;
          SBB是借位减法操作,SBB dest,src;  (dest)-(src)-CF;
          例子:

    __asm

    {

    MOV EAX,1 ;EAX =1

    NEG EAX ;EAX =11111111,CF = 1

    SBB EAX,EAX ;EAX = -1,CF =1;

    INC EAX ;EAX = 0;

    }

    __asm

    {

    MOV EAX,0 ;EAX = 0

    NEG EAX ;EAX = 0000001,CF = 0

    SBB EAX,EAX ;EAX = 0

    INC EAX ;EAX = 1

    }

    最终EAX的结果只有0或者1,所以可以表示代码如下:

    if(flag == 0)

    return TRUE;

    else

    return FALSE;

    cpu 这样做的原因是算术运算取代了逻辑运算,缩短了运行时间;

    ===================================================


    neg eax  
    sbb eax,eax  
    and al,0fc;ofc是-4  
    add eax,5  
    解释:如果eax为0,neg eax之后cf=0;那么sbb eax,eax之后eax就为0,al自然也是0,那么and al,ofc之后al还是0,eax也是0,再接着add eax,5之后eax就是5
    如果eax不是0,neg eax 之后cf=1,那么sbb eax,eax之后eax就是-1,-1的二进制就是:0xFFFFFFFF,那么al就是0xFF,所以and al,0fc之后al中的值就是0fc,eax就是0xFFFFFFFC,也就是-4,那么add eax,5之后eax就是1.


    综上:这段代码的作用就是当eax为0时,把eax改为5,当eax为非0时,eax改为1(这段代码可以用来优化c语言中的“0为假,非零即为真”的if语句).而这段代码没有用到条件分支就实现了条件分支的作用,可以用来优化代码。




    3、

    NEG 的操作是:0-操作数 没错。
    并且使得CF=1(但是对0求补除外)这是汇编的规定。
    而且对-128,-32768,-2147483648等数求补时,OF=1,其余情况OF=0,这也是汇编的规定。

    mov eax, 1
    neg eax
    //neg指令后,eax 值为 0xFFFFFFFF,同时EFL标识寄存器中CF=1

    mov eax, -1
    neg eax
    //neg指令后,eax 值为 0x00000001,同时EFL标识寄存器中CF=1

    mov eax, 0
    neg eax
    //neg指令后,eax 值为 0x00000000,同时EFL标识寄存器中CF=0

    展开全文
  • Verilog实现4位带符号加法器,带有上益出溢出标志位,内含TestBench代码,可直接使用。代码简单修改即可宽展至任意位数的加法器。
  • 进位/借位标志CF和溢出标志OF

    万次阅读 多人点赞 2019-10-15 18:04:18
    溢出概念与判别方法 什么是溢出溢出是指运算结果超过了数的表示范围。通常,称大于机器所能表示的最大正数为上溢,小于机器所能表示的最小负数为下溢。 计算机使用固定长度的机器数来表示数的,其所能表示的...
  • 溢出和进位的区别

    万次阅读 2016-09-19 16:26:05
    区别: 1. 溢出是错误,进位不是错误 2.溢出是有符号数相加发生的错误: 如 两个正数相加=负数,两个负数相加=正数; 进位是无符号数运算结果超出范围。
  • 溢出OF和进位CF标志位的判定

    万次阅读 多人点赞 2018-06-27 10:38:26
    CF是无符号数溢出标志,OF是有符号数溢出标志。通俗一点说就是,即使有符号数相加/相减导致了CF=1也没什么意义,不能说明结果的正确与否。此时,OF=1,则说明结果溢出,出现错误;OF=0,说明结果正确。这个过程根本...
  • 考虑溢出的4位全加器的Verilog代码:代码文件://4位全加器_行为描述语言 module adder4( input wire [3:0] a, input wire [3:0] b, output reg [3:0] s, output reg cf, output reg ovf ); reg ...
  • 汇编语言中溢出和进位的区别

    千次阅读 2013-12-14 15:50:48
    所以实际上of是表示有符号数的溢出,cf是表示无符号数的溢出。  理解进位,从af位的设置更为容易。 其他回答 A的补码与B的补码计算后( 加减)为C的补码  把C的补码看成无符号数,意义与
  • ORG 0000H MOV A, #1MOV R0,#126ADD A, R0 NOPEND A R0 A结果 CY A(s) R0(s) A结果(s) OV 1 126 127 0 1 126 127 0 1 127 128 ...1...
  • 进位溢出

    千次阅读 2011-07-25 13:33:28
    对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出而对有符号数来说,不存在进位的问题一个字节(8位) 的数有256个 (2的8次方)一个字(16位) 的数有65536个 (2的16次方)8个二进制位能够表达的无符号...
  • 用verilog语言编写的补码加减法器,其中三位数值为,一位符号位。
  • 判断OF ...Cn表示第n位是否发生进位,如是,则为1,否则为0 这里的第n位指的是机器数的最高位,第n-1位就是...两数相加时,如果最高位有进位,则CF=1,否则为0 两数相减时,如果被减数最高位有借位,则CF=1,否则为0 ...
  • OF是有符号数溢出标志。 OF=Cn⊕Cn-1(Cn表示第n位的进位,Cn-1表示第n-1位的进位)。 二、进位CF标志位的判定。 CF是无符号数溢出标志。 CF=Cn⊕Sub(Cn表示第n位的进位,Sub表示做减法)。 三、符号SF标志位...
  • 补码加减法判断进位判断是否溢出的总结

    万次阅读 多人点赞 2016-09-18 00:45:19
    通常我们说的加减法进位方式判断是否溢出一般指的都是补码方式运算下的。无论是以为符号位还是两位符号位,逻辑是相同的。先由一位符号位说起。 假设是5位机器位,一位用作符号位,四位用作数据位,那么数据的表示...
  • 进位CF 溢出OF

    千次阅读 2018-05-03 15:19:43
    进位标识CF(Carry Flag)针对无符号数加法。 溢出标识OF(OverFlow Flag)针对有符号数加法。 假设数值用3位二进制表示。...顺时针代表正数,逆时针代表负数,-17是同一个位置,17就互为补...
  • 关于进位和溢出,我一直分不清楚,直到最近重新学习汇编语言,我对这两个概念产生了新的理解。 下面是代码,我把说明放在代码注释中了。 ;//数据传输示例 .386 .model flat, stdcall .stack 4096 ExitProcess PROTO,...
  • 溢出和进位

    万次阅读 多人点赞 2012-07-02 17:46:25
    溢出进位 对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出 而对有符号数来说,不存在进位的问题 一个字节(8位) 的数有256个 (2的8次方) 一个字(16位) 的数有65536个 (2的16次方) 8个二...
  • 溢出OF进/借位CF标志位的判定

    千次阅读 2020-12-19 12:16:23
    CF是无符号数溢出标志,OF是有符号数溢出标志。 通俗一点说就是,即使有符号数相加/相减导致了CF=1也没什么意义,不能说明结果的正确与否。此时,OF=1, 则说明结果溢出,出现错误;OF=0,说明结果正确。这个过程...
  • CPU如何区分溢出和自然进位? 之前学习补码的时候倒是学会了基本概念,但是最近又接触时发现还有不清楚的地方,所以又研究了下 今天的核心问题的“CPU是如何区分高位自然舍弃和溢出的?” 先给出结论:如果运算中,...
  • 次高位进位,最高位没进位溢出。没进位 次高位没进位,最高位进位溢出进位 次高位进位,最高位进位,没溢出但是进位了。 总结: 判断是否进位时,将两个数都当作无符号数,判断是否进位 判断是否溢出时,将...
  • 溢出OF和进位CF区别

    千次阅读 2012-11-21 17:20:21
    如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确 例如: 3AH + 7CH=B6H,就是58 + 124=182,已经超出-128 ~ 127范围,产生溢出,所以OF = 1; 另一方面,补码B6H表达值是-
  • 补码的加减及溢出判断、加法器

    千次阅读 2019-01-19 13:20:00
    补码的加减法: 加法: 整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1)) 小数: [A]补 + [B]补 = [A+B]补 (mod 2) 减法: 整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1)) ...补码加法运算溢出判断三种方法...
  • 汇编中的进位和溢出

    千次阅读 2012-05-27 12:50:06
    溢出标志OF和进位标志CF是两个意义不同的标志. 对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出 而对有符号数来说,不存在进位的问题 溢出是指结果超出数据所表示的范围,溢出标志位OF为1,...
  • 本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。  一、CPSR寄存器  ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。  图1 程序状态寄存器格式  状态标志位...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,379
精华内容 3,751
关键字:

进位标志和溢出标志