我有一个包含以下代码的汇编程序文件:
global _start
_start:
mov eax, -2
imul eax, c
mov ebx, eax
mov eax, 82
imul eax, d
sub ebx, eax
div 4
mov eax, 1
mov ebx, 0
int 0x80
section .data
a: db 10
c: db 3
d: db 2
我编译它:
nasm -f elf c1.asm
我收到错误:
c1.asm:15: error: invalid combination of opcode and operands
我的代码有什么问题,如何修复它?
最佳答案
mov eax, -2 imul eax, c mov ebx, eax mov eax, 82 imul eax, d sub ebx, eax *** Here's something amiss div 4
前 6 行将结果放入 EBX,但 div
指令将始终使用 EAX 寄存器,当然不会使用 EBX 寄存器!在进行除法之前,您需要使用 mov eax, ebx
将结果从 EBX 移动到 EAX。
div 4
div
指令不采用立即数作为操作数!即使确实如此,您仍然需要提供一些有关操作规模的信息。
这个解决方案保留了划分:
xor edx, edx
div dword [four] ;divide EDX:EAX by 4 -> quotient in EAX
four dd 4
更好的解决方案是根本不进行除法,而只是将 EAX 向右移动 2 次:
shr eax, 2
<小时/>
imul eax, c ... imul eax, d
这些 imul
编译得很好,但要实际乘以定义的值,请使用以下命令:
imul eax, [c]
...
imul eax, [d]
c dd 3
d dd 2
关于linux - 奇怪的 Nasm 错误 : invalid combination of opcode and operands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112608/