2012-11-06 101 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

謝謝!