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

标签 assembly indexing x86 nasm cpu-registers

我正在编写 NASM 汇编代码,并且必须进行一些索引寻址。我将索引存储在 $al 中,但是 x86 不会让您使用 $al 作为索引寄存器,而且我已经在使用 $bl,所以我不能使用 $bx。所以我需要将我在 $al 中的字节放入一个 32 位的寄存器,例如 $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

关于assembly - NASM - 如何将 8 位寄存器移动到完整的 32 位寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32836589/

相关文章:

assembly - 为什么汇编程序仅在与 crt1.o crti.o 和 crtn.o 链接时才起作用?

assembly - 有人可以解释一下 ARM 中的分支操作码吗?

assembly - x86 长模式特定指令在保护模式下可用吗?

mysql - Rails ActiveRecord 表索引 - 什么时候应该使用它们?

pandas - pandas 的 df.take() 和 df.iloc[] 有什么区别?

assembly - 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?

assembly - 在汇编器中编写函数

delphi - 如何获取内部System.pas函数的地址?

python - 使用逻辑 pandas 进行多重索引和掩码

c - 如何让 gcc 生成合适的代码来检查缓冲区是否充满 NUL 字节?