⚙️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:
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