【问题标题】:NASM - How do you move an 8-bit register into a full 32-bit register?NASM - 如何将 8 位寄存器移动到完整的 32 位寄存器中?
【发布时间】:2015-12-26 11:56:52
【问题描述】:

我正在编写 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

【问题讨论】:

    标签: assembly indexing x86 nasm cpu-registers


    【解决方案1】:

    使用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
    

    【讨论】:

    • 据我所知,“零扩展”只是用零填充 ecx 中剩余的 24 个奇数位?所以无论有什么都不会弄乱我输入的小数字?
    猜你喜欢
    • 2020-11-21
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2014-12-17
    • 2015-07-05
    相关资源
    最近更新 更多