2009-08-18 18 views
6

このx86アセンブリコードを考えてみましょう。ここで起こっている正確に何のx86アセンブリにラベルを間接参照

section .data 

foo: 
    mov ebx, [boo] 
    mov [goo], ebx 
goo: 
    mov eax, 2 
    mov eax, 3 
    ret 
boo: 
    mov eax, 4 
    mov eax, 5 
    ret 

を? [boo]movを逆参照すると、それは[goo]に正確に移動していますか?ちょうど1つのコマンド? retも同様ですか?


フォローアップの質問:

  1. は、ラベルが私にアドレスを与える逆参照していますか?または、ラベルの最初のコマンドのマシンコード?
  2. マシンコードの場合、どうすれば1つ以上のコマンドになる可能性がありますか?すべてのコマンドが本質的に32ビット(すべてのビットが使用されていない場合でも)ではありませんか?
  3. ボトムライン - eaxの最後に3または5の値がありますか?

答えて

9

boomov ebx, [boo]は、「boo内のオフセットで4バイトを取り込み、ebxに入れる」という意味です。 同様に、mov [goo], ebxは、gooで示されるオフセットでebxの内容を移動します。

しかし、コードは読み取り専用であることが多いため、コードがクラッシュするのは驚くことではありません。ここで

booの命令がエンコードされている方法です。

boo: 
b8 03 00 00 00   mov eax,0x3 
c3      ret 

それであなたはebxで取得することは、実際にmov eax, 3命令の4/5です。

+1

をクリアするためのおかげでした最後のバイトは常に0になります。mov、eax 0xC000000 – Michael

+0

のようなものを試すと、このコードは失敗します。 "4バイトをフェッチする"は私が探していたものでした。ありがとう! –

3

最初のmovはセグメントレジスタ[e] DSに対してオフセットgooからコピーしています。 2番目のmovはfooのオフセットでDSレジスタを基準にしたデータ位置に書き込みます。 CSとDSが偶然である場合、これは無視することができます。 CSとDSが偶然であると仮定すると、次にコードセクションを読み取り専用にするさまざまな保護メカニズムが実行されます。

REのフォロー:

  1. ラベルは、参照のようにイマイチ - 次のような間接参照をいけません。アセンブラは、結果のコード内の位置を表す数字に置き換えます。あなたはアドレスか、住所のものを読み込むことができます。 [と]は逆参照を示しています - 私はこれをカバーする最初の応答で混乱する要素を修正しました。 IOWはそのアドレスにあるものをロードします。
  2. x86のようなCISC命令セットには、非常に可変長の命令があります - ワード長の倍数でもないものもあります。 RISCのものは、一般的に、これを解読してデコード命令を簡単にしようとします。
  3. 3 - mov eax, 2の最初の4バイトのみを変更しています(リトルエンディアンエンコーディングは4で置き換えられますが、次に変更されていない次の命令で上書きされます)。 (私はあなたの担当者から推測していたはずだが、もう少し詳しく知っているが、最初に質問したようにコードが並べ替えられたと思っていたと思った。このすべてがCS = DSとDEPは、ステッピングイマイチことを前提としてい

注意。また

あなたの代わりにEBXのBX、あなたが遊びに来る期待していたもののようなものを使用していた場合は、(使用してExXの代わりにxXがレジスタの下位2バイトにアクセスする[xLは最下位バイトにアクセスする])

[1]アセンブラは、純粋にオペコードを書くためのツールであることを忘れないでください。数字などのように、コードの魔法や印象的な変換はほとんどありません。そこに隠れているものやそこに潜む自然のものはありません。 (これはわずかにoversimplifyingれる - コードは、再配置可能とすることができ、多くの場合、フィックスアップは、リンカーの組み合わせとローダによってオフセットの用途に適用されます)セクション.data内部命令mov eax, 3のオフセットさ

+0

右 - 私はこれが機能するために起こるように、彼らは完全な32ビット量とじゃないので、それが見えます...心の中でRISCとそのポイント –

2

は答えをフォローアップ:

  1. これは、アドレスから始まるあなたのマシンコードを提供します。どのくらいの負荷があなたの負荷の長さに依存するか、この場合は4バイトです。

  2. これは、複数のコマンドまたはコマンドの断片のみにすることができます。このアーキテクチャ(Intel x86)では、マシンコードコマンドは8〜120ビットです。

  3. 3.