En aquest tema, aprendrem sobre les subrutines i els procediments en el llenguatge Assembly. Aquestes estructures són fonamentals per organitzar el codi, reutilitzar-lo i fer-lo més llegible i mantenible.
Què són les Subrutines i els Procediments?
Les subrutines i els procediments són blocs de codi que es poden cridar des de diferents parts d'un programa. Permeten dividir el codi en parts més petites i manejables, facilitant la seva reutilització i manteniment.
Conceptes Clau
- Subrutina: Un bloc de codi que realitza una tasca específica i que es pot cridar des de qualsevol part del programa.
- Procediment: Un altre terme per referir-se a una subrutina, sovint utilitzat en el context de llenguatges de programació d'alt nivell.
- Crida de Subrutina: La instrucció que invoca una subrutina.
- Retorn de Subrutina: La instrucció que retorna el control al punt des d'on es va cridar la subrutina.
Estructura d'una Subrutina
Una subrutina en Assembly generalment segueix aquesta estructura:
- Etiqueta de la Subrutina: Un nom que identifica la subrutina.
- Codi de la Subrutina: Les instruccions que conformen la subrutina.
- Instrucció de Retorn: Una instrucció que retorna el control al punt de crida.
Exemple de Subrutina
section .data ; Aquí es poden definir dades si cal section .bss ; Aquí es poden definir variables no inicialitzades section .text global _start _start: ; Crida a la subrutina call my_subroutine ; Sortida del programa mov eax, 1 ; syscall number (sys_exit) xor ebx, ebx ; exit code 0 int 0x80 ; call kernel my_subroutine: ; Codi de la subrutina mov eax, 4 ; syscall number (sys_write) mov ebx, 1 ; file descriptor (stdout) mov ecx, message ; pointer to message mov edx, message_len ; message length int 0x80 ; call kernel ; Retorn de la subrutina ret section .data message db 'Hola, món!', 0xA message_len equ $ - message
Explicació del Codi
- Crida a la Subrutina: La instrucció
call my_subroutine
crida la subrutinamy_subroutine
. - Codi de la Subrutina: La subrutina escriu un missatge a la sortida estàndard (stdout) utilitzant una crida al sistema (
sys_write
). - Retorn de la Subrutina: La instrucció
ret
retorna el control al punt immediatament després de la crida a la subrutina.
Passant Paràmetres a les Subrutines
Els paràmetres es poden passar a les subrutines mitjançant registres o la pila.
Exemple de Passar Paràmetres amb Registres
section .text global _start _start: ; Passar paràmetres a la subrutina mov eax, 5 mov ebx, 10 call add_numbers ; Sortida del programa mov eax, 1 ; syscall number (sys_exit) xor ebx, ebx ; exit code 0 int 0x80 ; call kernel add_numbers: ; Sumar els valors en eax i ebx add eax, ebx ; Retorn de la subrutina ret
Exemple de Passar Paràmetres amb la Pila
section .text global _start _start: ; Passar paràmetres a la subrutina push 5 push 10 call add_numbers ; Sortida del programa mov eax, 1 ; syscall number (sys_exit) xor ebx, ebx ; exit code 0 int 0x80 ; call kernel add_numbers: ; Recuperar els paràmetres de la pila pop ebx pop eax ; Sumar els valors en eax i ebx add eax, ebx ; Retorn de la subrutina ret
Exercicis Pràctics
Exercici 1: Crear una Subrutina que Multipliqui Dos Nombres
Descripció: Escriu una subrutina que multipliqui dos nombres passats com a paràmetres i retorni el resultat.
Solució:
section .text global _start _start: ; Passar paràmetres a la subrutina mov eax, 3 mov ebx, 4 call multiply_numbers ; Sortida del programa mov eax, 1 ; syscall number (sys_exit) xor ebx, ebx ; exit code 0 int 0x80 ; call kernel multiply_numbers: ; Multiplicar els valors en eax i ebx imul eax, ebx ; Retorn de la subrutina ret
Exercici 2: Crear una Subrutina que Calculi el Factorial d'un Nombre
Descripció: Escriu una subrutina que calculi el factorial d'un nombre passat com a paràmetre.
Solució:
section .text global _start _start: ; Passar paràmetres a la subrutina mov eax, 5 call factorial ; Sortida del programa mov eax, 1 ; syscall number (sys_exit) xor ebx, ebx ; exit code 0 int 0x80 ; call kernel factorial: ; Guardar el valor original d'eax push eax ; Inicialitzar el resultat a 1 mov ebx, 1 factorial_loop: ; Multiplicar ebx per eax imul ebx, eax ; Decrementar eax dec eax ; Si eax és zero, sortir del bucle jnz factorial_loop ; Restaurar el valor original d'eax pop eax ; Guardar el resultat a eax mov eax, ebx ; Retorn de la subrutina ret
Resum
En aquesta secció, hem après què són les subrutines i els procediments, com estructurar-los i com passar paràmetres utilitzant registres i la pila. També hem vist exemples pràctics i exercicis per reforçar els conceptes apresos. Les subrutines són una eina poderosa per organitzar i reutilitzar el codi en els nostres programes en 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