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

x86アセンブラ入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 x86アセンブラ入門

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

Avatar for Yuma Kurogome

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の準備に多 用される