トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
VisualStudio
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ インラインアセンブラ(Assembler)



___

■ コンパイルオプションで出力する

main.cpp から main.asm が出力される。
    cl /FA  main.cpp
___

■ インラインアセンブラの基本

SYNTAX __asm {} src には固定値, メモリ, レジスタが指定できる。 dst にはレジスタ, メモリ参照を指定する。 Intel CPU は src, dst 共にレジスタ参照はできない。 POINT メモリ参照をするには [] 内でアドレスを指定する。
    // *iptr と同じ
    [00400000h]
アドレスの前には取り出すサイズを指定する。 指定がなければ DWORD PTR が適用される。
    
POINT アセンブラの機能ではないが、インラインアセンブラを使う場合は C/C++ で宣言した変数が使える
    // n 
    dword ptr [n]

___

■ 定数を代入する

    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
変数に i に 10 をセットする
    int i;
    __asm  mov i, 10
___

■ push.pop

SYNTAX push src SYNTAX pop dst DESC スタックにワード, ダブルワードの値をプッシュする。 現在のスタックトップの値をもつ ESP レジスタの値を更新する。

    // 固定値, レジスタ, メモリアドレスなどを push できる。
    push 10

    // push すると ESP レジスタの値が 4 減る
    push 20

スタックは LIFO なので push と pop は逆順になる。
    push ecx
    push edx

    pop  edx
    pop  ecx
スワップにも利用できる
    push ecx
    push edx

    pop  ecx
    pop  edx
{{{ { __asm NOP } }}} {{{ move eax ecx }}}
___

■ 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
POINT __cdecl 規約では関数をコールした後にスタックを元の位置に戻すのはコールした側
    push  1h
    call  func
    add   esp,  4
___

■ call

SYNTAX call src DESC 関数をコールする。 コールした後は呼び出し元に戻る必要があるため、 戻るアドレスをスタックにプッシュする。 そのため呼ばれた側で ESP の値を見れば、戻るアドレスが分る。
    // ローカル関数の呼び出しは、目的の関数のアドレスを指定するだけ

    int func() {

    }

    __asm {
      call func
    }
___

■ jmp

DESC 絶対アドレスに実行を移す。
    // test というラベルに移動する。
    jmp test

    test:

cmp を使った場合は, JE, JG, JL などを結果に応じて移動できる。 C で if に相当する処理。

    // 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に格納する。(倍精度)
















NINJAIDX 15