我要使用 cmp 指令,是否在汇编语言中设置以下语法?例子:
cmp [temp + si],[temp + si+1]
不,你不能(完全)这样做。对于 Intel x86 上的几乎所有指令,其中一个操作数必须是寄存器。
有一个例外:cmpsb
与[ds:si]
([es:di]
或,在 32 位模式下,[ds:esi]
与相比[es:edi]
,或在 64 位模式下,使用rsi
and 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]
但是要记住一件事:由于您正在处理内存中的数据,因此这可能不会对速度产生任何真正的影响——如果您对内存做很多事情,内存的带宽通常(通常?)是瓶颈,所以优化处理器本身上的指令执行几乎没有什么区别。