機械語むずい

今いろいろあってx86機械語を読んでるんだけど、むずい><

このあたりを読んで勉強してるんだけど

まず、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 010 101<%ebp>」という風に、2bit3bit3bitで区切って解釈するっぽい。
でも、pushの場合はこういう構成だけど、movだと次のbyteでレジスタを指定する、というように、機械語によって解釈のしかたが違うっぽい。

むずい><