我正在尝试编写一个函数来确定作为第一个参数给出的字符串的长度,因此 %rdi 将包含 char *ptr。当我打电话时movb (%rdi),%rcx
将 %rdi 指向的字符移动到 %rcx 中,出现以下错误:
incorrect register '%rdx' used with 'b' suffix
据我了解,在 x86-64 中只有某些寄存器可以保存字节,那么我可以使用哪些寄存器将字节移入?或者我用来提取字符串中每个字节的字符的方法是否不正确?
所有通用寄存器的低 8 位可单独寻址:al
, bl
, cl
, dl
, sil
, dil
, bpl
, spl
, r8b
通过r15b
(英特尔文档使用l
后缀)。此外,还有一些位 8..15 也可寻址,即ah
, bh
, ch
and dh
.
所以如果你只想加载一个字节,你可以使用上面的一种。或者,您可以使用零或符号扩展来加宽字节数据,例如在您的情况下movzbl (%rdi), %ecx
(read: 将零扩展字节移至 long)。请注意,对 32 位寄存器进行操作会将“父”64 位寄存器的前 32 位清零,但对 8 或 16 位子寄存器进行操作会使其余位保持不变。
我觉得你应该(重新)阅读英特尔手册的基本架构部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)