# 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:

<table><thead><tr><th>%eax</th><th>Name</th><th width="157">%ebx</th><th width="176">%ecx</th><th>%edx</th></tr></thead><tbody><tr><td>2</td><td>sys_fork</td><td>struct pt_regs</td><td>-</td><td>-</td></tr><tr><td>3</td><td>sys_read</td><td>unsigned int</td><td>char *</td><td>size_t</td></tr><tr><td>4</td><td>sys_write</td><td>unsigned int</td><td>const char *</td><td>size_t</td></tr><tr><td>5</td><td>sys_open</td><td>const char *</td><td>int</td><td>int</td></tr><tr><td>6</td><td>sys_close</td><td>unsigned int</td><td>-</td><td>-</td></tr><tr><td>8</td><td>sys_creat</td><td>const char *</td><td>int</td><td>-</td></tr><tr><td>19</td><td>sys_lseek</td><td>unsigned int</td><td>off_t</td><td>unsigned int</td></tr></tbody></table>

### 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:`&#x20;

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 
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bla0x1s-organization.gitbook.io/untitled-1/reverse-engineering/assembly-x86/gestion-de-archivos.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
