【发布时间】:2012-11-06 14:12:19
【问题描述】:
我要使用cmp指令,是否在汇编语言中设置如下语法? 示例:
cmp [temp + si],[temp + si+1]
【问题讨论】:
我要使用cmp指令,是否在汇编语言中设置如下语法? 示例:
cmp [temp + si],[temp + si+1]
【问题讨论】:
不,你不能(完全)这样做。对于 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]
但要记住一件事:由于您使用的是内存中的数据,因此这可能不会对速度产生任何实际影响 - 如果您对内存进行大量操作,那么内存的带宽通常(通常?)瓶颈,因此优化处理器本身的指令执行几乎没有什么区别。
【讨论】: