Int 80h

De Wikipedia, la enciclopedia libre

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[editar]

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[editar]

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[editar]

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

Véase también[editar]

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

Linux Syscall Reference (En inglés)