NASM - 如何将 8 位寄存器移动到完整的 32 位寄存器?
NASM - How do you move an 8-bit register into a full 32-bit register?
我正在编写 NASM 汇编代码,并且必须进行一些索引寻址。我把索引存储在 $al 中,但是 x86 不会让你使用 $al 作为索引寄存器,而我已经在使用 $bl,所以我不能使用 $bx。所以我需要将我在 $al 中的字节放入一个 32-but 寄存器,例如 $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 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
我正在编写 NASM 汇编代码,并且必须进行一些索引寻址。我把索引存储在 $al 中,但是 x86 不会让你使用 $al 作为索引寄存器,而我已经在使用 $bl,所以我不能使用 $bx。所以我需要将我在 $al 中的字节放入一个 32-but 寄存器,例如 $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 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