2014-12-28 65 views
2

我知道這是一個非常簡單的問題,但我找不到答案。 x86彙編(eax,ebx edx等)中的寄存器是否有符號或無符號?如果他們是默認簽名的,計算機如何知道將寄存器視爲無符號的,例如我們將聲明一個變量爲unsigned int?謝謝!裝配x86寄存器有符號或無符號

+2

寄存器只保存固定的位數。使用的指令將決定如何處理這些位。記憶也是如此。 – Jeff

+1

對於有符號或無符號值,某些指令(如加法或減法)是相同的。借位/進位標誌的設置假定數字是無符號的,而溢出標誌是在假設數字被簽名的情況下設置的。其他指令(如乘法或除法)具有已簽名和未簽名的版本。大多數設置符號的指令會將符號標誌(SF)設置爲等於結果的最高有效位,如果該數字被假定爲有符號的,則爲符號標誌。 – rcgldr

+4

類型是由高級語言提供的錯覺。 – harold

回答

5

CPU不知道也不在乎。相反,標誌位寄存器中的位在某些操作中設置,並且程序如何處理這些標誌取決於源代碼告訴它的內容。

例如,

mov eax, 0FFFFFFFFh 
test eax, eax 
js isNegative 

mov eax, 0FFFFFFFFh 
test eax, eax 
jb isNegative 

第一跳到 'IsNegative',因爲這裏test設置符號標誌。第二個不是,因爲test將進位標誌重置爲0,並且jb僅在1時跳轉。

0

x86中的32位寄存器默認爲無符號。例如,在長模型下,從32位操作數到64位寄存器的移動總是被零擴展。但是每條指令都有自己的解釋寄存器的基礎,如'add'指令帶寄存器有符號或無符號。你應該參考英特爾文件的細節。

+1

這是一種尷尬的方式來陳述它。在'mov eax,ecx'中,兩個操作數都是32位。寫一個32位寄存器總是[隱式零延伸到完整的64位寄存器](https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part 32位寄存器),但唯一明確*執行32-> 64位移動的方法是使用'movsxd rax,ecx'(符號擴展)。 'mov rax,ecx'不會組裝(操作數大小不匹配)。沒有32位源的'movzx'形式,因爲你不需要它(只需使用'mov')。所以實際上不可能*明確地*零擴展64。 –