2016-11-12 60 views
1

我中遇到的兩種可能性是怎麼進位標誌可以進行設置:subq和cf如何協同工作?

0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00

(下劃線以示字節)

,如果這樣做是通過減法,我們就不得不借從一點我們沒有,這應該CF設置爲1

不過,我是個ALU不會減,而只是增加了兩個互補的印象。 0x80_00_00_00_00_00_00_00的二進制補碼是0x80_00_00_00_00_00_00_00。所以, 0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00不攜帶任何位了63位,這將設置CF爲0

以下哪種情況下是有效的在x86的64位值嗎?

是否ALU實際執行減法還是它轉換成2的補和轉化價值做減法?

感謝

+2

你爲什麼不嘗試它? x86會減去,所以它會將CF設置爲1.一些體系結構確實使用CF進行減法運算。 – Jester

+0

我不知道如何測試這個?我怎麼去看看結果?我在介紹系統類;一切都在C.我可以查看反彙編,但我不知道如何查看狀態寄存器?我可以編程一些東西來嘗試推斷髮生了什麼,但我很想知道如何實際查看標誌。 –

+0

使用調試器。 '(gdb)p $ eflags'給出'$ 1 = [CF PF SF IF OF]'另外,如果你用C編碼,你爲什麼要關心標誌?編譯器會照顧他們...... – Jester

回答

1

Understanding Carry vs. Overflow conditions/flags瞭解更多關於隨身攜帶。

當然是SUB的任何實現仍具有保持相同的架構可見的行爲,其中包括標誌結果。

不要緊的ALU的內部工作原理,只有結果是什麼,零負非零產生進位,所以所有的x86 CPU會在這種情況下設定CF。任何不是不是x86的CPU。

請參閱參考資料,以英特爾的x86手冊(和很多其他不錯的鏈接)的標籤維基;我確定在官方手冊的某處有一段關於設置標誌的行爲。