Ensamblaje - Bucles

La instrucción JMP se puede utilizar para implementar bucles. Por ejemplo, el siguiente fragmento de código se puede utilizar para ejecutar el cuerpo del bucle 10 veces.

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

Sin embargo, el conjunto de instrucciones del procesador incluye un grupo de instrucciones de bucle para implementar la iteración. La instrucción LOOP básica tiene la siguiente sintaxis:

LOOP 	label

Donde, etiqueta es la etiqueta de destino que identifica la instrucción de destino como en las instrucciones de salto. La instrucción LOOP asume que elECX register contains the loop count. Cuando se ejecuta la instrucción de ciclo, el registro ECX se decrementa y el control salta a la etiqueta de destino, hasta que el valor del registro ECX, es decir, el contador alcanza el valor cero.

El fragmento de código anterior podría escribirse como:

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

Ejemplo

El siguiente programa imprime el número del 1 al 9 en la pantalla:

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

123456789: