當我覺得有時候我的代碼將某個值視爲signed並且有時在比較值時將其視爲無符號時,我感到非常困惑。代碼如何知道值是有符號還是無符號?彙編代碼如何知道值是否已簽名或未簽名?
回答
如果您在C中聲明瞭一個無符號的變量,它將被編譯爲帶有無符號指令的彙編(通常執行起來更快) 如果您正在使用匯編,將會對一些處理器指令進行簽名必須選擇你真正需要的指示。
大多數指令(例如add/sub)都不在意,它們都是相同的指令。也許你正在考慮MIPS,那裏有ADD與ADDU,不同之處在於ADD在溢出(或類似的情況,IIRC)上觸發了異常。正常簽名與無簽名僅適用於右移,除法和完全乘法(單詞*單詞 - >雙字結果)。無論是有符號還是無符號,乘法的低半部分(即與輸入操作數相同的寬度)是相同的。 (對於2的補充)。 –
@rcgldr:我在評論中指出了所有這些情況。我想我的意思大多數是通過實際程序中的指令計數,而不是指令集中的大部分。但我的主要觀點是很多指令都沒有簽名或未簽名,它們只是指令。 **這個答案似乎意味着你總是需要不同的指令來簽名和未簽名,甚至爲了加法,情況並非如此。** –
@PeterCordes - 刪除了我之前的評論,它是爲其他文章而設,但是你已經覆蓋了它。我稍後會刪除此評論。 – rcgldr
爲什麼您認爲彙編代碼必須「知道」某個值是帶符號還是無符號?
對於大多數操作的簽署和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"
機器:在
unsigned int a, b;
if(a > b) { ... }
結果不關心或不知道什麼是簽名或你除非你是這麼說的,否則請簽署。
在彙編程序開發人員居住的層面上,機器是磚塊,你是導體。您必須足夠了解該機器的指令集的合同以及諸如flags
之類的內容才能確保確定性結果。
- 1. GDB如何知道一個值是否被簽名?
- 2. 如何知道標籤是否包含值或其他標籤?
- 3. SAML響應和斷言是否已簽名/未簽名?
- 4. JNLP:在簽名代碼中加載未簽名代碼
- 5. C++枚舉是已簽名還是未簽名?
- 6. 如何確定列是否未簽名?
- 7. 如何知道所有版本的簽名是否相同?
- 8. 在MySQL中籤名或未簽名
- 9. 代碼簽名時是否/如何避免SHA-1簽名的時間戳?
- 10. 警告代代碼已簽名apk
- 11. 如何驗證時間戳是否已正確完成已簽名代碼
- 12. 如何將未簽名的號碼轉換爲簽名號碼?
- 13. 綁定值:標籤不知道列名
- 14. 如何簽名未簽名的IPA?
- 15. 自簽名代碼簽名證書是否會擺脫「未知發佈者」警告?
- 16. 如何檢查應用程序或dmg是否已簽名?
- 17. 數字簽名/代碼簽名問題
- 18. Apache/PHP:強制執行已簽名的代碼(或已知的MD5)
- 19. Android - 我如何知道apk已經用我的密鑰簽名
- 20. 如何簽名已編譯的apk?
- 21. PDF未知簽名圖標
- 22. 未知標籤名稱「form_rest」
- 23. 未簽名簽名的jar
- 24. 應用程序失敗的代碼簽名驗證。簽名無效,或未使用Apple提交證書籤名
- 25. 代碼簽名工作中的簽名如何?
- 26. 如何讀取C++中的嵌入式代碼簽名簽名?
- 27. EV代碼簽名證書或代碼簽名證書爲Microsoft驗證
- 28. OAuth2承載令牌是否已簽名?
- 29. 檢查DLL是否已簽名C++
- 30. 檢查文件是否已簽名
如果你正在編寫彙編代碼,那麼你有責任知道何時使用哪些指令。如果您使用某種其他語言進行編程,則根據您在代碼中使用的數據類型,這將是編譯器或解釋器的職責。 – Michael
除了明確簽名或未簽名的指令:它不知道。這是*你*誰寫的代碼誰知道。例如,比較會設置或清除各種標誌,不知道您對該位模式的使用是有符號還是無符號的。您可以使用不同版本的分支指令,根據您的需要測試不同的標誌組合。如果一條指令從結果的m.s.中設置符號標誌。位,並且你的值是無符號的,那麼你簡單地忽略它。 –
你能舉個例子嗎? – fuz