Assembly-programming-assembly-loops

提供:Dev Guides
移動先:案内検索

アセンブリ-ループ

JMP命令は、ループの実装に使用できます。 たとえば、次のコードスニペットを使用して、ループ本体を10回実行できます。

MOV CL, 10
L1:
<LOOP-BODY>
DEC CL
JNZ L1

ただし、プロセッサ命令セットには、反復を実装するためのループ命令のグループが含まれています。 基本的なLOOP命令には次の構文があります-

LOOP    label

ここで、_label_は、ジャンプ命令のようにターゲット命令を識別するターゲットラベルです。 LOOP命令は、* ECXレジスタにループカウント*が含まれていることを前提としています。 ループ命令が実行されると、ECXレジスタの値が減り、ECXレジスタ値、つまりカウンタが値ゼロに達するまで、コントロールがターゲットラベルにジャンプします。

上記のコードスニペットは次のように書くことができます-

mov ECX,10
l1:
<loop body>
loop l1

次のプログラムは、画面に1から9までの数字を印刷します-

section .text
   global _start        ;must be declared for using gcc

_start:                 ;tell linker entry point
   mov ecx,10
   mov eax, '1'

l1:
   mov [num], eax
   mov eax, 4
   mov ebx, 1
   push ecx

   mov ecx, num
   mov edx, 1
   int 0x80

   mov eax, [num]
   sub eax, '0'
   inc eax
   add eax, '0'
   pop ecx
   loop l1

   mov eax,1             ;system call number (sys_exit)
   int 0x80              ;call kernel
section .bss
num resb 1

上記のコードをコンパイルして実行すると、次の結果が生成されます-

123456789: