機械語に飛び込む

参考書籍 : 自作エミュレータで学ぶx86アーキテクチャ


機械語に飛び込む
インクリメントを行うだけの関数をコンパイルする
casm-c-sample.c

void func(void) {
  int val = 0;
  val++;
}

コンパイルには、以下のコマンドを実行する
gccのバージョンは4.9.2

gcc -Wl,--entry=func,--oformat=binary -nostdlib -fno-asynchronous-unwind-tables -o casm-c-sample.bin casm-c-sample.c

生成されたcasm-c-sample.binを以下のコマンドで逆アセンブルする。
nasmのバージョンは2.11.08

ndisasm -b 32 casm-c-sample.bin
00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC00000000    mov dword [ebp-0x4],0x0
0000000D  FF45FC            inc dword [ebp-0x4]
00000010  C9                leave
00000011  C3                ret

 

デバッグ情報付きでコンパイルする
以下のコマンドで、デバッグ情報付きのオブジェクトファイルを見ることができる

casm-c-sample>gcc -c -g -o casm-c-sample.o casm-c-sample.c
objdump -d -S -M intel casm-c-sample.o

実行すると、以下のようにC言語での記述とアセンブリ言語命令の対応が表示される

casm-c-sample.o:     file format elf32-i386


Disassembly of section .text:

00000000 <func>:
void func(void) {
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   83 ec 10                sub    esp,0x10
  int val = 0;
   6:   c7 45 fc 00 00 00 00    mov    DWORD PTR [ebp-0x4],0x0
  val++;
   d:   ff 45 fc                inc    DWORD PTR [ebp-0x4]
}
  10:   c9                      leave
  11:   c3                      ret