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 指令中达到了极限。
这个.
我是 NASM 和 x86_64 程序集的新手。我对 cmp 指令的 wiki document 感到困惑。根据文档操作数可以是以下之一。
cmp minuend, subtrahend
minuend
AL/AX/EAX (only if subtrahend is immediate)
Register
Memorysubtrahend
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 指令中达到了极限。
这个