1

我要使用 cmp 指令,是否在汇编语言中设置以下语法?例子:

cmp [temp + si],[temp + si+1]
4

1 回答 1

3

不,你不能(完全)这样做。对于 Intel x86 上的几乎所有指令,其中一个操作数必须是寄存器。

有一个例外:cmpsb[ds:si][es:di]或,在 32 位模式下,[ds:esi]与相比[es:edi],或在 64 位模式下,使用rsiand 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]

但是要记住一件事:由于您正在处理内存中的数据,因此这可能不会对速度产生任何真正的影响——如果您对内存做很多事情,内存的带宽通常(通常?)是瓶颈,所以优化处理器本身上的指令执行几乎没有什么区别。

于 2012-11-06T14:28:04.427 回答