誰でも次の指示を理解するのを手伝ってもらえますか-
LES SI,DATA1
MOV DI,OFFSET DATA2
MOV BX,[SI]
MOV CX,[DI]
MOV[SI],CX
LES
ありませんLEA
。は far ポインタとしてLES x, y
解釈し、そのデータを(セグメント レジスタ) およびにロードします。y
ES
x
ES
ただし、実際には使用されないため、与えられた命令シーケンスは奇妙です。
いずれにせよ、命令シーケンス ([SI]
が に変更された場合ES:[SI]
) は次のとおりです: far ポインター ( DATA1
) と変数 ( DATA2
) が与えられた場合、 が指す内容を に移動し、それらを現在( にもある) に格納DATA1
さBX
れているものに置き換えます。DATA2
CX
組み立て手順のページを参照するだけで、各手順が何をするのかを簡単に理解できる方法で説明されます。多くの点で、基本的で低レベルの単純さでのアセンブリは、高レベル言語よりも 1 行を理解する方が簡単です。
しばらく使用していないと、どの x86 アセンブリ構文がどのように順序付けされているか思い出せないので (2 つの主要な x86 アセンブリ構文では、オペランドが逆の順序で順序付けられます)、ここでは正確な結果については述べません。
最初のものはタイプミスだと思いますが、LES ではなく LEA を意味していたのですか? 私の記憶が正しければ、LEAは「ロード有効アドレス」の略です。その主な目的は、アドレスを使用するだけでなく、実際にアドレスを知りたいときに何かのメモリアドレスを計算することです。
(編集) 私は以前に LES を使用したことがなく、Google は私を LEA にリダイレクトしたかったため、上記のステートメントがありました。ただし、上記は残しておきますので、あなたもそれから恩恵を受けることができます. (/編集)
MOV はデータをある場所から別の場所に移動します。[] 角かっこで囲まれている MOV 命令のオペランドは、代わりにそのメモリ アドレスが必要であることを意味するため、MOV CX,[DI] は「CX レジスタの内容を DI に保持されているアドレスのメモリ位置に移動します。 register」(またはその逆、[DI] から CX へ、オペランドの順序に関する上記のステートメントを参照)。
オフセット キーワードを思い出せないので、「OFFSET DATA2」についてはわかりません。
次の C コードに対応します。
// DATA1 and DATA2 are 'far' pointers to word of 16 bits, let's say they are 'short'
short bx = *DATA1;
*DATA1 = *DATA2;
// the old value of *DATA1 is still available in the BX register.
// and the value of *DATA2 is still available in the CX register.
// also, ES is set to the segment where DATA1 and DATA2 resides.