linux - 奇怪的 Nasm 错误 : invalid combination of opcode and operands

标签 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: error: invalid combination of opcode and operands

我的代码有什么问题,如何修复它?

最佳答案

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

关于linux - 奇怪的 Nasm 错误 : invalid combination of opcode and operands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112608/

相关文章:

assembly - 尝试在汇编中编译功能

c++ - 如何将数组从 C++ 传递到汇编程序 dll?

linux shell 在空参数上测试 `-d`

Linux 脚本变量 "$$"

ubuntu - visualvm 不是 OpenJDK7 的一部分?

linux - 带有 plesk 的 Linux Ubuntu 上的多个 svn 存储库

linux - 清除缓存而不重新启动应用程序

python - 在终端上运行 Python 脚本,然后继续使用终端

python - 在 Ubuntu 上导入 matplotlib

c - x86_64 AT&T 汇编中的旋转函数