分かりやす〜い
コンピュータ技術情報

TOPに戻る
▼Processor
簡単なアセンブラ言語
┣ 高級、低級の意味と
┃ レジスタ、mov、add

┣ 計算を行う
┣ プログラムを作る
┣ loop命令
┣ Indexレジスタの
┃ 役割とレジスタの
┃ 大きさ
┣ リピートプリフィック
┃ ス・ストリング命令

┣ inc・dec命令
┣ MMX技術
┣ MMXレジスタ
┣ MMX・SIMD・SSE
┣ CMP・JMP命令
┣ 関数とパラメータ
┣ スタック領域
┣ ESPレジスタ
┣ セグメント・
┃   call・ret

┣ コードファイルを作る
┣ コードファイル説明1
┣ コードファイル説明2
┗ マイクロコード

Copyright(C) 2001-2002.ugpop. All rights reserved.




■デジタル用語辞典:
■ 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

となりますね。

今回はループ命令について説明しました。
次回はループ命令を使用して少しだけ為になりそうな関数を作
成してみる予定です。



▲このページの上へ

←前に戻る    ▲このページの上へ    続きを読む→

▲このページの上へ