C言語インラインアセンブラ

C

インラインアセンブラ構文

  インラインアセンブラは、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

コメント

タイトルとURLをコピーしました