【发布时间】:2014-01-10 17:14:01
【问题描述】:
如何从地址加载单个字节?我以为会是这样的:
mov rax, byte[rdi]
【问题讨论】:
如何从地址加载单个字节?我以为会是这样的:
mov rax, byte[rdi]
【问题讨论】:
mov al, [rdi]
将一个字节合并到 RAX 的低字节中。
或者更好的是,通过使用 MOVZX 将零扩展到 32 位寄存器(和 thus implicitly to 64 bits)来避免对 RAX 旧值的错误依赖:
movzx eax, byte [rdi] ; most efficient way to load one byte on modern x86
或者,如果您想将符号扩展至更宽的寄存器,请使用MOVSX。 (在某些 CPU 上,这与 MOVZX 一样高效。)
movsx eax, byte [rdi] ; sign extend to 32-bit, zero-extend to 64
movsx rax, byte [rdi] ; sign extend to 64-bit
MASM 等效项将 byte 替换为 byte ptr。
mov 加载不需要大小说明符(al 目标意味着 byte 操作数大小)。 movzx 总是用于内存源,因为 32 位目标无法区分 8 位和 16 位内存源。
【讨论】: