NASM 中的 MOVZBQ 等价物

MOVZBQ equivalent in NASM


背景:

我一直在 Linux 系统上使用 NASM 学习 x86_64 汇编,并且正在为 strlen(const char *str)

编写子例程

我想从存储在 rax 中的指针开始复制一个字节并将其与 0 进行比较以找到字符串的结尾,但是当我使用 mov rbx, [rax] 时我没有'得到我想要的结果,后来我发现这是一种错误的方法,因为 rbx 是四字长度,而 mov 将一次复制 8 个字节。建议的解决方案是使用 bl 来代替它确实有效。

我还在 AT&T 语法中发现了 movzbq 助记符,用于复制一个字节并将其零扩展为四字,在我的新手眼中,它看起来更简洁、更准确地表示了预期的指令,但我不是只移动到 bl 但也擦除剩余的 7 个字节。


问题:

在 NASM 中是否有等同于 movzbq 和其他 AT&T mov 变体的版本?

movzbq rbx, [address]mov bl, [address] 哪个更好?


谢谢,

在 Intel 语法中,内存操作数的大小由操作数上的前缀指示。所以你会写 movzx rbx, byte [address].

但是,写入 32 位寄存器会自动零扩展到 64 位寄存器。所以 movzx ebx, byte [address] 是等价的并且节省了一个字节的代码(不需要 REX 前缀)。

通常 movzx ebx, byte [address]mov bl, [address] 更可取,因为它会覆盖整个寄存器。在某些情况下,写入字节大小的寄存器可能会对性能造成轻微影响,有关详细信息,请参阅 。尽管 mov bl, [address] 的代码字节数较少,但如果您需要优化大小,这可能值得权衡。