关于标志信息ZF、OF、SF、CF的理解
帶標志加法器結構
零標志ZF
零標志是根據每一位加法器的計算結果FiF_iFi?相或得到的,所以只有在結果的每一位都為0的時候所有位相或才能得到0的輸出,但是或門上有取反符號,所以在ZF標志的輸出為1時代表結果全零,反之不全為0.
溢出標志OF
注意OF是判斷帶符號數是否溢出的,對于無符號數OF不能用作溢出的判斷,因為如果兩個高位為0的數相加,得到的結果高位為1,明顯對于無符號數這種情況是可以成立的,但是對于帶符號數,證明其得到的結果是負數,由兩個正數做和還得到了一個負數結果明顯是溢出。所以在OF為溢出的情況下,對于無符號數是不能由此就判斷無符號數的結果是否溢出的。
由上面的加法器結構可以看到,判斷溢出沒有可以通過最高位的Cout(Cn)C_{out}(C_n)Cout?(Cn?)和Cn?1C_{n-1}Cn?1?求異或得到。下面是所有的輸入輸出情況可見,最高位的Cout(Cn)C_{out}(C_n)Cout?(Cn?)與Cn?1C_{n-1}Cn?1?與OF之間是滿足異或關系的。
符號標志SF
表示帶符號整數加減運算結果的符號位,因此直接取結果的最高位作為SF。
進/借位標志CF
之前說的判斷帶符號數的溢出標志是OF,那么現在判斷無符號數的溢出標志就是CF,同樣CF只能判斷無符號數是否溢出(溢出為1,反之為0),而不能判斷帶符號數的溢出情況。
其實這四個標志里CF是最令我費解的。由結構圖可知CF=Cout(Cn)⊕CinCF=C_{out}(C_n)\ \oplus\ C_{in}CF=Cout?(Cn?)?⊕?Cin?求得。進位是很好理解的,進位一般是對于加法而言,而CinC_{in}Cin?是輸入加減符號的對應,所以這時候Cin=0C_{in} = 0Cin?=0,那么當Cout(Cn)=1C_{out}(C_n) = 1Cout?(Cn?)=1時CF=1CF=1CF=1表示有溢出。因為最高位處都還要向前面進位,而得到的結果會舍去最高位前面的所有值,所以自然發生了溢出。但是對于借位,我覺得真的很難理解,借位是對于減法而言的,如果在減法里還想要結果不溢出那么最高位必須讓Cout=1C_{out}=1Cout?=1才可以。對于這一點想了很久終于明白了:
我們首先以四位的數為例子,有真值為a,ba, ba,b的兩個四位無符號數。他們的機器數,也就是補碼表示為A,BA,BA,B,對于a?ba-ba?b的計算可以寫成a?b=a+[?b]補=A+[?b]補a-b=a+[-b]_{補}=A+[-b]_{補}a?b=a+[?b]補?=A+[?b]補?而對于這個[?b]補[-b]_補[?b]補?,可以通過對bbb的補碼各位取反,末位加一得到這個過程寫出來是這樣的:
1111?B+1=10000?B1111-B+1=10000-B 1111?B+1=10000?B
那么對于a?ba-ba?b可以表示成:
A?B+10000A-B+10000 A?B+10000
那么對于無符號數而言做減時得到為正數的結果自然是沒有發生溢出的,但是如果得到的結果為負數,那么必然發生溢出,而上面的式子很容易看到,經過這樣的求值過程如果說A-B是正數,那么必然會因為+10000+10000+10000而發生進位,如果A-B的值不夠為正數,那么A必然會向+10000+10000+10000借位,那么就必然不會產生進位。
綜上,CFCFCF的由來就是如此。
總結
以上是生活随笔為你收集整理的关于标志信息ZF、OF、SF、CF的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PMS系统
- 下一篇: 基于centos7.3 3.10-514