La instruccion JMP se puede utilizar para implementar bucles. Por ejemplo, el siguiente fragmento de codigo, se puede usar para ejecutar para ejecutar el cuerpo del bucle 10 veces.
mov cl, 10 ; Mueve el 10 al cl
l1:
dec cl ; Decrementa en 1 el cl (tiene 10 decrementara 10 veces)
jnz l1 ; JNZ repitira l1 hasta que este en 0
El conjunto de instrucciones del procesador, incluye un grupo de instrucciones de bucle para implementar la iteracion.
LOOP label
Donde , label es la etiqueda de destino que identifica la instruccion de destino como en las intrucciones de salto. La instruccion LOOP asume que el registro ECX contine el conteo de bucles. Cuando se ejecuta la instruccion de bucle, el registro ECX se decrementa y el control salta a la etiqueta objetivo, hasta que el valor del registro ECX, es decir, el contador alcanaza el valor cero.
mov ECX, 10 ; Pasamos el 10 al ecx
l1
loop l1 ; Loop decrementa un valor
EJEMPLO:
El siguiente programa imprime el numero 1 al 9 en pantalla:
sectiom .text
global _start
_start:
mov ecx, 10 ; Pasamos 10 al ecx para establecer las iteraciones
mov eax, '1' ; Paso 1 al eax para establecer el valor inicial en outup
l1:
mov [num], eax ; Guarda el valor actual en la variable num
mov eax, 4 ; LLamamos sys_write
mov ebx, 1 ; Llamamos decriptor en 1
push ecx ; Manda el ecx a la pila
mov ecx, num ; carga la variable a ecx
mov edx, 1 ; Establece la length que sera de un bit
int 0x80 ;
mov eax, [num] ; Carga lo almacenado en num al eax
sub eax, '0' ; Resta el valor del caracter 0 al eax. Lo pasa a ascii
inc eax ; Incrememta en 1 al eax
add eax, '0' ; Suma el valor del caracter 0
pop ecx ; Recupera el valor original de ecx desde la pila
loop l1 ; Decrememta el valor de ecx y salta a l1 si no da 0
mov eax, 1 ; Cerramos el programa
int 0x80
section .bss
num resb 1