我有一个包含此代码的汇编程序文件:
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:错误:操作码和操作数的组合无效
我的代码有什么问题,我该如何解决?
1 回答
前6行将结果放在EBX中,但
div
指令将始终使用EAX寄存器,当然不是EBX寄存器!在进行除法之前,需要使用mov eax, ebx
将结果从EBX移动到EAX .div
指令不会立即执行操作数!即使它确实如此,您仍然需要提供有关操作大小的一些信息 .该解决方案保持了分工:
一个更好的解决方案是根本不分裂,只需将EAX向右移动2次:
这些
imul
的编译正常但实际上乘以定义的值使用以下内容: