NASM - 如何移动的8位寄存器为一个完整的32位注册?

问题描述 投票:3回答:1

我写NASM汇编代码,并有做一些索引寻址。我有存储在$人指数,但86不会让你使用$ Al作为索引寄存器,并且我已经使用$ BL,所以我不能用$ BX。所以,我需要把我有字节$人到32,但注册如$ 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个回答
7
投票

使用MOVZX instruction

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

还有,如果你想为签署在待处理MOVSXal

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

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
© www.soinside.com 2019 - 2024. All rights reserved.