Upgrade to Pro — share decks privately, control downloads, hide ads and more …

x86アセンブラ入門

 x86アセンブラ入門

研究室でやった入門講座です

Yuma Kurogome

July 22, 2014
Tweet

More Decks by Yuma Kurogome

Other Decks in Programming

Transcript

  1. アセンブラ 8B E5 mov esp, ebp • ニーモニック – オペコードとオペランドの組み合わせ

    • オペコード – アセンブラの命令 • オペランド – 演算に用いるレジスタやメモリアドレス 機械語 オペコード 第一オペランド 第二オペランド ニーモニック
  2. レジスタ • CPU内の記憶領域 • 汎用レジスタ – eax, ecx, edx, ebx,

    esp, ebp, esi, edi • セグメントレジスタ – cs, ds, ss, es, fs, gs • ステータス制御レジスタ – eflags, eip • FPUレジスタ, MMXレジスタ, SSEレジスタ
  3. 汎用レジスタ • eax, ecx, edx, ebx, esp, ebp, esi, edi

    • eax, ecx, edx, ebx – 値 – eax • 変数 – ecx • C++製のバイナリに多い • thisポインタ, forのカウンタなどが保存される • 初期化されなければクラスのメンバ関数
  4. 汎用レジスタ • eax, ecx, edx, ebx, esp, ebp, esi, edi

    • esi, edi – メモリアドレス
  5. 汎用レジスタ • esp – スタックポインタ – push命令, pop命令によって変動 • ebp

    – スタックフレームのベースポインタ 値 a リターンアドレス 値 b スタックはLast In, First Out スタックポインタ ベースポインタ
  6. セグメントレジスタ • cs, ds, ss, es, fs, gs • 旧世代の遺物

    • cs – コードセグメント – 実行ポインタが参照 • ds – データセグメント – mov命令などが参照
  7. セグメントレジスタ • ss – スタックセグメント – push, pop, call, retなどスタック操作を伴う命令が

    参照 • es, fs, gs – 仕組み上はおまけのようなものだが… – いずれ詳しくやります – 構造化例外ハンドラ
  8. ステータス制御レジスタ • eflagsのフラグ – SF • サインフラグ • 結果がマイナス値だったときにセット –

    OF • オーバーフローフラグ • 結果を格納するためのレジスタより結果の値が大きいと きにセット
  9. 代表的なアセンブラの命令 • sal命令, sar命令 – 左シフト演算, 右シフト演算(算術シフト) – 1bit左シフトの場合, 1010

    0011 → 1100 0110 • shl命令, shr命令 – 左シフト演算, 右シフト演算(論理シフト) – 1bit左シフトの場合, 1010 0011 → 0100 0110 – 2の累乗で乗算 , 2の累乗で除算と覚えると楽 – shr eax, 0x4 ; ecx = ecx >> 0x4 • 余りは無視
  10. 代表的なアセンブラの命令 • 分岐命令 – eflagsレジスタをもとに任意のアドレスに分岐 – jmp命令 • 無条件ジャンプ –

    jc, jnc命令 • CFが立っているかどうか – jz, jnz命令 • ZFが立っているかどうか
  11. 代表的なアセンブラの命令 • test命令 – 論理積 – test eax, eax –

    eax=0ならZF=1となるので, jz命令などで分岐 • cmp命令 – 比較 – cmp eax, 0 – eax=0ならZF=1となるので, jz命令などで分岐
  12. 代表的なアセンブラの命令 • xor命令 – 排他的論理和 – xor eax, eax –

    同じ値同士なら0になるので, testやcmpの準備に多 用される