加減都是一樣的,實際上減法就是當作加法運算的。
在 rflags 暫存器裡的下面三個標誌位記錄溢位, 符號和進位狀態:
1. 溢位產生的條件
我們看看下面這個式子,為了簡單,作為例子我用 4 位數計算。
1.1 產生溢位
上面的式子中,式子1 在 unsigned 數前提下 7 加 7 結果等於 14,這個結果看似正確。實際上它產生了 Overflow(溢位),結果超出了 4 位數能表達的範圍,這是因為:當用來表達 signed(符號數)時,結果值 1110 卻是 -2,那麼 7 + 7 = -2 這顯示是錯誤的,因此這裡產生了溢位(超過了表達範圍)。而式子2 是正確的。
在上面兩個式子中,我們可以得到規律:
接著再看下面的式子:
再來看看上面兩個式子,式子1 在 singed 數的前提下 (-4) + (-8) = 4,結果很顯然是錯誤的,因此這個式子也產生了溢位。而式子2 中, (-4) + (-1) = (-5) 這是正確的。
同樣我們得到規律是:
1.2 不產生溢位
最後再看看這個式子,在 signed 數的情況下:(-1) + 7 = 6 這個結果是正確的,因此這個式子不會產生溢位。
1.3 溢位總結
現在我們可以總結產生溢位的條件:
換個角度來說:
那麼是什麼情況不會產生溢位的?
那麼我們也可以得出同符號數相減,也不會產生溢位,例如:(-1) - (-1) = -1 + 1 = 0 這個式子是兩個負數相減,等同於負數加正數,這不會產生溢位。
2. 產生進位與借位
上面 5 個式子中,有 3 個產生了進位情況,以 4 位數為例,當計算的結果高最位向上進一位時,就會產生進位情況,看看其中一個式子:
計算結果向上進了 1 位,結果依然是正確的,rflags.CF 被置為 1,rflags.OF 被清 0,如果被作為 unsigned 數進行計算時:12 + 15 = 27,4 位數表達的結果為 11,這時需要得到正確結果,需藉助 CF 標誌。在這裡 CF 被置位。
當然這裡還會產生一個借位的情況,下面這個式子:
兩個數相減,最高位不足減,向前借位,這種情況下也會產生 rflags.CF = 1
3. 符號位
數的最高位描述符號位,以 4 位數為例,最高位 Bit 3 是符號位,rflags.SF 會根據計算結果置相應的位,rflags.SF = 1 時表示為負數,而 rflags.SF = 0 則為正數。
4.零標誌位
ZF 標誌位就簡單了,當運算的結果值為 0 時,ZF = 0
加減都是一樣的,實際上減法就是當作加法運算的。
在 rflags 暫存器裡的下面三個標誌位記錄溢位, 符號和進位狀態:
OF(Overflow Flag)SF(Sign Flag)CF(Carry Flag)ZF(Zero Flag)1. 溢位產生的條件
我們看看下面這個式子,為了簡單,作為例子我用 4 位數計算。
1.1 產生溢位
上面的式子中,式子1 在 unsigned 數前提下 7 加 7 結果等於 14,這個結果看似正確。實際上它產生了 Overflow(溢位),結果超出了 4 位數能表達的範圍,這是因為:當用來表達 signed(符號數)時,結果值 1110 卻是 -2,那麼 7 + 7 = -2 這顯示是錯誤的,因此這裡產生了溢位(超過了表達範圍)。而式子2 是正確的。
在上面兩個式子中,我們可以得到規律:
正數 + 正數 = 負數,就產生了溢位接著再看下面的式子:
再來看看上面兩個式子,式子1 在 singed 數的前提下 (-4) + (-8) = 4,結果很顯然是錯誤的,因此這個式子也產生了溢位。而式子2 中, (-4) + (-1) = (-5) 這是正確的。
同樣我們得到規律是:
負數 + 負數 = 正數,就產生了溢位1.2 不產生溢位
最後再看看這個式子,在 signed 數的情況下:(-1) + 7 = 6 這個結果是正確的,因此這個式子不會產生溢位。
1.3 溢位總結
現在我們可以總結產生溢位的條件:
兩個正數相加,如果結果為負數,就產生了溢位。兩個負數相加,如果結果為正數,就產生了溢位。換個角度來說:
正數 - 負數 = 負數,就產生了溢位。負數 - 正數 = 正數,就產生了溢位。那麼是什麼情況不會產生溢位的?
不同符號的兩個數相加,不會產生溢位。那麼我們也可以得出同符號數相減,也不會產生溢位,例如:(-1) - (-1) = -1 + 1 = 0 這個式子是兩個負數相減,等同於負數加正數,這不會產生溢位。
2. 產生進位與借位
上面 5 個式子中,有 3 個產生了進位情況,以 4 位數為例,當計算的結果高最位向上進一位時,就會產生進位情況,看看其中一個式子:
計算結果向上進了 1 位,結果依然是正確的,rflags.CF 被置為 1,rflags.OF 被清 0,如果被作為 unsigned 數進行計算時:12 + 15 = 27,4 位數表達的結果為 11,這時需要得到正確結果,需藉助 CF 標誌。在這裡 CF 被置位。
當然這裡還會產生一個借位的情況,下面這個式子:
兩個數相減,最高位不足減,向前借位,這種情況下也會產生 rflags.CF = 1
3. 符號位
數的最高位描述符號位,以 4 位數為例,最高位 Bit 3 是符號位,rflags.SF 會根據計算結果置相應的位,rflags.SF = 1 時表示為負數,而 rflags.SF = 0 則為正數。
4.零標誌位
ZF 標誌位就簡單了,當運算的結果值為 0 時,ZF = 0