# SYSTEM CALLS

Puede hacer uso de las llamadas al sistema Linux en sus programas de ensamblaje. Debe seguir los siguientes pasos para usar las llamadas al sistema Linux en su programa:

* 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.

Hay seis registros que almacenan los argumentos de la llamada al sistema utilizada. Estos son EBX, ECX, EDX, ESI, EDI y EBP. Estos registros toman los argumentos consecutivos, comenzando con el registro EBX. Si hay más de seis argumentos, la ubicación de memoria del primer argumento se almacena en el registro EBX.

El siguiente fragmento de código muestra el uso de la llamada al sistema sys\_exit:

```
mov	eax,1		; Numero de llamadas al sistema (sys_exit)
int	0x80		; Llamada al kernel.
```

Veamos el uso de la llamada sys\_wryte:

```
mov	edx,4		; Tamano del mensaje
mov	ecx,msg		; Escribir mensaje
mov	ebx,1		; Decriptor de archivo (stdout)
mov	eax,4		; Numero de llamadas al sistema (sys_write)
int	0x80		; Llamadas al kernel
```

Todas las llamadas al sistema se enumeran en */usr/include/asm/unistd.h* , junto con sus números (el valor que debe ingresar en EAX antes de llamar a int 80h).

La siguiente tabla muestra algunas de las llamadas al sistema utilizadas en este tutorial:

<table><thead><tr><th width="88">EAX</th><th width="108">Name</th><th width="142">EBX</th><th width="104">ECX</th><th width="104">EDX</th><th width="65">ESX</th><th>EDI</th></tr></thead><tbody><tr><td>1</td><td>sys_exit</td><td>int</td><td>-</td><td>-</td><td>-</td><td>-</td></tr><tr><td>2</td><td>sys_fork</td><td>struct pt_regs</td><td>-</td><td>-</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><td>-</td><td>-</td></tr><tr><td>4</td><td>sys_write</td><td>unsigned int</td><td>const char *</td><td>size_t</td><td>-</td><td>-</td></tr><tr><td>5</td><td>sys_open</td><td>const char *</td><td>int</td><td>int</td><td>-</td><td>-</td></tr><tr><td>6</td><td>sys_close</td><td>unsigned int</td><td>-</td><td>-</td><td>-</td><td>-</td></tr></tbody></table>

## Modos de Direccionamiento

Una dirección de operando proporciona la ubicación, donde se almacenan los datos que se van a procesar. Algunas instrucciones no requieren un operando, mientras que otras instrucciones pueden requerir uno, dos o tres operandos.

Cuando una instrucción requiere dos operandos, el primer operando generalmente es el destino, que contiene datos en un registro o ubicación de memoria y el segundo operando es la fuente. La fuente contiene los datos que se entregarán (direccionamiento inmediato) o la dirección (en registro o memoria) de los datos. Generalmente, los datos de origen permanecen inalterados después de la operación.

Los tres modos básicos de direccionamiento son:

* Registrar direccionamiento
* Direccionamiento inmediato
* Direccionamiento de memoria

### Registrar direccionamiento:

En este modo un registro contiene el operando. Dependiendo de la instrucción, el registro puede ser el primer operando, el segundo operando o ambos.

```
MOV DX, TX_RATE    ; Registro en el primer operando
MOV COUNT, CX      ; Registro en el segundo operando
MOV EAX, ECX       ; Ambos operandos 
```

### Direccionamiento inmediato:

Un operando inmediato tiene un valor constante o una expresion. Cuando una instruccion con dos operandos usa direccionamientoinmediato, el primer operando puede ser un registro o ubicacion de memoria y el segundo operando es una constante inmediata. El primero define la longitud de los datos.

```
BYTE_VALUE  DB  150    ; Se define un varlor de bite
WORD_VALUE  DW  300    ; Se define un valor de palabra
ADD  BYTE_VALUE, 65    ; Se agrega un operando inmedianto 65
MOV  AX, 45H           ; La constante 45h se agrega en AX
```

### Direccionamiento de memoria:

&#x20;Esta forma de direccionamiento da como resultado un procesamiento más lento de los datos. Para ubicar la ubicación exacta de los datos en la memoria, necesitamos la dirección de inicio del segmento, que generalmente se encuentra en el registro DS y un valor de compensación. Este valor de compensación también se denomina dirección efectiva .

En el modo de direccionamiento directo, el valor de compensación se especifica directamente como parte de la instrucción, generalmente indicado por el nombre de la variable. El ensamblador calcula el valor de compensación y mantiene una tabla de símbolos que almacena los valores de compensación de todas las variables utilizadas en el programa.

En el direccionamiento directo de memoria, uno de los operandos hace referencia a una ubicación de memoria y el otro operando hace referencia a un registro.

```
ADD	BYTE_VALUE, DL	; Agrega el registro en la ubicación de memoria
MOV	BX, WORD_VALUE	; Operando de la memoria se agrega al registro
```

### Direccionamiento de Displazamiento Directo:

Es este modo se utiliza los operadores aritmeticos para modificar unadireccion:

```
BYTE_TABLE DB  14, 15, 22, 45      ; Tabla de bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tabla de palabras
```

### Direccionamiento indirecto de memoria:

Este modo utiliza la capacidad de la computadora de `direccionamiento Segmento: Desplazamiento .` Los registros base `EBX, EBP (o BX, BP) y los registros de indice (DI, SI)` codificados enter corchetes para referencias de memoria.

Este dioreccionamiento generalmente se usa para variables que contienen varios elementos como matrices. La direccion inicial de la matriz se almacena, por ejemplo en el registro EBX.

El siguiente codigo mustra como acceder a diferentes elementos de la variable.

```
MY_TABLE TIMES 10 DW 0  ; Asigna 10 palabras (2 bytes) cada una inicia a 0
MOV EBX, [MY_TABLE]     ; Direccion de my_table en EBX
MOV [EBX], 110          ; My_table[0] = 110
ADD EBX, 2              ; EBX = EBX +2
MOV [EBX], 123          ; My_table[1] = 123
```

### Instruccion MOV

Se usa para mover espacios de almcenamiento a otro. Esta instriccion toma dos operandos:

`SINTAXIS:`

```
MOV destination, source
```

Esta instruccion puede tener una de las siguientes cinco formas:

```
MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register
```

* Ambos operandos en MOV deben de tener el mismo tamaño.
* El valor del operando fuente (source) permanece sin cambios.

Esta instruccion causa ambiguedad a veces. Por ejemplo:

```
MOV EBX, [MY_TABLE]    ; Direccion de MY_TABLE A EBX   
MOV [EBX], 110         ; MY_TABLE[0] = 110
```

No esta claro si desea mover un byte o una palabra equivalente al nuemro 110. En estos casos se aconseja utilizar un especificador de tipo.

Especificadores mas comunes:

| Type Specifier | Bytes addressed |
| -------------- | --------------- |
| BYTE           | 1               |
| WORD           | 2               |
| DWORD          | 4               |
| QWORD          | 8               |
| TBYTE          | 10              |

`Ejemplo:` Vemos esto al momento de imprimir los siguientes datos:

```
section .text     ----|
    global _start     |=  ; Iniciamos el programa.
_start:           ----|
    
    ; Queremos que nos imprima 'Zara Ali'
    mov edx, 9        ; contiene la cantidad de bits en el texto
    mov ecx, name     ; Establece la direccion de cadena
    mov ebx, 1        ; Establece el descriptor en 1 para salida/imprimir
    mov eax, 4        ; Establece el modo escritura en sistema
    int 0x80          ; Hace llamada al kernel
    
    
    mov [name], dword 'Nahu' ; Agrega un cambio de nombre a 'Nahu Ali'
    
    mov edx, 8  -------\
    mov ecx, name      |
    mov ebx, 1         |= ; Hace lo mismo que las intrucciones anteriores
    mov eax, 4         |
    int 0x80     ------/
    
    mox eax, 1        ; Agregamos el cierre del programa con el eax = 1
    int 0x80        
    
    ; Este ultimo segmento de encarga que la variable con el valor a imprimir
section .data      
name bd 'Zara Ali'
    
```


---

# 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/system-calls.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.
