---
# System prepended metadata

title: Système

---

###### tags: 'Système'

# Système

## Calling conventions

linux `x86_64`

* return value: %rax
* paramètres entiers:
    * 6 premiers: %rdi, %rsi, %rdx, %rcx, %r8, %r9
    * les paramètres d'après sont passés sur la stack en 'ordre inverse'

## Memory operations

```
long *rax = (long *) 0x12345;

mov (%rax), %rdx
```

mmov 8(%rdi, %rcx, 4), %rax

rdi + rcx * 4 + 8

le format complet:
* offset(base, index, scale)
* base + index * scale + offset

_____

**base**: obligatoire, registre
**index**: registre/immédiat, default = 1
**scale**: immédiat, default = 0
**offset**: immédiat, default = 0

## Register aliases

%rax : 8 bytes
%eax : 4 bytes
%ax  : 2 bytes
%ax, %al : 1 byte chacun (%ah = hi(%ax), %al = lo(%ax))

%rbx, %ebx, %bx, %bh, %bl

%rdi, %edi, %di, %dil
%rsi, %edi, %si, %sil

## Qualificateur de taille d'instruction

q, quad -> 8 bytes
l, double ou long -> 4 bytes
w, wide -> 2 bytes
b, byte -> 1 byte

movl $1, %eax // 4 bytes -> int
movq $1, %rax // 8 bytes -> long
movb $1, %al // 1 byte -> char

mov $1, %al // 1 byte ~> movb


## Stack

* stocker les variables
* sauver les adresses de retour des fonctions

**registres:**       %rsp, %rbp (ne bouge pas, sert de référence pour repositionner rsp après un appel de fonction)
**instructions:**    push, pop