为什么 mov/cmp 而不是 cmp 有两个内存操作数?

Why mov/cmp instead of cmp with two memory operands?

我在进行二进制搜索程序代码时遇到了以下语句

l1: mov si,low_
    cmp si,high_

为什么要把low_存入si,然后和high_比较? 不能直接写cmp low_,high_

你不能写 cmp low_, high_.

对于此类问题,请始终参考官方说明说明,例如在 https://www.felixcloutier.com/x86/cmp。注意cmp有形式cmp r/m16, r16,第一个操作数可以是寄存器也可以是内存,第二个必须是寄存器;以及相反的 cmp r16, r/m16。但是没有像 cmp r/m16, r/m16cmp m16, m16 这样的东西。所以 cmp low_, high_ 会尝试 assemble 一条不存在的指令,而你的 assembler 会拒绝它。

大多数 x86 算术指令都是这种情况:其中一个操作数可能是内存引用,但不能同时是两者。要对内存中的两个值进行操作,您必须先将其中一个值加载到寄存器中,就像这段代码所做的那样。