cmp命令を使いたいのですが、アセンブリ言語で以下の構文を設定するかどうか。例:
cmp [temp + si],[temp + si+1]
いいえ、(正確には) これはできません。Intel x86 のほとんどすべての命令では、オペランドの 1 つをレジスタにする必要があります。
これにはcmpsb
例外[ds:si]
があり[es:di]
ます。[ds:esi]
[es:edi]
rsi
rdi
ただし、両方のオペランドを指すために使用する場合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 つあります。メモリ内のデータを操作しているため、これは速度に実際の違いをもたらさない可能性があります。メモリで多くのことを行う場合、メモリへの帯域幅がボトルネックになることがよくあります (通常は?)。プロセッサ自体で命令の実行を最適化しても、ほとんど違いはありません。