2010-11-28 9 views
1

は誰も私を理解することができ、次のinstructions-LEA操作が

LES SI,DATA1 
MOV DI,OFFSET DATA2 
MOV BX,[SI] 
MOV CX,[DI] 
MOV[SI],CX 
+2

MOVのヘルプが必要な場合は、LEAの準備ができていません。 LEAのヘルプが必要な場合は、http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction –

答えて

0

は、次の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. 
+0

um .. DATA2はポインタとして解釈されない'OFFSET'がポインタを導出するために使用されるため) - 単純な単純な整数変数でなければなりません – lijie

0

あなただけのアセンブリ命令のページを検索し、それができそれらの指示のそれぞれが理解しやすい方法で何をするのかを説明します。基本的な低レベルの単純さでのアセンブリは、より高いレベルの言語よりも単一の行を理解する方が簡単です。

しばらく使っていないと、どちらのx86アセンブリ構文がどのような順序で使用されているかわかりません(2つの主要なx86アセンブリ構文は、オペランドを逆の順序で並べ替えます)。結果はここにあります。

最初はLESの代わりにLEAを入力したと誤解していますか? LEAは、正しくリコールすれば、 "load effective address"の略です。その主な目的は、単にアドレスを使用するのではなく、アドレスを実際に知りたいときに、何かのメモリアドレスを計算することです。

(編集) 私は以前はLESを使用していなかったので、Googleは私をLEAにリダイレクトしたいと考えました。私はあなたがそれからも恩恵を受けることができるように上記を残します。 (/ edit)

MOVはデータをある場所から別の場所に移動します。 []で囲まれたMOV命令のオペランドは、代わりにそのメモリアドレスが必要であることを意味します。したがって、MOV CX、[DI]は "CXレジスタの内容をDIに保持されているアドレスのメモリ位置に移動しますレジスタ "(または、逆に[DI]をCXに入れ、上記のオペランドの順序についての説明を参照してください)。

私はオフセットキーワードを思い出さないので、 "OFFSET DATA2"についてはわかりません。

1

は、LEAではありません。 LES x, yは、遠ポインタとしてyを解釈し、そのデータをES(セグメントレジスタ)とxにロードします。

ESは実際には使用されていないため、指定された命令シーケンスは奇妙です。とにかく

、命令シーケンスは、([SI]ES:[SI]に変更された場合)である:farポインタ(DATA1)および変数(DATA2)与えられた、内容はBXDATA1によって指され、記憶されるものによってそれらを交換移動現在はDATA2(これもCXになります)。