【汇编语言】CF OF标志位的判定

一、原理

以书中代码为例:

mov al,98
add al,99

最终的结果是OF=1(溢出),CF=0(没有进位)。
这是因为
1、对于无符号数,程序中进行的运算是98+99,也就是十六进制的62H+63H=C5H,没有产生进位。
2、对于有符号数运算,实际的结果C5H=11000101b=-59,究其原因,还是其二进制表示的的最高有效位是1,导致无符号数最高位的1从128变成了有符号数的-128,进而导致最后的结果是-59。
3、对于有符号数运算,98+99的正确结果应该是0C5H,也就是011000101b。这样,计算出来的结果为197,但是位数为9位,在寄存器al放不下,也就是溢出了,所以OF置为1。

二、范围

根据上面的例子,我们可以推导出产生进位和产生溢出的阈值。
1、对于无符号数,8位寄存器al最大可表示的二进制数为11111111b,也就是255,最小可表示的数为0,其表示范围是0~255,也就是十六进制范围:[0H,FFH]。
2、对于有符号数,8位寄存器al最大可表示的二进制数为01111111,也就是127,最小可表示的数为10000000,也就是-128,其表示范围是-128~127其十六进制范围:[80H,7FH]。
3、在进行加法运算时,一旦超出这个阈值,OF和CF的值就会产生变化。

三、示例

以书中-16-120为例1。

mov al,0F0H	;-16=0-16=00H-10H=F0H;
add al,088H	;-120=0-120=00H-78H=88H
;注意,这里都是有符号数,最高位为1时表示负数

【汇编语言】CF OF标志位的判定_第1张图片
al等于78H=01111000b=120,而-16-120显然是一个负数,最高位必然为1,如果我们假设al能再多存储一位,那么实际上al存储的结果应该是101111000b=-136。也就是说,因为al寄存器最多只能存储8位,导致9位的结果无法存储在al中,所以溢出了。故而OF置为1。
如果程序如下:

mov ax,0F0H	
add ax,088H	

【汇编语言】CF OF标志位的判定_第2张图片
结果为0178H=0000 0001 0100 1000b=136,结果正确,没有产生溢出。

以128+128为例2。

mov al,128
add al,128

【汇编语言】CF OF标志位的判定_第3张图片
1000 0000b+1000 0000b=1 0000 0000b
可以很直观得看到,最高有效位产生了进位,OF置为1,CF置为1。对于无符号数运算,结果产生了进位;对于有符号数计算,结果产生了溢出。

四、总结

1、进位针对的是无符号数的运算,当两个操作数的最高有效位在运算时产生了进位、借位,CF置为1
2、溢出针对的是有符号数的运算,当计算结果超出阈值,N位寄存器无法存储N+1位计算结果时(溢出),OF置为1

你可能感兴趣的:(汇编,汇编)