(1)次のコードは何を意味しますか?オンラインのどこにでもds:[]構文に関する参考文献は見つかりません。それはdsなしではどう違うのですか?次の命令でWindows x86アセンブリ言語の構文
cmp eax,dword ptr ds:[12B656Ch]
(2)、
movsx eax,word ptr [esi+24h]
ESIレジスタは何に使用されますか?このようなまれなレジスタを使用して元のCコードが何をしているのか推測することは可能でしょうか?
(1)次のコードは何を意味しますか?オンラインのどこにでもds:[]構文に関する参考文献は見つかりません。それはdsなしではどう違うのですか?次の命令でWindows x86アセンブリ言語の構文
cmp eax,dword ptr ds:[12B656Ch]
(2)、
movsx eax,word ptr [esi+24h]
ESIレジスタは何に使用されますか?このようなまれなレジスタを使用して元のCコードが何をしているのか推測することは可能でしょうか?
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
を除いて、してください、あなたのようにほとんどすべてのレジスタを使用することができます。
このようなまれなレジスタを使用して元の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コードを検査することです。
この質問は、http://stackoverflow.com/questions/38843403/which-segment-register-is-used-by-defaultの複製としてクローズされているはずです。私はおそらく、再オープンして閉じることができない代わりに、古いdupターゲットで閉じた状態にしておくべきでした。 –
* dsなしとはどう違うのですか?*。そうではありません、あなたの逆アセンブラは冗長であるだけです。 –
*使用するesiレジスタは何ですか?*アドレッシングモードのベースアドレス。 1つの命令だけではなく、関数全体を見れば、オリジナルのCが何をしているのかを理解することができます。 –
'ds' - データセグメント。それは単なるポインタです。 –