我正在编写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
答案 0 :(得分:7)
movzx ecx, al ; move byte to doubleword, zero-extension
如果您希望将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