⚙️BUCLES

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

Última actualización