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:

  1. Etiqueta de la Subrutina: Un nom que identifica la subrutina.
  2. Codi de la Subrutina: Les instruccions que conformen la subrutina.
  3. 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

  1. Crida a la Subrutina: La instrucció call my_subroutine crida la subrutina my_subroutine.
  2. Codi de la Subrutina: La subrutina escriu un missatge a la sortida estàndard (stdout) utilitzant una crida al sistema (sys_write).
  3. 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.

© Copyright 2024. Tots els drets reservats