1.とりあえずやってみる
作成日:2004年07月16日
更新日:2005年04月07日
nameタグを追加



インラインアセンブラというのは,簡単に言うと高級言語のソースファイル中にアセンブラを直接記述するというものです.

「何で高級言語なのにわざわざアセンブラを使うんだ?」という声が聞こえてきますが,その辺はまぁとりあえず無視.

今回はまずインラインアセンブラが動くかどうか確かめてみます.



使用環境は次のとおり.

Windows XP Professional
Xeon 2.8GHz x 2
Microsoft VisualC++ 6.0

・・・・なんとも高性能なマシンです.それもそのはず,私が研究室で使用している,リアルタイム3次元挙動計算用マシンですから.

というわけで,今後書くコードはすべてPentium専用です.お間違いなく.

もうひとつ.ご存知の通りアセンブラは命令を直接書いているもので,ちょっとした事でとんでもないコードが出来上がったりします.

一応こちらで動作確認したコードしか載せませんが,実行の際は自己責任でお願いします



ではさっそくプログラムソースを見ていきましょう.

#include <stdio.h>

int add_int (int a, int b) {
    int c;
    __asm {
        mov    eax, a    // eaxレジスタにaの値をコピー
        add    eax, b    // eaxレジスタとbの値を加算してeaxレジスタに保存
        mov    c, eax    // cにeaxレジスタの値をコピー
    }
    return c;
}

int main (void) {
     printf ("1 + 1 = %d\n",add_int (1, 1));
     return 0;
}

・・・・・たったこれだけ.でもちゃんとアセンブラです.

ポイントは,__asm {...}で囲まれている部分にアセンブラのコードを直接書くということです.

当然ながらアセンブラのコード内には変数名を直接指定できます.

ここではEAXレジスタに値を代入しています.これはダブルワードレジスタと呼ばれるもので,32bit分のデータを保持します.



実行結果は次のようになります.


1 + 1 = 2


当たり前といえば当たり前の結果です.でも,この結果がアセンブラを使ったプログラムから出てきたことが重要なのです.



今回使用した命令は次のとおりです.

ADD - 整数加算
 第1オペランドと第2オペランドとの整数加算を行う.加算結果は第1オペランドに代入される.
命令説明
ADD AL,imm8imm8 をAL に加算
ADD AX,imm16imm16 をAX に加算
ADD EAX,imm32imm32 をEAX に加算
ADD r/m8,imm8imm8 をr/m8 に加算
ADD r/m16,imm16imm16 をr/m16 に加算
ADD r/m32,imm32imm32 をr/m32 に加算
ADD r/m8,r8r8 をr/m8 に加算
ADD r/m16,r16r16 をr/m16 に加算
ADD r/m32,r32r32 をr/m32 に加算
ADD r8,r/m8r/m8 をr8 に加算
ADD r16,r/m16r/m16 をr16 に加算
ADD r32,r/m32r/m32 をr32 に加算


MOV - 転送
 第1オペランドに第2オペランドの値を転送する
命令説明
MOV r/m8,r8r8 をr/m8 に転送
MOV r/m16,r16r16 をr/m16 に転送
MOV r/m32,r32r32 をr/m32 に転送
MOV r8,r/m8r/m8 をr8 に転送
MOV r16,r/m16r/m16 をr16 に転送
MOV r32,r/m32r/m32 をr32 に転送
MOV r8,imm8imm8 をr8 に転送
MOV r16,imm16imm16 をr16 に転送
MOV r32,imm32imm32 をr32 に転送
MOV r/m8,imm8imm8 をr/m8 に転送
MOV r/m16,imm16imm16 をr/m16 に転送
MOV r/m32,imm32imm32 をr/m32 に転送

なお,上に出てくるrやらmやらimmやらは次のとおりとなってます.

r8汎用バイトレジスタ(AL,CL,DL,BL,AH,CH,DH,BH)
r16汎用ワードレジスタ(AX,CX,DX,BX,SP,BP,SI,DI)
r32汎用ダブルワードレジスタ(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI)
m8バイトメモリオペランド(通常は変数名)
m16ワードメモリオペランド(通常は変数名)
m32ダブルワードメモリオペランド(通常は変数名)
imm8即値バイト値(-128〜+127)
imm16即値ワード値(-32,768〜+32,767)
imm32即値ダブルワード値(-2,147,483,648〜+2,147,483,647)
ALALレジスタ
AXAXレジスタ
EAXEAXレジスタ

毎回こんな感じで命令を追記していきます.



今回はここまで.

なお,Pentiumの命令セットなどは
http://www.intel.co.jp/jp/developer/design/pentium/manuals/にて公開されています.

さらに詳しい内容を知りたい場合は,ぜひ一読することをお勧めします.



もどる

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル