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

Ben*_*ger 3 indexing x86 assembly nasm cpu-registers

我正在编写NASM汇编代码,并且必须进行一些索引编址.我有索引存储在$ al,但x86不会让你使用$ al作为索引寄存器,我已经使用$ bl,所以我不能使用$ bx.所以我需要将$ al中的字节放入一个32-but的寄存器,例如$ ecx,但是,当我尝试时,它会抛出一个无效的操作码和操作数错误组合.有没有办法做到这一点?

    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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 7

使用MOVZX说明:

movzx ecx, al  ; move byte to doubleword, zero-extension
Run Code Online (Sandbox Code Playgroud)

还有MOVSX,如果你想在价值al作为签约治疗.

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

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
Run Code Online (Sandbox Code Playgroud)