我知道這是一個非常簡單的問題,但我找不到答案。 x86彙編(eax,ebx edx等)中的寄存器是否有符號或無符號?如果他們是默認簽名的,計算機如何知道將寄存器視爲無符號的,例如我們將聲明一個變量爲unsigned int?謝謝!裝配x86寄存器有符號或無符號
2
A
回答
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。 –
相關問題
- 1. 存放無符號長值寄存器
- 2. SSE無符號/符號的16位寄存器減法
- 3. 6502使用帶符號或無符號8位寄存器(JAVA)嗎?
- 4. C++有符號/無符號不匹配
- 5. C89:有符號/無符號不匹配
- 6. 裝配程序與無符號/有符號除法
- 7. strcmp()和有符號/無符號字符
- 8. 如何用c語言初始化寄存器無符號長
- 9. 核心數據錯誤與字符串符號寄存器
- 10. 如何比較x86程序集中的有符號值和無符號值
- 11. 爲什麼x86(-64)上的有符號和無符號乘法不同指令?
- 12. 裝配符號說明lea
- 13. 6502存儲器中存儲的字節是有符號還是無符號?
- 14. RAND_MAX宏:有符號還是無符號?
- 15. 有符號和無符號整數?
- 16. Integer.parseInt() - 有符號和無符號數
- 17. C++ 11類型(有符號+無符號)?
- 18. 警告C4018:'>':有符號/無符號不匹配
- 19. C++警告C4018:'<':有符號/無符號不匹配
- 20. Wire.read返回有符號或無符號值
- 21. 默認int類型:有符號或無符號?
- 22. LEA是否執行有符號或無符號算術?
- 23. Intel x86彙編語法寄存器中的括號
- 24. 符號 - 無符號轉換
- 25. 無法解析符號'適配器'
- 26. 讓VS編譯器捕獲有符號/無符號的賦值?
- 27. 的x86寄存器值
- 28. 將無符號字符與有符號字符進行比較
- 29. (無符號*)優於(無符號整型*)解析內存?
- 30. 將地址作爲符號載入通用寄存器
寄存器只保存固定的位數。使用的指令將決定如何處理這些位。記憶也是如此。 – Jeff
對於有符號或無符號值,某些指令(如加法或減法)是相同的。借位/進位標誌的設置假定數字是無符號的,而溢出標誌是在假設數字被簽名的情況下設置的。其他指令(如乘法或除法)具有已簽名和未簽名的版本。大多數設置符號的指令會將符號標誌(SF)設置爲等於結果的最高有效位,如果該數字被假定爲有符號的,則爲符號標誌。 – rcgldr
類型是由高級語言提供的錯覺。 – harold