我有一个包含此代码的汇编程序文件:
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:错误:操作码和操作数的无效组合
我的代码有什么问题,我该如何解决?
答案 0 :(得分:1)
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