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 $ - messageExplicació del Codi
- Crida a la Subrutina: La instrucció
call my_subroutinecrida 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ó
retretorna 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
retExemple 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
retExercicis 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
retExercici 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
retResum
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
