2016-08-26 19 views
-2

(1)次のコードは何を意味しますか?オンラインのどこにでもds:[]構文に関する参考文献は見つかりません。それはdsなしではどう違うのですか?次の命令でWindows x86アセンブリ言語の構文

cmp eax,dword ptr ds:[12B656Ch] 

(2)、

movsx eax,word ptr [esi+24h] 

ESIレジスタは何に使用されますか?このようなまれなレジスタを使用して元のCコードが何をしているのか推測することは可能でしょうか?

+1

* dsなしとはどう違うのですか?*。そうではありません、あなたの逆アセンブラは冗長であるだけです。 –

+0

*使用するesiレジスタは何ですか?*アドレッシングモードのベースアドレス。 1つの命令だけではなく、関数全体を見れば、オリジナルのCが何をしているのかを理解することができます。 –

+0

'ds' - データセグメント。それは単なるポインタです。 –

答えて

2

DSは、データセグメントを指します。
Win32で、CS = DS = ES = SS = 0
これらのセグメントは問題ではなく、フラットな32ビットアドレス空間が使用されます。

データセグメントは、メモリにアクセスするときのデフォルトセグメントです。一部の逆アセンブラは、デフォルトのセグメントをリストする目的はありませんが、間違ってそのリストを表示します。
セグメントオーバーライドを使用して別のセグメントを表示することができます。
CSは、ジャンプおよびコールのデフォルトセグメントであるコードセグメントです。SSは、ESPベースのアドレスのデフォルトであるスタックセグメントです。
ESは、文字列命令に使用される追加セグメントです。

Win32で意味をなさないセグメントオーバーライドはFSです(Fは何も意味しませんが、Eの後に続きます)。
FSは、スレッド固有のデータを格納するスレッド情報ブロック(TIB)にリンクしており、一般にスレッドローカルストレージとマルチスレッドに非常に役立ちます。
将来のWin32での使用のために予約されており、Win64のTIBで使用されるGSもあります。
Linuxでは、画像はほぼ同じです。


ためにXを登録されたどのようなあなたは、レジスタは特別な目的を持っているという考えを手放す必要があります。
x86ではほとんどすべての目的でほぼすべてのレジスタを使用できます。
いくつかの複雑な命令だけが特定のレジスタを使用しますが、通常の命令は任意のレジスタを使用できます。
コンパイラは、メモリの使用を避けるために、できるだけ多くのレジスタを試して使用します。

EAX : accumulator, some instructions using this register have 'short versions'. 
EDX : overflow for EAX, used to store 64 bit values when multiplying or dividing. 
ECX : counter, used in string instructions like rep mov and shifts. 
EBX : miscellaneous general purpose register. 
ESI : Source Index register, used as source pointer for string instructions 
EDI : Destination Index register, used as destination pointer 
ESP : Stack pointer, used to keep track of the stack 
EBP : Base pointer, used in stack frames 

あなたはESPを除いて、してください、あなたのようにほとんどすべてのレジスタを使用することができます。

は、次のように8つのx86レジスタのこの本来の目的であると述べました。 ESPは多くの命令で動作しますが、スタックを追跡するのは非常に面倒です。

このようなまれなレジスタを使用して元のCコードが行っていることを推測することはできますか?

私の推測:いくつかの構造やオブジェクトへ

struct x { 
    int a,b,c,d,e,f,g,h,i,j; //36 bytes 
    short s }; 
.... 
int i = x.s; 

ESI可能性がポイント。オフセット24h(36)にはintが渡されるshortが存在します。 (したがって、サインエクステンド付きのmov)。
ESIは、ローカル変数をリンクしません。この場合、EBPまたはESPが使用されるためです。
Cコードについて詳しく知りたい場合は、より多くのコンテキストが必要です。
多くのc構文は、複数のCPU命令に変換されます。

これを確認する最も良い方法は、cコードを記述し、生成されたcpuコードを検査することです。

+0

この質問は、http://stackoverflow.com/questions/38843403/which-segment-register-is-used-by-defaultの複製としてクローズされているはずです。私はおそらく、再オープンして閉じることができない代わりに、古いdupターゲットで閉じた状態にしておくべきでした。 –

関連する問題