NASM - 如何将 8 位寄存器移动到完整的 32 位寄存器?

NASM - How do you move an 8-bit register into a full 32-bit register?

我正在编写 NASM 汇编代码,并且必须进行一些索引寻址。我把索引存储在 $al 中,但是 x86 不会让你使用 $al 作为索引寄存器,而我已经在使用 $bl,所以我不能使用 $bx。所以我需要将我在 $al 中的字节放入一个 32-but 寄存器,例如 $ecx,但是,当我尝试时,它会抛出一个 invalid combination of opcode and operand 错误。有什么办法吗?

    sub     al, 97                  ; char - 97

    push    ecx                     ; b/c al cant be used as indexing register
    mov     ecx, al                 ; move byte in al into ecx

    mov     bl, [table + ecx]       ; value_at(first_table_addr + char) -> bx

    pop     ecx

使用MOVZX instruction:

movzx ecx, al  ; move byte to doubleword, zero-extension

如果您希望 al 中的值被视为已签名,还有 MOVSX

零扩展意味着目标操作数的高位将被设置为零,而符号扩展意味着目标操作数的高位将被设置为源操作数的符号位。一些例子:

mov al,0x7F
movzx ebx,al   ; ebx = 0x0000007F
movsx ebx,al   ; ebx = 0x0000007F

mov al,0x80
movzx ebx,al   ; ebx = 0x00000080
movsx ebx,al   ; ebx = 0xFFFFFF80