x86_64 cmp 指令操作码和操作数的无效组合

x86_64 cmp instruction invalid combination of opcode and operands

我是 NASM 和 x86_64 程序集的新手。我对 cmp 指令的 wiki document 感到困惑。根据文档操作数可以是以下之一。

cmp minuend, subtrahend

minuend

AL/AX/EAX (only if subtrahend is immediate)
Register
Memory

subtrahend

Register
Immediate
Memory

当我尝试编译以下代码片段时。

var_1 dd 100
var_2 dd 200
cmp dword[var_1], dword[var_2]

它抛出错误:操作码和操作数的组合无效

但在我将 cmp 指令更改为以下后,它编译正常。

var_1 dd 100
var_2 dd 200
mov eax, [var_1]
cmp eax, dword[var_2]

但是根据 wiki 文档,两个操作数都可以是内存,如果是这样,那么应该编译第一个代码片段。如果有人能清楚地向我解释这个语法,那将非常有帮助。

But as per the wiki document, both the operands could be a memory if so then the first code snippet should be compiled.

没有。这是错误的。 x86 体系结构通常每条指令只允许一个内存操作数。所以

mov eax, [var_1]
cmp eax, dword[var_2]

有效,因为每条指令只有一个内存操作数。
这一原则在一些最新的 x86_64 SIMD 指令中达到了极限。
这个.