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: