■ コンパイルオプションで出力する
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
変数に 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に格納する。(倍精度)