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

Assembly 将字节存储到寄存器x86-64程序集中的问题,assembly,x86-64,Assembly,X86 64,我正在尝试编写一个函数来确定作为第一个参数给定的字符串的长度,因此%rdi将包含char*ptr。当我调用movb(%rdi),%rcx将%rdi指向的字符移动到%rcx时,我得到以下错误: 与'b'后缀一起使用的寄存器'%rdx'不正确 据我所知,在x86-64中,只有某些寄存器可以保存一个字节,那么我可以使用哪些寄存器将字节移动到其中?还是我用来提取字符串中每个字节的字符的方法不正确?所有通用寄存器的低位8位可分别寻址为al,bl,cl,dl,sil,dil,bpl,spl,r8b至r15b

我正在尝试编写一个函数来确定作为第一个参数给定的字符串的长度,因此%rdi将包含char*ptr。当我调用
movb(%rdi),%rcx
将%rdi指向的字符移动到%rcx时,我得到以下错误:
与'b'后缀一起使用的寄存器'%rdx'不正确

据我所知,在x86-64中,只有某些寄存器可以保存一个字节,那么我可以使用哪些寄存器将字节移动到其中?还是我用来提取字符串中每个字节的字符的方法不正确?

所有通用寄存器的低位8位可分别寻址为
al
bl
cl
dl
sil
dil
bpl
spl
r8b
r15b
(英特尔文档使用
l
后缀)。此外,一些位8..15也可寻址,即
ah
bh
ch
dh

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


我觉得您可能应该(重新)阅读《英特尔手册》的“基本体系结构”部分。

+1,使用零/符号扩展非常重要,如果保留高位字节,则会创建错误的依赖项,并在所有地方引入隐式合并,这可能会招致相当大的惩罚!