使用している命令フォーマットが「違法」です。プロセッサは、2つのメモリ位置間を移動することを理解していない。そのため、エラーが発生しています。ダイレクト・レジスタ・アドレッシング・モード(角カッコを使用)を使用すると、リストされた各レジスタ(edi、esi)に格納されているメモリ・アドレスが与えられます。
プロセッサは単純にそれを行うことはできません。ごめんなさい。あなたは、あなたがやろうとしていることをするために別の方法を見つけなければならないでしょう。
movsb命令は、esiが指すアドレスからediが指すアドレスに1バイト移動します。それはあなたが探しているものかもしれませんが、その場合のコードは単純に
movsb
です。また、方向フラグの値に応じてesiとediをインクリメントまたはデクリメントします(これは通常はクリアなのでインクリメントされます)。
ec修飾子を使用して、ecxに格納されている値で示された回数だけ命令を繰り返すことができます。
INi ediおよびesiの値は、movsb命令によって変更されることに注意してください。 movsBを使用する場合は、1ずつインクリメントまたはデクリメントされます。
あなたはメモリ内の2つの値を交換する必要がある場合は二つのレジスタを持つ私わずかに少ない効率的な方法に応じて、他のユーザーによって指摘したように、あなたは一つの追加のレジスタでそれを行うことができます。
mov edx, [edi]
xchg edx, [esi]
mov [edi], edx
これが入れ替わりますedi
とesi
の内容で指し示されるメモリアドレスの内容。それを行うための方法はありません。
一般に、しかし、その特定の場合には、 'movsb'命令を使用することができます。インテルのマニュアルの第2巻を参照してください。 – Michael
@マイケル私はそれを試してみるが、もう一度失敗する。これはコンパイルにnasmを使用していますか? – Liberty
_「失敗しました」は十分な問題の説明ではありません。取得している_exact_エラーメッセージとは何ですか、エラーが対応する_exact_コード行は何ですか? – Michael