Int 80h

La instrucción int 80h es utilizada en lenguaje ensamblador x86 para provocar una interrupción de software e invocar los servicios de GNU/Linux. En Linux existen llamadas (system calls) que proveen funciones básicas para acceder al hardware: los discos, el teclado, el video, los puertos, etc. Estas funciones básicas se llaman servicios a programas o APIs (Application Programming Interface).

Introducción

Existen aproximadamente 250 servicios que brinda esta interrupción. El número del servicio se pone en EAX y luego se ponen los demás parámetros en los restantes registros del microprocesador: EBX, ECX, EDX, ESI, EDI y EBP.

Ejemplos

Servicio 1: salida del proceso actual y retorno al sistema que lo invocó. En EBX se coloca el modo de salida, generalmente ponemos 0 para indicar que la salida se produjo normalmente (es decir, no fue causada por un error).

En NASM

mov eax,1
mov ebx,0
int 80h

En Gas

movl $0, %ebx
movl $1, %eax
intl $0x80

Servicio 3: lectura (read). Los parámetros necesarios son:

EBX: unidad de entrada (0: entrada estándar).
ECX: Puntero a un área de memoria donde se dejarán los caracteres obtenidos.
EDX: Número máximo de caracteres a leer.

En NASM

mov eax,3
mov ebx,0
mov ecx,oración
mov edx,100 
int 80h

En Gas

movl $100, %edx 
movl $oración, %ecx
movl $0, %ebx
movl $3, %eax
intl $0x80

Servicio 4: escritura (write). Los parámetros necesarios son:

EBX: unidad de salida (1: salida estándar).
ECX: Puntero a un área de memoria donde se encuentran los caracteres a mostrar.
EDX: Número máximo de caracteres a mostrar.

En NASM

mov eax,4
mov ebx,1
mov ecx,oración
mov edx,100 
int 80h

En Gas

movl $100, %edx 
movl $oración, %ecx
movl $1, %ebx
movl $4, %eax
intl $0x80

Servicios para el trabajo con archivos

Servicio 5: apertura (open). Los parámetros necesarios son:

EBX: la dirección de una cadena de caracteres terminada en nulo.
ECX: Modo de acceso.
EDX: permisos al archivo, si se abre creándolo.

Modos de acceso:

O-RDONLY 0: El archivo se abre sólo para leer de él.
O-WRONLY 1: El archivo se abre sólo para escribir en él.
O-RDWR 2: El archivo se abre para lectura y escritura.
O-CREAT 256: Crear el archivo en caso de que no exista.
O-APPEND 2000h: El archivo se abre sólo para escritura al final, añadiendo información.

Permisos:

S-IRUSR 400H: El archivo puede ser leído por el dueño.
S-IWUSR 200h: El archivo puede ser escrito por el dueño.
S-IROTH: El archivo puede ser leído por otros usuarios.
S-IWOTH: El archivo puede ser escrito por otros usuarios .

En NASM

mov eax,5
mov ebx,pepito.txt,0
mov ecx,1
mov edx,0
int 80h

En Gas

movl $0, %edx 
movl $1, %ecx
movl $pepito.txt, %ebx
movl $5, %eax
intl $0x80

Como alternativa para crear archivos se puede usar el servicio 8 (create).

Para lectura y escritura del archivo se utilizan los servicios 3 y 4 mencionados anteriormente, pero se les cambia el valor de EBX por la dirección del archivo a leer/escribir o el descriptor del mismo.

Para manipular el puntero en el archivo se utiliza el servicio 13h (lseek). Los parámetros necesarios son:

EBX: Descriptor del archivo cuyo puntero va a manipularse
ECX: Número de bytes a desplazarse desde el punto que es indicado como referencia.
EDX: Punto de referencia para el desplazamiento. 0 inicio, 1 posición actual, 2 final

Ej: posicionarse al inicio del archivo

En NASM

mov eax,13h 
mov ebx, descriptor
mov ecx,0
mov edx,0 
int 80h

En Gas

movl $0, %edx 
movl $0, %ecx
movl $descriptor, %ebx
movl $0x13, %eax
intl $0x80

Después de trabajar con el archivo, éste se debe cerrar. Para eso existe el servicio 6 (close), para el cual basta poner en EBX el descriptor del archivo a cerrar.

Existen muchos más servicios, por ejemplo para el trabajo con el reloj del PC, para el trabajo con directorios, para eliminar procesos, etc.

Referencias

Unix Assembly Language Programming (En inglés) Archivado el 17 de febrero de 2020 en Wayback Machine.

Véase también

Linux System Call Table (En inglés) Archivado el 4 de octubre de 2012 en Wayback Machine.

Linux Syscall Reference (En inglés)