1

cmp命令を使いたいのですが、アセンブリ言語で以下の構文を設定するかどうか。例:

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

1 に答える 1

3

いいえ、(正確には) これはできません。Intel x86 のほとんどすべての命令では、オペランドの 1 つをレジスタにする必要があります。

これにはcmpsb例外[ds:si]があり[es:di]ます。[ds:esi][es:edi]rsirdi

ただし、両方のオペランドを指すために使用する場合siは、他のレジスタをロードしてから比較する必要があります。

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

もう 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]

ただし、心に留めておくべきことが 1 つあります。メモリ内のデータを操作しているため、これは速度に実際の違いをもたらさない可能性があります。メモリで多くのことを行う場合、メモリへの帯域幅がボトルネックになることがよくあります (通常は?)。プロセッサ自体で命令の実行を最適化しても、ほとんど違いはありません。

于 2012-11-06T14:28:04.427 に答える