En aquest tema, aprendrem sobre els bucles i la iteració en el llenguatge Assembly. Els bucles són una part fonamental de qualsevol llenguatge de programació, ja que permeten repetir una sèrie d'instruccions fins que es compleixi una condició específica. En Assembly, els bucles es poden implementar de diverses maneres, utilitzant instruccions de salt condicional i incondicional.

Objectius

  • Comprendre el concepte de bucle i iteració.
  • Aprendre a utilitzar instruccions de salt per crear bucles.
  • Escriure bucles simples en Assembly.
  • Resoldre exercicis pràctics per reforçar els conceptes apresos.

Conceptes Clau

  1. Instruccions de Salt

Les instruccions de salt són essencials per controlar el flux del programa. Hi ha dos tipus principals:

  • Salt incondicional (JMP): Salta a una etiqueta específica sense cap condició.
  • Salts condicionals: Salten a una etiqueta específica només si es compleix una condició.

  1. Etiquetes

Les etiquetes són noms simbòlics que representen adreces de memòria en el codi. S'utilitzen per marcar llocs als quals es pot saltar.

  1. Registres de Comptador

Els registres de comptador, com el registre CX en x86, s'utilitzen sovint per controlar el nombre d'iteracions en un bucle.

Exemples Pràctics

Exemple 1: Bucle Simple amb JMP

section .data
    msg db 'Hola, món!', 0

section .bss

section .text
    global _start

_start:
    mov ecx, 5          ; Inicialitza el comptador a 5

bucle:
    ; Aquí anirien les instruccions a repetir
    ; Per exemple, podríem imprimir msg (això és només un exemple conceptual)
    
    loop bucle          ; Decrementa ecx i salta a 'bucle' si ecx no és zero

    ; Sortida del programa
    mov eax, 1          ; syscall: exit
    xor ebx, ebx        ; estat de sortida: 0
    int 0x80            ; crida al sistema

Exemple 2: Bucle amb Salt Condicional

section .data
    msg db 'Hola, món!', 0

section .bss

section .text
    global _start

_start:
    mov ecx, 5          ; Inicialitza el comptador a 5

bucle:
    ; Aquí anirien les instruccions a repetir
    ; Per exemple, podríem imprimir msg (això és només un exemple conceptual)
    
    dec ecx             ; Decrementa el comptador
    jnz bucle           ; Salta a 'bucle' si ecx no és zero

    ; Sortida del programa
    mov eax, 1          ; syscall: exit
    xor ebx, ebx        ; estat de sortida: 0
    int 0x80            ; crida al sistema

Exercicis Pràctics

Exercici 1: Bucle amb Comptador

Escriu un programa en Assembly que imprimeixi els números del 1 al 10 utilitzant un bucle.

Solució

section .data
    msg db 'Número: ', 0
    num db '0', 0

section .bss

section .text
    global _start

_start:
    mov ecx, 10         ; Inicialitza el comptador a 10
    mov ebx, 1          ; Inicialitza el número a 1

bucle:
    ; Aquí anirien les instruccions a repetir
    ; Per exemple, podríem imprimir el número (això és només un exemple conceptual)
    
    inc ebx             ; Incrementa el número
    dec ecx             ; Decrementa el comptador
    jnz bucle           ; Salta a 'bucle' si ecx no és zero

    ; Sortida del programa
    mov eax, 1          ; syscall: exit
    xor ebx, ebx        ; estat de sortida: 0
    int 0x80            ; crida al sistema

Exercici 2: Bucle amb Condició

Escriu un programa en Assembly que imprimeixi els números parells del 2 al 20 utilitzant un bucle.

Solució

section .data
    msg db 'Número parell: ', 0
    num db '0', 0

section .bss

section .text
    global _start

_start:
    mov ecx, 10         ; Inicialitza el comptador a 10
    mov ebx, 2          ; Inicialitza el número a 2

bucle:
    ; Aquí anirien les instruccions a repetir
    ; Per exemple, podríem imprimir el número (això és només un exemple conceptual)
    
    add ebx, 2          ; Incrementa el número en 2
    dec ecx             ; Decrementa el comptador
    jnz bucle           ; Salta a 'bucle' si ecx no és zero

    ; Sortida del programa
    mov eax, 1          ; syscall: exit
    xor ebx, ebx        ; estat de sortida: 0
    int 0x80            ; crida al sistema

Errors Comuns i Consells

  • Oblidar inicialitzar el comptador: Assegura't que el registre de comptador estigui correctament inicialitzat abans d'entrar al bucle.
  • No decrementar el comptador: Si no decrements el comptador dins del bucle, podries crear un bucle infinit.
  • Utilitzar salts incorrectes: Assegura't d'utilitzar les instruccions de salt correctes (JMP, JNZ, etc.) segons la lògica del teu bucle.

Resum

En aquesta secció, hem après com utilitzar bucles i iteració en Assembly. Hem vist com utilitzar instruccions de salt i registres de comptador per controlar el flux del programa i repetir instruccions. També hem practicat amb exemples i exercicis per reforçar els conceptes apresos. En la següent secció, explorarem les subrutines i procediments, que ens permetran modularitzar i organitzar millor el nostre codi Assembly.

© Copyright 2024. Tots els drets reservats