Assembly 程序集-进位标志与溢出标志

Assembly 程序集-进位标志与溢出标志,assembly,x86,carryflag,eflags,signed-overflow,Assembly,X86,Carryflag,Eflags,Signed Overflow,我有下一个代码: mov al, -5 add al, 132 add al, 1 正如我所检查的,溢出标志和进位标志将在第一个操作中设置,而在第二个操作中,仅设置溢出 但我不明白为什么: 在无符号数中,结果是143(8FH),对于该值,即fit 8位无符号数(小于255)=>不应设置进位标志。在有符号数中,结果是127,它适合8位有符号,并且不应设置溢出 怎么了?谢谢。在无符号算术中,您已将0xFB添加到0x84,即251+132,它确实大于8位,因此设置了进位标志 在第二种情况下,将+12

我有下一个代码:

mov al, -5
add al, 132
add al, 1
正如我所检查的,溢出标志和进位标志将在第一个操作中设置,而在第二个操作中,仅设置溢出

但我不明白为什么:

  • 在无符号数中,结果是143(8FH),对于该值,即fit 8位无符号数(小于255)=>不应设置进位标志。在有符号数中,结果是127,它适合8位有符号,并且不应设置溢出

  • 怎么了?谢谢。

    在无符号算术中,您已将
    0xFB
    添加到
    0x84
    ,即251+132,它确实大于8位,因此设置了进位标志


    在第二种情况下,将+127与1相加,这确实超出了有符号8位范围,因此设置了溢出标志。

    当两个正数相加的结果为负数或负数时,会发生溢出 两个负数相加的结果是正数。 例如:
    +127+1=?

    +127=0111 1111
      +1=0000 0001
         ---------
         1000 0000 
    
    当我们看两个操作数的符号位和
    结果,我们发现发生了溢出,并且答案不正确。

    因此,仅当我执行“添加al,1”时才设置溢出?如果我删除这一行,溢出将不会设置?@Tom:溢出将由
    add
    指令设置。因此,您可以向我解释溢出设置在哪里?因为据我所知,在-128到127范围内不会影响溢出。@Tom O:将所有值转换为有符号8位。在第一个
    add
    中,您正在执行-5+-124,这超过了-128。在第二个
    add
    中,您正在执行+127++1,这超过了+127。当我们添加两个负数时,V标志也变为1,结果为0。如果我们
    添加r0、r1、r0
    ,其中
    r0=0x8000000
    r1=0x8000000
    ,执行后,
    Z=1
    C=1
    V=1
    请参阅了解进位与溢出条件/标志,