在匯編學習中,個人感覺CF與OF這兩個溢出標志還是有點難理解的。筆者也還是一知半解,若有錯誤之處,
請指正!
一、學習CF與OF,要始終牢記一點。CF是無符號數溢出標志,OF是有符號數溢出標志。
通俗一點說就是,即使有符號數相加/相減導致了CF=1也沒什么意義,不能說明結果的正確與否。此時,OF=1,
則說明結果溢出,出現錯誤;OF=0,說明結果正確。這個過程根本和CF沒關系,CF=1/0,都不會影響。同理也
可以得出OF對無符號數也無影響。
舉個例子:
[9-6]補=[9]補-[6]補=[9]補+[-6]補
[9]補-[6]補
00001001
- 00000110
——————
00000011
此時,OF=0,CF=0
[9]補+[-6]補
00001001
+ 11111010
——————
1 00000011
此時,OF=0,CF=1
大家可能已經發現了,通過公式將減法轉換成加法,貌似不完全等價,因為CF不同。
其實不然,CF的值不影響結果,此時不論是加法還是減法都是有符號數。不論CF=1/0,只要OF=0,
結果都是正確的。當然,還有一點值得注意。畢竟CF在兩種計算方法中取值不同,如果有條件跳轉
指令的話,程序的執行可能會受到影響。
二、簡單介紹下CF與OF的計算方法
1、CF的判斷
①加法
十進制角度,如果兩無符號數相加,結果大於2^n-1(n為位數),則CF=1,否則CF=0;
二進制角度,如果兩無符號數相加,最高位向前有進位,則CF=1,否則CF=0。
②減法
十進制角度,如果兩無符號數相減,減數大於被減數(也即結果不在0—2^n-1內),則CF=1,否則CF=0;
二進制角度,如果兩無符號數相減,最高位向前游借位,則CF=1,否則CF=0。
2、OF的判斷
①加法
十進制角度,如果兩有符號數相加,結果不在-2^(n-1)~2^(n-1)-1內,則OF=1,否則OF=0;
二進制角度,如果兩有符號數同號,而相加結果與之異號,則OF=1,否則OF=0。
②減法
十進制角度,如果有符號數相減結果在-2^(n-1)~2^(n-1)-1內,則OF=1,否則OF=0;
二進制角度,如果兩個數異號,而相減結果與被減數符號相反,則OF=1,否則OF=0。
三、這里值得一提的是,在第二部分介紹的計算規則,說白了都是為了方便人的計算。而在計算機中,
CPU根本不知道參與運算的數是有符號的還是無符號的。它只是按照一定的指令、一定的規則來計算,
然后設置標志、運用標志。