インラインアセンブラ構文
インラインアセンブラは、C言語では「__asm{…}」の括弧の中に書いていきます。
アセンブラ言語の命令
値を代入(コピー)する | 処理を行うとき、メモリからレジスタへ値をコピーする。処理が終わったらメモリへ戻す mov <レジスタ>, <代入する値やメモリ> mov <メモリ>, <代入する値やレジスタ> |
足し算 | 足し算を行うとき、メモリからレジスタに値をコピーしてから別の値を足す mov <レジスタ>, <値> add <レジスタ>, <加算する値> mov <メモリ>, <レジスタ> |
引き算 | 引き算を行うとき、メモリからレジスタに値をコピーしてから別の値を引く mov <レジスタ>, <値> sub <レジスタ>, <減算する値> mov <メモリ>, <レジスタ> |
かけ算 | かけ算を行うとき、メモリから2つのレジスタにコピーしてから、2つのレジスタでかけ算を行う mov eax, <値> mov ebx, <値> mul ebx //eaxとebxを乗算をして、答えはeaxは入る mov <メモリ>, eax |
わり算 | わり算を行うとき、メモリから2つのレジスタにコピーしてから、割り算を行う。余りを入れるレジスタにも0を入れて初期化しておく mov eax, <値> mov ebx, <値> mov edx, <値> div ebx // eaxをebxを割って、答えはeaxに、余りはedxに入る mov <メモリ>, eax mov <メモリ>, edx |
値を比べて、結果が同じならジャンプする | cmp <レジスタ> , <レジスタ> jp <ラベル> |
無条件に命令をジャンプする | jmp <ラベル> |
インラインアセンブラの例1
#include <stdio.h>
int main()
{
int i;
__asm mov i, 100
printf("i=%d\n", i);
return 0;
}
i=100
インラインアセンブラの例2
#include <stdio.h>
int main() {
char ch1, ch2;
__asm {
mov ch1, 0x41
mov ch2, 0x42
}
printf("ch1=%c, ch2=%c\n", ch1, ch2);
return 0;
}
ch1=A, ch2=B
インラインアセンブラの例3
#include <stdio.h>
int main() {
int ans1, ans2, ans3, ans4, ans5;
__asm
{
//加算
mov eax, 2
add eax,3
mov ans1,eax
//減算
mov eax, 5
sub eax, 3
mov ans2, eax
//乗算
mov eax, 3
mov ebx, 4
mul ebx
mov ans3, eax
//除算
mov eax, 10
mov ebx, 3
mov edx, 0
div ebx
mov ans4, eax
mov ans5, edx
}
printf("ans1=%d\n",ans1);
printf("ans2=%d\n", ans2);
printf("ans3=%d\n", ans3);
printf("ans4=%d\n", ans4);
printf("ans5=%d\n", ans5);
return 0;
}
ans1=5
ans2=2
ans3=12
ans4=3
ans5=1
コメント