将一个字节存储到寄存器x86-64程序集中的问题

时间:2013-10-22 22:51:40

标签: assembly x86-64

我正在尝试编写一个函数来确定作为第一个参数给出的字符串的长度,因此%rdi将包含char * ptr。当我调用movb (%rdi),%rcx将%rdi指向的字符移动到%rcx时,我收到以下错误:
incorrect register '%rdx' used with 'b' suffix 据我所知,只有某些寄存器可以在x86-64中保存一个字节,那么我可以使用哪些寄存器将字节移入?或者是我用来提取字符串中每个字节的字符不正确的方法?

1 个答案:

答案 0 :(得分:2)

所有通用寄存器都具有低8位,可单独寻址为alblcldlsil,{{1 },dilbplsplr8b(英特尔文档使用r15b后缀)。此外,少数位8..15也可寻址,即lahbhch

因此,如果您只想加载一个字节,则可以使用上述之一。或者,您可以使用零或符号扩展来扩展字节数据,例如在您的情况下dh(读取:将零扩展字节移动到长)。注意,在32位寄存器上操作会将“父”64位寄存器的前32位归零,但在8位或16位子寄存器上操作会使其余位保持不变。

我觉得你应该(重新)阅读intel手册的基本架构部分。