
■ loop命令 ■
前回はCとアセンブラの環境設定を行い、簡単な計算を行なう
プログラムを作成しました。
以下に前回作成したプログラムを示します。
─↓test1.c──────────────────────
#include <stdio.h>
int main()
{
int a=5;
int b=3;
int result=0;
result = sub(a, b);
printf("result:%d\n", result);
return 0;
}
int sub(int a, int b)
{
_asm{
mov eax, a
mov ebx, b
add eax, ebx
}
}
─↑ここまで──────────────────────
上のプログラムのサブ関数は、データaとデータbの足し算を行
なっているものでした。
今回はループ命令を使用して足し算を繰り返し行なってみる事
にします。
インテルプロセッサにはさまざまなループ命令が用意されてい
ますが、今回はその中から「LOOP」という命令を紹介します。
説明を始める前に、前回作成したファイル"test1.c"をコピー
&貼り付けして、新しく"loop.c"というファイルを作成してく
ださい。
今回は"loop.c"に変更を加えていく事にします。
まずは、1回だけ足し算を行なっているコードをもう1度見て
みましょう。
─↓loop.c抜粋─────────────────────
mov eax, a
mov ebx, b
add eax, ebx
─↑ここまで──────────────────────
このコードを、ループ処理させる為に今から書き換えます。
上のコードを次の様に書き直してください。
─↓ここから──────────────────────
mov eax, a
mov ebx, b
LOOP1:
add eax, ebx
loop LOOP1
─↑ここまで──────────────────────
"LOOP1"というのは単なるラベルです。
ラベルなので"ABCDEFG"とかでも良いです。
インテルプロセッサは"loop"という命令を見つけると、指定さ
れた回数だけラベルに制御を移行します。
処理
LOOP1: │
┌───→│
│ │
│ │
│ 何らかの処理
↑ │
│ ↓
│ loop LOOP1
│ ↓指定された回数だけLOOP1に戻る
└────┘
上の例では「回数」が指定されていませんので、次の1行を追
加します。
mov ecx, 5
これは「ECX」というレジスタに5を格納しなさい、という命
令です。
これがインテルプロセッサがループ命令を処理する時に参照す
る回数になります。
この例では「ECX」レジスタに5を格納しているので、足し算
は5回行なわれる事になります。
処理
ECX に5を格納 ┌───┐
├───────→ ECX│ 5 │
LOOP1: │ └───┘
┌───→│
│ │
│ │
│ 何らかの処理
↑ │
│ ↓
│ loop LOOP1 ┌───┐
│ │←─────── ECX│ 5 │
│ ↓何回繰り返すか参照 └───┘
│ │
└────┘
「何回繰り返すか参照」する処理は、「loop」命令を使用する
事によりインテルプロセッサが自動的に行なってくれます。
以下に"loop.c"のサブルーチン部分の完成形を示します。
─↓ここから──────────────────────
int sub(int a, int b)
{
_asm{
mov eax, a
mov ebx, b
mov ecx, 5
LOOP1:
add eax, ebx
loop LOOP1
}
}
─↑ここまで──────────────────────
ちなみに、"loop"命令を1回処理する毎に「ECX」レジスタの
値は自動的に1減算されます。
ですので、5回ループが完了した時点での「ECX」レジスタの
中身は0になっています。
処理
ECX に5を格納 ┌───┐
├───────→ ECX│ 5 │
LOOP1: │ └───┘
┌───→│
│ │
│ │
│ 何らかの処理
↑ │
│ ↓
│ loop LOOP1 ┌───┐
│ │←─────── ECX│ 5 │
│ ↓何回繰り返すか参照 └───┘
│ │ ┌───┐
│ ├───────→ ECX│ 4 │
└────┘ECX を1減算 └───┘
「何回繰り返すか参照」する処理と「ECXを1減算」する処理
は、「loop」命令を使用する事によりインテルプロセッサが自
動的に行なってくれます。
● ●
● ビルドする ●
● ●
コマンドプロンプト上で以下の様に入力してください。
sc loop.c -j
 ̄
これでビルドされ、"loop.exe"という実行ファイルが作成され
るはずです。
「-j」というパラメータを付けると日本語も扱えるようになる
みたいです。
● ●
● 実行する ●
● ●
コマンドプロンプト上で以下の様に入力してください。
loop.exe
これで"result:20"と表示されたはずです。
これは足し算を5回繰り返して行なった結果です。
5 + 3 + 3 + 3 + 3 + 3 = 20
となりますね。
今回はループ命令について説明しました。
次回はループ命令を使用して少しだけ為になりそうな関数を作
成してみる予定です。