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
- 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ó.
- 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.
- 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.
Curs de Programació en Assembly
Mòdul 1: Introducció al Llenguatge Assembly
- Què és el Llenguatge Assembly?
- Història i Evolució de l'Assembly
- Conceptes Bàsics i Terminologia
- Configuració de l'Entorn de Desenvolupament
Mòdul 2: Fonaments del Llenguatge Assembly
- Comprensió de la CPU i la Memòria
- Registres i les Seves Funcions
- Sintaxi i Estructura Bàsiques
- Escrivint el Teu Primer Programa en Assembly
Mòdul 3: Representació de Dades i Instruccions
- Sistemes Binari i Hexadecimal
- Tipus de Dades i Mides
- Instruccions Aritmètiques
- Instruccions Lògiques
Mòdul 4: Flux de Control
Mòdul 5: Conceptes Avançats d'Assembly
- Interrupcions i Crides de Sistema
- Macros i Assembly Condicional
- Assembly Inline en Llenguatges d'Alt Nivell
- Optimització del Codi Assembly
Mòdul 6: Assembly per a Diferents Arquitectures
Mòdul 7: Aplicacions Pràctiques i Projectes
- Escrivint un Bootloader Simple
- Creant un Nucli Bàsic de Sistema Operatiu
- Interfície amb el Maquinari
- Depuració i Perfilat del Codi Assembly