首页 文章

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

提问于
浏览
-2

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

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

  • 1

    mov eax,-2
    imul eax,c
    mov ebx,eax
    mov eax,82
    imul eax,d
    sub ebx,eax
    ***这里有些不对劲
    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
    

相关问题