■ コンパイルオプションで出力する
    main.cpp から main.asm が出力される。
■ インラインアセンブラの基本
  SYNTAX
    __asm {}
    src には固定値, メモリ, レジスタが指定できる。
    dst にはレジスタ, メモリ参照を指定する。
    Intel CPU は src, dst 共にレジスタ参照はできない。
    
  POINT
    メモリ参照をするには [] 内でアドレスを指定する。
    アドレスの前には取り出すサイズを指定する。
    指定がなければ DWORD PTR が適用される。
  POINT
    アセンブラの機能ではないが、インラインアセンブラを使う場合は C/C++ で宣言した変数が使える
  
■ 定数を代入する
    mov         eax,20     ; eax = 20
    mov         ebx,0ffh   ; ebx = 0xff
■ メモリデータの扱い
        // ; eax = *address
        mov         eax,[address] 
        mov         [address],eax ; *address = eax
■ mov
  SYNTAX
    mov  dst,  src
  DESC
    データを移動する
    // ecx, ebx を交換する
    mov eax,  ecx
    mov ebx,  ecx
    mov ecx,  ebx
■ push.pop
  SYNTAX
    push src
  SYNTAX
    pop dst
  DESC
    スタックにワード, ダブルワードの値をプッシュする。
    現在のスタックトップの値をもつ ESP レジスタの値を更新する。
    // 固定値, レジスタ, メモリアドレスなどを push できる。
    push 10
    // push すると ESP レジスタの値が 4 減る
    push 20
    push ecx
    push edx
    pop  edx
    pop  ecx
    push ecx
    push edx
    pop  ecx
    pop  edx
■ cmp
  SYNTAX
    cmp src, dst
  DESC
    2つのオペランドを比較する。
    減算した結果を EFLAGS レジスタの対応するフラグを設定する。
■ movs
  SYNTAX
    movs dst, src
  DESC 
    ESI レジスタに設定されているアドレスから EDI レジスタに設定されているアドレスへ
    データを移動する。
    memcpy をする。
    mov ESI, src
    mov EDI, dst
    mov ecx, nr
    
    REP movs BYTE PTR [EDI], BYTE PTR [ESI]
■ プロローグ設定
    push EBP
    mov EBP, ESP
    
    // ローカル変数用に 20 byte 確保
    sub ESP, 20h
■ エピローグ設定
    // スタック値の回復
    mov ESP, EBP
    // 
    pop EBP
    push  1h
    call  func
    add   esp,  4
■ call
  SYNTAX
    call src
  DESC
    関数をコールする。
    コールした後は呼び出し元に戻る必要があるため、
    戻るアドレスをスタックにプッシュする。
    そのため呼ばれた側で ESP の値を見れば、戻るアドレスが分る。
    
    // ローカル関数の呼び出しは、目的の関数のアドレスを指定するだけ
    int func() {
    }
    __asm {
      call func
    }
■ jmp
  DESC
    絶対アドレスに実行を移す。
    
    // test というラベルに移動する。
    jmp test
    test:
    // i と 0 を比較する
    cmp i 0
    JLE  less
    
■ LEA
  SYNTAX
    lea  DST  SRC
  DESC
    src オペランドのアドレスを dst レジスタにセットする。
    // int 型の変数 i のアドレスを設定する
    
    int i = 0;
    LEA  eax,  i
    // char 型の配列のアドレスを設定する
    char buf[256];
    LEA ecx,  buf
    push ecx
    call  DWORD PTR [GetWindowsDirectory]
      int i = 7;
      00401016  mov         dword ptr [i],7 
      int &j = i;    
      0040101D  lea         eax,[i] 
      // i のアドレスを j の指す先に 移動する
      00401020  mov         dword ptr[j], eax       
■ inc.dec
    int i =  0;
    __asm {
      inc i
      dec i
    }
■ fld
  SYNTAX
    fld 
    
  DESC
    float 型データの push
    
■ fstp
  SYNTAX
    fstp 
    
  DESC
    float 型データの pop
    float i,j;
    i=10.0001;
    _asm{
        // i の値を push
        fld i 
        // j にポップする
        fstp j
   }    
■ fild
  SYNTAX
    
  
■ fadd  
  SYNTAX
    fadd fD, fA, fB
    
  DESC
    float の加算
    fAとfBの和をfDに格納する。(倍精度)