寻址模式可以像这样写吗?

时间:2012-11-06 14:12:19

标签: assembly addressing-mode

我想用cmp指令,是否用汇编语言设置以下语法? 例如:

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

1 个答案:

答案 0 :(得分: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]

要注意的一件事是:因为你正在使用内存中的数据,这可能不会对速度产生任何实际影响 - 如果你对内存做了很多事情,内存的带宽通常是(通常是?)瓶颈,因此在处理器本身上优化执行指令几乎没有什么区别。