Ensamblaje - Gestión de archivos

El sistema considera cualquier dato de entrada o salida como flujo de bytes. Hay tres flujos de archivos estándar:

  • Entrada estándar (stdin),
  • Salida estándar (stdout) y
  • Error estándar (stderr).

Descriptor de archivo

UN file descriptores un entero de 16 bits asignado a un archivo como ID de archivo. Cuando se crea un archivo nuevo o se abre un archivo existente, el descriptor de archivo se utiliza para acceder al archivo.

Descriptor de archivo de los flujos de archivos estándar - stdin, stdout y stderr son 0, 1 y 2, respectivamente.

Puntero de archivo

UN file pointerespecifica la ubicación para una operación de lectura / escritura posterior en el archivo en términos de bytes. Cada archivo se considera una secuencia de bytes. Cada archivo abierto está asociado con un puntero de archivo que especifica un desplazamiento en bytes, relativo al comienzo del archivo. Cuando se abre un archivo, el puntero del archivo se establece en cero.

Llamadas al sistema de manejo de archivos

La siguiente tabla describe brevemente las llamadas al sistema relacionadas con el manejo de archivos:

% eax Nombre % ebx % ecx % edx
2 sys_fork struct pt_regs - -
3 sys_read int sin firmar char * size_t
4 sys_write int sin firmar const char * size_t
5 sys_open const char * En t En t
6 sys_close int sin firmar - -
8 sys_creat const char * En t -
19 sys_lseek int sin firmar off_t int sin firmar

Los pasos necesarios para usar las llamadas al sistema son los mismos, como comentamos anteriormente:

  • Ponga el número de llamada del sistema en el registro EAX.
  • Almacene los argumentos de la llamada al sistema en los registros EBX, ECX, etc.
  • Llame a la interrupción correspondiente (80h).
  • El resultado generalmente se devuelve en el registro EAX.

Crear y abrir un archivo

Para crear y abrir un archivo, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_creat () número 8, en el registro EAX.
  • Ponga el nombre del archivo en el registro EBX.
  • Ponga los permisos del archivo en el registro ECX.

La llamada al sistema devuelve el descriptor de archivo del archivo creado en el registro EAX, en caso de error, el código de error está en el registro EAX.

Abrir un archivo existente

Para abrir un archivo existente, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_open () número 5, en el registro EAX.
  • Ponga el nombre del archivo en el registro EBX.
  • Ponga el modo de acceso a archivos en el registro ECX.
  • Ponga los permisos del archivo en el registro EDX.

La llamada al sistema devuelve el descriptor de archivo del archivo creado en el registro EAX, en caso de error, el código de error está en el registro EAX.

Entre los modos de acceso a archivos, los más utilizados son: solo lectura (0), solo escritura (1) y lectura-escritura (2).

Leer de un archivo

Para leer de un archivo, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_read () número 3, en el registro EAX.

  • Coloque el descriptor de archivo en el registro EBX.

  • Coloque el puntero en el búfer de entrada en el registro ECX.

  • Ponga el tamaño del búfer, es decir, el número de bytes a leer, en el registro EDX.

La llamada al sistema devuelve el número de bytes leídos en el registro EAX, en caso de error, el código de error está en el registro EAX.

Escribir en un archivo

Para escribir en un archivo, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_write () número 4, en el registro EAX.

  • Coloque el descriptor de archivo en el registro EBX.

  • Coloque el puntero en el búfer de salida en el registro ECX.

  • Ponga el tamaño del búfer, es decir, el número de bytes a escribir, en el registro EDX.

La llamada al sistema devuelve el número real de bytes escritos en el registro EAX, en caso de error, el código de error está en el registro EAX.

Cerrar un archivo

Para cerrar un archivo, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_close () número 6, en el registro EAX.
  • Coloque el descriptor de archivo en el registro EBX.

La llamada al sistema devuelve, en caso de error, el código de error en el registro EAX.

Actualizar un archivo

Para actualizar un archivo, realice las siguientes tareas:

  • Ponga la llamada al sistema sys_lseek () número 19, en el registro EAX.
  • Coloque el descriptor de archivo en el registro EBX.
  • Ponga el valor de compensación en el registro ECX.
  • Ponga la posición de referencia para el desplazamiento en el registro EDX.

La posición de referencia podría ser:

  • Comienzo del archivo - valor 0
  • Posición actual - valor 1
  • Fin de archivo - valor 2

La llamada al sistema devuelve, en caso de error, el código de error en el registro EAX.

Ejemplo

El siguiente programa crea y abre un archivo llamado myfile.txt y escribe un texto "Bienvenido a Tutorials Point" en este archivo. A continuación, el programa lee el archivo y almacena los datos en un búfer llamado info . Por último, muestra el texto almacenado en información .

section	.text
   global _start         ;must be declared for using gcc
	
_start:                  ;tell linker entry point
   ;create the file
   mov  eax, 8
   mov  ebx, file_name
   mov  ecx, 0777        ;read, write and execute by all
   int  0x80             ;call kernel
	
   mov [fd_out], eax
    
   ; write into the file
   mov	edx,len          ;number of bytes
   mov	ecx, msg         ;message to write
   mov	ebx, [fd_out]    ;file descriptor 
   mov	eax,4            ;system call number (sys_write)
   int	0x80             ;call kernel
	
   ; close the file
   mov eax, 6
   mov ebx, [fd_out]
    
   ; write the message indicating end of file write
   mov eax, 4
   mov ebx, 1
   mov ecx, msg_done
   mov edx, len_done
   int  0x80
    
   ;open the file for reading
   mov eax, 5
   mov ebx, file_name
   mov ecx, 0             ;for read only access
   mov edx, 0777          ;read, write and execute by all
   int  0x80
	
   mov  [fd_in], eax
    
   ;read from file
   mov eax, 3
   mov ebx, [fd_in]
   mov ecx, info
   mov edx, 26
   int 0x80
    
   ; close the file
   mov eax, 6
   mov ebx, [fd_in]
   int  0x80    
	
   ; print the info 
   mov eax, 4
   mov ebx, 1
   mov ecx, info
   mov edx, 26
   int 0x80
       
   mov	eax,1             ;system call number (sys_exit)
   int	0x80              ;call kernel

section	.data
file_name db 'myfile.txt'
msg db 'Welcome to Tutorials Point'
len equ  $-msg

msg_done db 'Written to file', 0xa
len_done equ $-msg_done

section .bss
fd_out resb 1
fd_in  resb 1
info resb  26

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Written to file
Welcome to Tutorials Point