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]
的代码字节数较少,但如果您需要优化大小,这可能值得权衡。
背景:
我一直在 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]
的代码字节数较少,但如果您需要优化大小,这可能值得权衡。