【问题标题】:x86_64 cmp instruction invalid combination of opcode and operandsx86_64 cmp 指令操作码和操作数的组合无效
【发布时间】:2020-04-12 17:46:44
【问题描述】:

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

cmp 减数,减数

减分

AL/AX/EAX(仅当减数为立即数时)
注册
记忆

减数

注册
立即
记忆

当我尝试编译下面的代码 sn-p.

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 文档,两个操作数都可以是内存,如果是这样,那么应该编译第一个代码 sn-p。如果有人清楚地向我解释这种语法,那将非常有帮助。

【问题讨论】:

  • 文档的意思是 either 操作数可以是内存。这并不意味着两者,但这并不清楚。

标签: assembly x86-64 nasm


【解决方案1】:

但是根据 wiki 文档,两个操作数都可以是内存,如果是这样,那么应该编译第一个代码 sn-p。

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

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

是有效的,因为每条指令只有一个内存操作数。
这一原则在一些最新的 x86_64 SIMD 指令中达到了极限。
这个SO answer describes some (possible) exceptions to the rule

【讨论】:

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