为什么 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/m16
或 cmp m16, m16
这样的东西。所以 cmp low_, high_
会尝试 assemble 一条不存在的指令,而你的 assembler 会拒绝它。
大多数 x86 算术指令都是这种情况:其中一个操作数可能是内存引用,但不能同时是两者。要对内存中的两个值进行操作,您必须先将其中一个值加载到寄存器中,就像这段代码所做的那样。
我在进行二进制搜索程序代码时遇到了以下语句
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/m16
或 cmp m16, m16
这样的东西。所以 cmp low_, high_
会尝试 assemble 一条不存在的指令,而你的 assembler 会拒绝它。
大多数 x86 算术指令都是这种情况:其中一个操作数可能是内存引用,但不能同时是两者。要对内存中的两个值进行操作,您必须先将其中一个值加载到寄存器中,就像这段代码所做的那样。