【问题标题】:Strange Nasm error: invalid combination of opcode and operands奇怪的 Nasm 错误:操作码和操作数的组合无效
【发布时间】:2016-06-30 01:35:32
【问题描述】:

我有一个包含以下代码的汇编文件:

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: 错误:操作码和操作数的组合无效

我的代码有什么问题,我该如何解决?

【问题讨论】:

  • 第 15 行看起来像 div 4,并且根据指令集引用 DIV 不采用立即操作数。它需要一个内存操作数或一个寄存器。
  • 要进行无符号整数除以 4,您根本不需要 div。只需向右逻辑移位 2 位:shr eax,2
  • 下次您询问特定行的错误时,如何在源代码中向我们提供行号。或放置注释以识别该行。

标签: linux ubuntu assembly x86 nasm


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多