Assembly 如何从程序集中的地址加载单个字节

Assembly 如何从程序集中的地址加载单个字节,assembly,x86,nasm,Assembly,X86,Nasm,如何从地址加载单个字节?我以为会是这样的: mov rax, byte[rdi] 将一个字节合并到RAX的低位字节中 或者更好的方法是,通过将零扩展到32位寄存器(and)中,避免对RAX的旧值的错误依赖: 或者,如果您想将签名扩展扩展到更广泛的寄存器中,请使用。(在某些CPU上,这与MOVZX一样高效。) MASM等价物将字节替换为字节ptr mov加载不需要大小说明符(aldestination意味着byte操作数大小)movzx对于内存源始终如此,因为32位目标无法消除8位

如何从地址加载单个字节?我以为会是这样的:

mov      rax, byte[rdi]
将一个字节合并到RAX的低位字节中


或者更好的方法是,通过将零扩展到32位寄存器(and)中,避免对RAX的旧值的错误依赖:

或者,如果您想将签名扩展扩展到更广泛的寄存器中,请使用。(在某些CPU上,这与MOVZX一样高效。)


MASM等价物将
字节
替换为
字节ptr

mov
加载不需要大小说明符(
al
destination意味着
byte
操作数大小)
movzx
对于内存源始终如此,因为32位目标无法消除8位和16位内存源之间的歧义

mov al, [rdi]
movzx  eax, byte [rdi]          ; most efficient way to load one byte on modern x86
movsx  eax, byte [rdi]    ; sign extend to 32-bit, zero-extend to 64
movsx  rax, byte [rdi]    ; sign extend to 64-bit