⚙️GESTION DE ARCHIVOS

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

  • Entrada estandar (stdin).

  • Salida estandar (stdout).

  • Error estandar (stderr).

Descriptor de Archivo

Un descriptor de archivo es un numero entero de 16 bits asignado a un archivo como id de archivo. Cuando se crea un nuevo archivo o de abre un archivo existente, el decriptor de archivo se utiliza para acceder al archivo.

Decriptor de archivo de los flujos de archivo estandar: stdin, stdout, stderr son 0,1 y 2.

Puntero de Archivo

Un puntero especifica la ubicacion para una operacion de lectura/escritura posterior en el archivo en termino de bytes. Cada archivo se considera como secuencia de bytes. Cada archivo abierto esta asociado con un puntero de archivos que especifica un desplazamiento de bytes, en relacion con el comienzo del archivo. Cuando se abre un archivo el puntero se establece a cero.

Llamadas al sistema de manejo de archivos

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

%eax
Name
%ebx
%ecx
%edx

2

sys_fork

struct pt_regs

-

-

3

sys_read

unsigned int

char *

size_t

4

sys_write

unsigned int

const char *

size_t

5

sys_open

const char *

int

int

6

sys_close

unsigned int

-

-

8

sys_creat

const char *

int

-

19

sys_lseek

unsigned int

off_t

unsigned int

Crear una rchivo y abrirlo:

  • Coloque la llamada al sistema sys_create() 8, en el registro EAX.

  • Ponga el nombre del archivo en registro EBX.

  • Coloque los permisos del archivo en registro ECX.

Abrir un archivo existente:

  • Coloque la llamada al sustema sys_open() numero 5, en EAX.

  • Ponga el nombre del archivo en el registro EBX.

  • Ponga el modo de acceso a archivos en el registro ECX.

  • Coloque los permisos de archivo en EDX.

Lectura de un archivo:

  • Coloque la llamada al sistema sys_read() 3 en EAX.

  • Colocar el descriptor en EBX.

  • Coloque el puntero en el bufer de entrada en el registro ECX.

  • Coloque el tamano del bufer, es decir, el numero de bytes para leer, en el registro EDX.

Escribir en un archivo:

  • Coloque la llamada sys_write() 4 en EAX.

  • Coloque el desccriptor de archivo en EBX.

  • Coloque el puntero de salida en ECX.

  • Coloque el numero de bytes a escribir en el EDX.

Escribir un archivo:

  • Coloque la llamada al sistema sys_close() 6 en el EAX.

  • Coloque el descriptor de archivo en el EBX.

Actualizacion de un archivo:

  • Coloque la llamada sys_lseek() 19, en el EAX.

  • Coloque el descriptor del archivo.

  • Ponga el valor de compensacion en el registro ECX,

  • Coloque la posicion de referencia para el desplazamiento en el EDX.

La posicion de referencia podria hacer:

  • Comienzo del archivo - value1

  • Posicion actual - value2

  • Fin del archivo - value3

EJEMPLO:

El siguiente programa crea y abre un archivo llamado myfile.txt y escribe un texto 'Bienvenido ' 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 info .

section .data
    file_name db 'myfile.txt'
    msg db 'Bienvenido'
    len equ $ - msg
    
    msg_done db 'Escribe ', 0xa
    len_dine equ $ - msg_done
    
section .bss
    fd_out resb 1
    fd_in resb 1
    info resb 26

section .text
    global _start:
    
_start:

    ; creamos el archivo
    mov eax, 8
    mov ebx, fyle_name
    mov ecx, 0777            ; Le damos permisos 777
    int 0x80
    
    mov [fd_out], eax
    
    ; escribimos en el archivo
    mov edx, len
    mov ecx, msg
    mov ebx, [fd_out]
    mov eax, 4
    int 0x80
    
    ; cerramos el archivo
    mov eax, 6
    mov ebx, [fd_out] 
    
    ; escribe un mensage indicado en el fin
    mov eax, 4
    mov ebx, 1
    mov ecx, msg_done
    mov edx, len_done
    int 0x80
    
    ; abre el archivo para leer
    mov eax, 5
    mov ebx, file_name
    mov, ecx, 0                ; Para acceso solo de lectura
    mov edx, 0777
    int 0x80
    
    mov [fd_in], eax
    
    ; leer el archivo
    mov eax, 3
    moc ebx, [fd_in]
    mov ecx, info
    mov edx, 10
    int 0x80
    
    ; cierra el archivo
    mov eax, 6
    mov ebx, [fd_in]
    int 0x80
    
    ; imprime la info
    mov eax, 4
    mov ebx, 1
    mov ecx, info
    mox edx, 10
    int 0x80
    
    mov eax, 1
    int 0x80 

Última actualización