2014-03-28 43 views
0
Suppose %eax contains -20 and %ecx contains -30. 
cmpl %eax, %ecx 

進行此比較時,-30 - ( - 20)= -10如此簽名標誌被設置。雖然你什麼時候將負數解釋爲無符號/有符號?在IA32中進行cmpl操作時,如何判斷某個數字是否未簽名或簽名?

Suppose %eax contains -10 and %ecx contains 20. 
cmpl %eax, %ecx 

在這個例子中,-10被解釋爲一個大的無符號數並且進位標誌被設置。爲什麼不把它解釋爲20 - ( - 10)= 30並且沒有設置標誌?

+0

你必須看看'cmpl'後通常使用條件分支的指令。 – starblue

回答

3

這沒有意義。你有32位,他們沒有簽名或沒有簽名,甚至是一個數字。這只是你對它的解釋。

cmp,像所有的ALU運算,將所有標誌(從而有效地解釋數作爲同時符號和無符號),其中包括進位標誌(解釋數字時爲unsigned這是有用的),溢出標誌(在將數字解釋爲有符號時很有用)以及符號標誌(它只是結果最高位的一個副本)。

-10和大的無符號數(4294967286)並不是真正不同的東西。它們只是查看位模式FFFFFFF6的兩種方式。

+0

謝謝,我想我現在明白了。因此,通常在確定設置了哪些標誌時,將其解釋爲無符號和有符號。 – MeesterMarcus

1

這是一個很好的做法,記住旗子正在發生什麼。 但是,您可以簡單地記住使用jge,jle,jg,gl用於簽名比較,ja,jae,jb,jbe用於無符號比較。

因此,基本上,你可能只是做無符號比較如下:

cmp ecx,eax 
ja some_label ; Jump if ecx > eax (unsigned) 

而對於符號比較

cmp ecx,eax 
jg some_label ; Jump if ecx > eax (signed). 

正如哈羅德說,當你使用CMP指令的所有標誌改變(特別是:符號標誌,溢出標誌,零標誌和進位標誌)。這是關於哪些標誌你關心哪些因素造成了不同。

相關問題