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 0x80Explicació 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 sistemaExplicació del Codi:
mov eax, 4: Configura el registreeaxamb el número de crida de sistema per asys_write.mov ebx, 1: Configura el registreebxamb el descriptor de fitxer per astdout.mov ecx, msg: Configura el registreecxamb l'adreça del missatge.mov edx, len: Configura el registreedxamb 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 sistemaSolució 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 sistemaConclusió
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
