Assembly, entrada y salida


Recuerda que Linux es un sistema operativo de 32 bits, por lo que es un sistema protegido y no nos permite acceder directamente a la BIOS y a otros elementos del hardware. Pero contamos con los servicios del núcleo de Linux, accesibles a través de la interrupción 80h.

Antes de comenzar debemos conocer los servicios o los números de las constantes de las llamadas al sistema. Podemos encontrar todos los servicios en el archivo unistd.h, unistd_32.h, unistd_64.h (Dependiendo de la arquitectura del procesador).

Por el momento solo usaremos los servicios para leer, escribir y salir.

Los parámetros para las funciones read y write son:

  • eax Aquí ingresamos el valor del servicio que utilizemos (03h para leer y 04h para escribir).
  • ebx Identificador del hardware a utilizar (0 Teclado, 1 Monitor).
  • ecx Indica el Área donde se mostraran los caracteres.
  • edx Longitud de caracteres.

Ahora podemos escribir nuestro código:

; nasm -f elf Servicios.S
; gcc Servicios.o -o Servicios

; Constantes de los servicios de Linux
%define __NR_exit	1
%define __NR_read	3
%define __NR_write	4

; Main
global main

; Datos con valor inicial
section .data

Mensaje db	'Escribe tu nombre:', 10, 0
Saludo	db	'Hola ', 0

; Datos sin valor inicial
section .bss

Nombre	resb	128

; Código
section .text

main:
	; Mostramos el mensaje inicial
	mov	eax, __NR_write
	mov	ebx, 1
	mov	ecx, Mensaje
	mov	edx, 19
	int	80h

	; Leemos lo que el usuario escribe
	mov	eax, __NR_read
	mov	ebx, 0
	mov	ecx, Nombre
	mov	edx, 128
	int	80h

	; Guardamos en número de caracteres introducidos
	push	eax

	; Saludamos al usuario
	mov	eax, __NR_write
	mov	ebx, 1
	mov	ecx, Saludo
	mov	edx, 5
	int	80h

	mov	eax, __NR_write
	mov	ebx, 1
	mov	ecx, Nombre
	pop	edx
	int	80h

	; Finalizamos el programa
	mov	eax, __NR_exit
	xor	ebx, ebx
	int	80h

Compilemos y ejecutemos nuestro programa:

$ nasm -f elf Servicios.S
$ gcc Servicios.o -o Servicios
$ ./Servicios
Escribe tu nombre:
Luis Alberto
Hola Luis Alberto

Posted in

Leave a Reply