2013-10-22 51 views
0

我想寫一個函數來確定作爲第一個參數給出的字符串的長度,所以%rdi將包含char * ptr。當我呼叫movb (%rdi),%rcx將%rdi指向的字符移動到%rcx時,出現以下錯誤:
incorrect register '%rdx' used with 'b' suffix 據我所知,只有某些寄存器可以在x86-64中保存一個字節,所以可以使用哪些字節將字節移入?或者是我用來提取字符串中每個字節的字符不正確的方法?問題存儲一個字節到寄存器x86-64程序集

回答

2

所有通用寄存器具有的低8位可單獨尋址的作爲alblcldlsildilbplsplr8b通過r15b(英特爾文檔使用l後綴)。此外,少數幾個比特也是可尋址的,即ah,bh,chdh

所以,如果你只想加載一個字節,你可以使用上述之一。或者,您可以使用零或符號擴展來擴展字節數據,例如在您的情況下movzbl (%rdi), %ecx(讀取:將零擴展字節移至較長的)。請注意,對32位寄存器進行操作會使「父」64位寄存器的前32位爲零,但在8或16位子寄存器上操作會使其餘位保持不變。

我覺得你應該重新閱讀intel手冊的基本體系結構部分。

+0

+1,使用零/符號擴展很重要,如果您保留較高的字節,則會創建錯誤的依賴關係並在整個位置引入隱式合併,這可能會帶來相當大的損失! – Leeor