機械語に飛び込む
・機械語に飛び込む
インクリメントを行うだけの関数をコンパイルする
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