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