2016-10-27 70 views
0

當我覺得有時候我的代碼將某個值視爲signed並且有時在比較值時將其視爲無符號時,我感到非常困惑。代碼如何知道值是有符號還是無符號?彙編代碼如何知道值是否已簽名或未簽名?

+2

如果你正在編寫彙編代碼,那麼你有責任知道何時使用哪些指令。如果您使用某種其他語言進行編程,則根據您在代碼中使用的數據類型,這將是編譯器或解釋器的職責。 – Michael

+0

除了明確簽名或未簽名的指令:它不知道。這是*你*誰寫的代碼誰知道。例如,比較會設置或清除各種標誌,不知道您對該位模式的使用是有符號還是無符號的。您可以使用不同版本的分支指令,根據您的需要測試不同的標誌組合。如果一條指令從結果的m.s.中設置符號標誌。位,並且你的值是無符號的,那麼你簡單地忽略它。 –

+0

你能舉個例子嗎? – fuz

回答

1

如果您在C中聲明瞭一個無符號的變量,它將被編譯爲帶有無符號指令的彙編(通常執行起來更快) 如果您正在使用匯編,將會對一些處理器指令進行簽名必須選擇你真正需要的指示。

+0

大多數指令(例如add/sub)都不在意,它們都是相同的指令。也許你正在考慮MIPS,那裏有ADD與ADDU,不同之處在於ADD在溢出(或類似的情況,IIRC)上觸發了異常。正常簽名與無簽名僅適用於右移,除法和完全乘法(單詞*單詞 - >雙字結果)。無論是有符號還是無符號,乘法的低半部分(即與輸入操作數相同的寬度)是相同的。 (對於2的補充)。 –

+0

@rcgldr:我在評論中指出了所有這些情況。我想我的意思大多數是通過實際程序中的指令計數,而不是指令集中的大部分。但我的主要觀點是很多指令都沒有簽名或未簽名,它們只是指令。 **這個答案似乎意味着你總是需要不同的指令來簽名和未簽名,甚至爲了加法,情況並非如此。** –

+0

@PeterCordes - 刪除了我之前的評論,它是爲其他文章而設,但是你已經覆蓋了它。我稍後會刪除此評論。 – rcgldr

3

爲什麼您認爲彙編代碼必須「知道」某個值是帶符號還是無符號?

對於大多數操作的簽署和usigned操作的結果是一樣的:

signed int a = 5; 
signed int b = -6; // 0xFFFFFFFA 
signed int c; 
c = a + b; // results in -1 which is 0xFFFFFFFF 

和:

unsigned int a = 5; 
unsigned int b = 0xFFFFFFFA; 
unsigned int c; 
c = a + b; // results in 0xFFFFFFFF 

有些例外的是分工和比較。在這種情況下,大多數CPU對已簽名和未簽名的操作有不同的彙編指令。這裏的例子是x86彙編,但MSP430應該是相似的:

signed int a, b; 
if(a > b) { ... } 

結果:

mov eax, [a] 
cmp eax, [b] 
jle elsePart ; Note the "L" in "jle" 

和:

mov eax, [a] 
cmp eax, [b] 
jbe elsePart ; Note the "B" in "jbe" 
2

機器:在

unsigned int a, b; 
if(a > b) { ... } 

結果不關心或不知道什麼是簽名或你除非你是這麼說的,否則請簽署。

在彙編程序開發人員居住的層面上,機器是磚塊,你是導體。您必須足夠了解該機器的指令集的合同以及諸如flags之類的內容才能確保確定性結果。

相關問題