2012-11-06 65 views

回答

3

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

有一个例外于:cmpsb比较[ds:si][es:di](或者,在32位模式下,[ds:esi][es:edi],或在64位模式下,使用rsirdi)。

如果你想使用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] 

虽然有一点需要记住:因为你正在处理内存中的数据,所以这可能不会在速度上产生任何实质性差异 - 如果你对内存做了很多事情,内存的带宽通常(通常是?)瓶颈,所以优化处理器本身的指令执行效果几乎没有什么区别。

+0

假设它是x86,OP没有指定。 –

+0

谢谢!