作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写 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/
我是一名优秀的程序员,十分优秀!