1

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

4

1 回答 1

2

所有通用寄存器的低 8 位可分别寻址为al, bl, cl, dl, sil, dil, bpl, spl, r8bthrough r15b(intel 文档使用l后缀)。此外,还有一些位 8..15 也可寻址,即 ahbh和。chdh

所以如果你只想加载一个字节,你可以使用上面的一个。或者,您可以使用零或符号扩展来扩大字节数据,例如在您的情况下movzbl (%rdi), %ecx(阅读:将零扩展字节移动到 long)。请注意,在 32 位寄存器上操作会将“父”64 位寄存器的前 32 位归零,但在 8 位或 16 位子寄存器上操作会使其余位保持不变。

我觉得您可能应该(重新)阅读英特尔手册的基本架构部分。

于 2013-10-23T00:29:43.770 回答