我想用cmp指令,是否用汇编语言设置以下语法? 例如:
cmp [temp + si],[temp + si+1]
答案 0 :(得分:3)
不,你不能(确切地)这样做。对于Intel x86上的几乎所有指令,其中一个操作数必须是寄存器。
有一个例外:cmpsb
将[ds:si]
与[es:di]
进行比较(或者,在32位模式下,将[ds:esi]
与[es:edi]
进行比较,或者64位模式,使用rsi
和rdi
)。
但是,如果要使用si
指向两个操作数,则需要加载其他寄存器,然后进行比较:
mov al, [temp+si]
cmp al, [temp+si+1]
另一种可能性是从[si]
加载,并增加si
:
lodsb ;roughly equivalent to mov al, [si] / inc si
cmp al, [si]
由于这只能使用si
,而不是temp+si
,因此您需要在使用之前将它们添加到一起。这稍微短一些,但在大多数当前的处理器上(至少在理论上)较慢。要重新获得速度,您还可以使用更原始的指令:
mov al, [si+temp]
inc si
cmp al, [si+temp]
或者,既然您使用+temp
作为两个指令,那么您可能会提前做一些补充:
add si, temp
mov al, [si]
inc si
cmp al, [si]
要注意的一件事是:因为你正在使用内存中的数据,这可能不会对速度产生任何实际影响 - 如果你对内存做了很多事情,内存的带宽通常是(通常是?)瓶颈,因此在处理器本身上优化执行指令几乎没有什么区别。