奇怪的Nasm错误:操作码和操作数的无效组合

时间:2016-06-30 01:35:32

标签: linux ubuntu assembly x86 nasm

我有一个包含此代码的汇编程序文件:

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 个答案:

答案 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