Introducció

En aquest tema, explorarem les interrupcions i les crides de sistema, dos conceptes fonamentals en la programació en Assembly que permeten interactuar amb el sistema operatiu i el maquinari. Les interrupcions són senyals que alteren el flux normal d'execució d'un programa per atendre esdeveniments externs o interns. Les crides de sistema són funcions proporcionades pel sistema operatiu que permeten als programes d'usuari realitzar operacions privilegiades.

Conceptes Clau

Interrupcions

  • Definició: Una interrupció és un senyal enviat a la CPU que indica que un esdeveniment necessita atenció immediata.
  • Tipus d'Interrupcions:
    • Interrupcions de Maquinari: Generades per dispositius externs com teclats, ratolins, etc.
    • Interrupcions de Programari: Generades per instruccions específiques dins del codi del programa.
    • Interrupcions Internes: Generades per esdeveniments interns com errors de divisió per zero.

Crides de Sistema

  • Definició: Les crides de sistema són interfícies que permeten als programes d'usuari sol·licitar serveis del sistema operatiu.
  • Funcions Comunes:
    • Gestió de Fitxers: Obrir, llegir, escriure i tancar fitxers.
    • Gestió de Processos: Crear, finalitzar i sincronitzar processos.
    • Gestió de Memòria: Assignar i alliberar memòria.

Interrupcions en Assembly

Estructura d'una Interrupció

Quan es produeix una interrupció, la CPU segueix els següents passos:

  1. Guardar l'Estat Actual: La CPU guarda l'estat actual del programa (registres, comptador de programa, etc.).
  2. Executar el Gestor d'Interrupcions: La CPU salta a una adreça específica on es troba el codi del gestor d'interrupcions.
  3. Restaurar l'Estat: Després de gestionar la interrupció, la CPU restaura l'estat anterior i continua l'execució normal.

Exemple de Codi: Interrupció de Teclat en x86

section .bss
    buffer resb 16

section .text
    global _start

_start:
    ; Esperar una tecla
    mov ah, 0x00
    int 0x16

    ; Llegir la tecla
    mov ah, 0x00
    int 0x16
    mov [buffer], al

    ; Sortir del programa
    mov eax, 1
    int 0x80

Explicació del Codi:

  • int 0x16: Crida a la interrupció del BIOS per gestionar el teclat.
  • mov [buffer], al: Emmagatzema la tecla llegida en el buffer.
  • int 0x80: Crida de sistema per sortir del programa.

Crides de Sistema en Assembly

Estructura d'una Crida de Sistema

Les crides de sistema segueixen un patró similar:

  1. Configurar els Paràmetres: Els paràmetres de la crida de sistema es passen a través de registres.
  2. Invocar la Crida de Sistema: Utilitzar una instrucció específica per invocar la crida de sistema.
  3. Gestionar el Resultat: El resultat de la crida de sistema es retorna en un registre.

Exemple de Codi: Escriure a la Consola en x86

section .data
    msg db 'Hola, món!', 0xA
    len equ $ - msg

section .text
    global _start

_start:
    ; Escriure el missatge a la consola
    mov eax, 4          ; Número de crida de sistema per a sys_write
    mov ebx, 1          ; Descriptor de fitxer per a stdout
    mov ecx, msg        ; Adreça del missatge
    mov edx, len        ; Longitud del missatge
    int 0x80            ; Invocar la crida de sistema

    ; Sortir del programa
    mov eax, 1          ; Número de crida de sistema per a sys_exit
    xor ebx, ebx        ; Codi de sortida 0
    int 0x80            ; Invocar la crida de sistema

Explicació del Codi:

  • mov eax, 4: Configura el registre eax amb el número de crida de sistema per a sys_write.
  • mov ebx, 1: Configura el registre ebx amb el descriptor de fitxer per a stdout.
  • mov ecx, msg: Configura el registre ecx amb l'adreça del missatge.
  • mov edx, len: Configura el registre edx amb la longitud del missatge.
  • int 0x80: Invoca la crida de sistema.

Exercicis Pràctics

Exercici 1: Llegir una Cadena des del Teclat

Escriu un programa en Assembly que llegeixi una cadena de text des del teclat i la mostri a la consola.

Exercici 2: Crear un Fitxer i Escriure-hi

Escriu un programa en Assembly que creï un fitxer nou i escrigui un missatge dins d'ell.

Solucions

Solució a l'Exercici 1

section .bss
    buffer resb 128

section .text
    global _start

_start:
    ; Llegir una cadena des del teclat
    mov eax, 3          ; Número de crida de sistema per a sys_read
    mov ebx, 0          ; Descriptor de fitxer per a stdin
    mov ecx, buffer     ; Adreça del buffer
    mov edx, 128        ; Mida del buffer
    int 0x80            ; Invocar la crida de sistema

    ; Escriure la cadena a la consola
    mov eax, 4          ; Número de crida de sistema per a sys_write
    mov ebx, 1          ; Descriptor de fitxer per a stdout
    mov ecx, buffer     ; Adreça del buffer
    mov edx, 128        ; Mida del buffer
    int 0x80            ; Invocar la crida de sistema

    ; Sortir del programa
    mov eax, 1          ; Número de crida de sistema per a sys_exit
    xor ebx, ebx        ; Codi de sortida 0
    int 0x80            ; Invocar la crida de sistema

Solució a l'Exercici 2

section .data
    filename db 'nou_fitxer.txt', 0
    msg db 'Aquest és un missatge dins del fitxer.', 0xA
    len equ $ - msg

section .text
    global _start

_start:
    ; Crear un fitxer nou
    mov eax, 5          ; Número de crida de sistema per a sys_open
    mov ebx, filename   ; Adreça del nom del fitxer
    mov ecx, 0101o      ; Flags: O_CREAT | O_WRONLY
    mov edx, 0644o      ; Permisos: rw-r--r--
    int 0x80            ; Invocar la crida de sistema
    mov ebx, eax        ; Guardar el descriptor de fitxer

    ; Escriure el missatge al fitxer
    mov eax, 4          ; Número de crida de sistema per a sys_write
    mov ecx, msg        ; Adreça del missatge
    mov edx, len        ; Longitud del missatge
    int 0x80            ; Invocar la crida de sistema

    ; Tancar el fitxer
    mov eax, 6          ; Número de crida de sistema per a sys_close
    int 0x80            ; Invocar la crida de sistema

    ; Sortir del programa
    mov eax, 1          ; Número de crida de sistema per a sys_exit
    xor ebx, ebx        ; Codi de sortida 0
    int 0x80            ; Invocar la crida de sistema

Conclusió

En aquest tema, hem après sobre les interrupcions i les crides de sistema en Assembly. Hem vist com les interrupcions permeten gestionar esdeveniments externs i interns, i com les crides de sistema permeten als programes d'usuari interactuar amb el sistema operatiu. A més, hem practicat amb exemples de codi i exercicis per reforçar aquests conceptes. En el proper tema, explorarem les macros i l'assembly condicional per millorar la modularitat i la flexibilitat del nostre codi.

© Copyright 2024. Tots els drets reservats