我想寫一個函數來確定作爲第一個參數給出的字符串的長度,所以%rdi將包含char * ptr。當我呼叫movb (%rdi),%rcx
將%rdi指向的字符移動到%rcx時,出現以下錯誤:
incorrect register '%rdx' used with 'b' suffix
據我所知,只有某些寄存器可以在x86-64中保存一個字節,所以可以使用哪些字節將字節移入?或者是我用來提取字符串中每個字節的字符不正確的方法?問題存儲一個字節到寄存器x86-64程序集
0
A
回答
2
所有通用寄存器具有的低8位可單獨尋址的作爲al
,bl
,cl
,dl
,sil
,dil
,bpl
,spl
,r8b
通過r15b
(英特爾文檔使用l
後綴)。此外,少數幾個比特也是可尋址的,即ah
,bh
,ch
和dh
。
所以,如果你只想加載一個字節,你可以使用上述之一。或者,您可以使用零或符號擴展來擴展字節數據,例如在您的情況下movzbl (%rdi), %ecx
(讀取:將零擴展字節移至較長的)。請注意,對32位寄存器進行操作會使「父」64位寄存器的前32位爲零,但在8或16位子寄存器上操作會使其餘位保持不變。
我覺得你應該重新閱讀intel手冊的基本體系結構部分。
相關問題
- 1. x86程序集MOV指令 - 寄存器到寄存器和存儲器到存儲器
- 2. 存儲字節在寄存器變量
- 3. x86程序集從32位寄存器中獲取一個字節
- 4. 程序集retn,jmp,進程寄存器
- 5. 從多個寄存器中收集特定元素並存儲到一個寄存器
- 6. sparc程序集和%y寄存器
- 7. 程序集 - .data,.code和寄存器...?
- 8. 寄存器值問題
- 9. 如何在EBX寄存器中存儲連續的字節
- 10. 存儲在寄存器中的測試字節mips
- 11. 寫浮動到一個4字節的寄存器
- 12. 將兩個x86 32位寄存器存儲到128位xmm寄存器中
- 13. XMM寄存器存儲
- 14. MIPS:將寄存器地址複製到另一個寄存器
- 15. 存儲最後一個重複到寄存器
- 16. 讀取文件和存儲內容到一個寄存器
- 17. Java字節數組到Delphi字節寄存器
- 18. 複製兩個字節到整個寄存器
- 19. 主題所需的寄存器集
- 20. 訪問一個SSE寄存器變量
- 21. 程序集如何保存和恢復寄存器
- 22. 按字節填充xmm寄存器
- 23. 把兩個數字到EAX寄存器
- 24. 將字符從字符串移到程序集中的寄存器
- 25. 寫入寄存器的下一個字節
- 26. 函數來設置一個2字節的寄存器
- 27. 溢出一個寄存器
- 28. 程序集8086:僅彙總MOV和LEA的2個寄存器
- 29. 從DX:AX寄存器移動到單個32位寄存器
- 30. 如何將數據存儲在存儲器或寄存器中
+1,使用零/符號擴展很重要,如果您保留較高的字節,則會創建錯誤的依賴關係並在整個位置引入隱式合併,這可能會帶來相當大的損失! – Leeor