機械語むずい
このあたりを読んで勉強してるんだけど
まず、Hello worldのやつをCで組んで
#include <stdio.h> int main(int argc,char* argv[]) { printf("Hello, world!\n"); return 0; }
コンパイルして、逆アセンブル
$ make $ objdump -d hello.exe > hello.asm
で、出てきたコードの断片を読む。
004012f0 <_main>: 4012f0: 55 push %ebp 4012f1: 89 e5 mov %esp,%ebp 4012f3: 83 ec 08 sub $0x8,%esp 4012f6: 83 e4 f0 and $0xfffffff0,%esp 4012f9: b8 00 00 00 00 mov $0x0,%eax 4012fe: 83 c0 0f add $0xf,%eax 401301: 83 c0 0f add $0xf,%eax 401304: c1 e8 04 shr $0x4,%eax 401307: c1 e0 04 shl $0x4,%eax 40130a: 89 45 fc mov %eax,0xfffffffc(%ebp) 40130d: 8b 45 fc mov 0xfffffffc(%ebp),%eax 401310: e8 2b 05 00 00 call 401840 <___chkstk> 401315: e8 a6 00 00 00 call 4013c0 <___main> 40131a: c7 04 24 00 30 40 00 movl $0x403000,(%esp) 401321: e8 82 05 00 00 call 4018a8 <_printf> 401326: b8 00 00 00 00 mov $0x0,%eax 40132b: c9 leave 40132c: c3 ret 40132d: 90 nop 40132e: 90 nop 40132f: 90 nop
0x55だけで「push %ebp」を表してる。
これは2進数表記で「01
でも、pushの場合はこういう構成だけど、movだと次のbyteでレジスタを指定する、というように、機械語によって解釈のしかたが違うっぽい。
むずい><