汇编语言无符号数溢出

时间:2023-02-07 01:21:24
##原文:
------
<code>
mov al,0f0H
add al,78H
</code>
add指令执行后:CF=1,OF=0.对于无符号运算,0F0H+78H 有进位,CF=1;对于有符号数运算,0F0+78H不发生溢出,0F=0

------
##个人理解:
0F0H+78H = 168H = 360 (十进制)
有符号8位所能表示范围是 -128 ~ 127
360 > 127 所以会产生 OF 有符号溢出 OF = 1
无符号8位所能表示范围是 0 ~ 255
360 > 255 所以会产生 CF 有符号溢出 CF = 1

所以文中应当OF=1

3 个解决方案

#1


对符号数来说,0F0h+78h=-10h+78h=68h,在可表示范围内,所以,没有溢出。
溢出是针对符号数的;进位是针对无符号数的说法。
所以,  add al, 78h 后,OF=0 CF=1。

#2


汇编加减法不关心,有符号无符号数
CF,OF 对于有符号无符号数,加减法结果是一样
不过, 同样的二进制数据,表示的数可能不同
对于有符号和无符号数 CF,OF标志的含义不同
CF 对于 无符号数是溢出标志,因为无符号数有进位(借位)必然会溢出,OF对于无符号数无意义。

OF对有符号数是溢出标志,
因为 CF是正常的进位(借位)标志,
OF这个标志专门用于有符号数溢出。
有符号数有进位不算溢出



#3


0xF0 对于有符号数,是负数是-16
78h 是 120
120 -16 = 104 当然没有溢出

单字节加减,除了 0x80这个数,
任何其他两个有符号数相加(减),绝对值都不会超过 255 
所以,对于有符号数,加减
进位一般不是判断,是否溢出的标志,
除非这个两个数都是0x80

#1


对符号数来说,0F0h+78h=-10h+78h=68h,在可表示范围内,所以,没有溢出。
溢出是针对符号数的;进位是针对无符号数的说法。
所以,  add al, 78h 后,OF=0 CF=1。

#2


汇编加减法不关心,有符号无符号数
CF,OF 对于有符号无符号数,加减法结果是一样
不过, 同样的二进制数据,表示的数可能不同
对于有符号和无符号数 CF,OF标志的含义不同
CF 对于 无符号数是溢出标志,因为无符号数有进位(借位)必然会溢出,OF对于无符号数无意义。

OF对有符号数是溢出标志,
因为 CF是正常的进位(借位)标志,
OF这个标志专门用于有符号数溢出。
有符号数有进位不算溢出



#3


0xF0 对于有符号数,是负数是-16
78h 是 120
120 -16 = 104 当然没有溢出

单字节加减,除了 0x80这个数,
任何其他两个有符号数相加(减),绝对值都不会超过 255 
所以,对于有符号数,加减
进位一般不是判断,是否溢出的标志,
除非这个两个数都是0x80