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:
- Guardar l'Estat Actual: La CPU guarda l'estat actual del programa (registres, comptador de programa, etc.).
- Executar el Gestor d'Interrupcions: La CPU salta a una adreça específica on es troba el codi del gestor d'interrupcions.
- 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:
- Configurar els Paràmetres: Els paràmetres de la crida de sistema es passen a través de registres.
- Invocar la Crida de Sistema: Utilitzar una instrucció específica per invocar la crida de sistema.
- 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 registreeax
amb el número de crida de sistema per asys_write
.mov ebx, 1
: Configura el registreebx
amb el descriptor de fitxer per astdout
.mov ecx, msg
: Configura el registreecx
amb l'adreça del missatge.mov edx, len
: Configura el registreedx
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.
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