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
正如我所检查的,溢出标志和进位标志将在第一个操作中设置,而在第二个操作中,仅设置溢出
但我不明白为什么:
怎么了?谢谢。在无符号算术中,您已将
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
请参阅了解进位与溢出条件/标志,