2010-05-24 74 views
1

假設AX = 8FFE和BX = 0FFF
現在,如果我們寫現在符號標誌和溢出標誌根據預期

Cmp ax,bx 

在這一點上會發生什麼事是,源(BX)將不工作從目的地(ax)中減去並且適當的標誌將被更新。由於計算機以2的補碼形式表示每個數字,因此8FFE是某個數字的2的補碼。0FFF是某個數字的2的補碼。

正如在2的補碼中減法是通過加法實現的,所以我們通過將它們轉換成二進制來添加這兩個數字。

8FFE----------> 1000 1111 1111 1110 
0FFF----------> 0000 1111 1111 1111 
        -------------------------------- 
        1001 1111 1111 1101 

現在這是十六進制9FFD的結果。

正如您所看到的,沒有發生溢出並且符號位是結果1。

問題:這個想象力的符號標誌應當設置和溢出標誌
應該保持0,我在調試器中檢查了這一點,但我發現它
即 對面,符號標誌保持爲0和溢出標誌是1. 現在請告訴我爲什麼
發生?

+1

你忘了補充BX。 – starblue 2010-05-24 15:04:46

+0

謝謝先生,我明白你的觀點,我現在沒有困惑 – 2010-05-24 18:50:10

回答

2

我認爲你做了不正確的減法。我的結果是:

8FFE----------> 1000 1111 1111 1110 
0FFF----------> 0000 1111 1111 1111 
        ---------------------------------- 
7FFF----------> 0111 1111 1111 1111  

發生了什麼事是操作只從符號位借用。這意味着應設置標誌。在這裏閱讀about assembly CF(Carry) and OF(Overflow) flag,http://en.wikipedia.org/wiki/Carry_flag,http://en.wikipedia.org/wiki/Overflow_flag。這意味着它被簽名的操作是不正確的。如果它沒有簽名,那就好了。

+0

但先生的電腦代表所有的數字在2的補碼形式和減法是通過加法實施,所以你爲什麼減去而不是添加他們證明你的回答 – 2010-05-24 12:18:18

+0

@Zia你拉赫曼: 你是對的。但要記住'a - b = a +( - b)'無論編碼如何。如果你計算-b爲2的comp:F001並且加上你會得到和我一樣的結果 – Andrey 2010-05-24 12:57:10

+0

謝謝你sir非常有用的評論我現在有了這個想法。 – 2010-05-24 18:49:36