> For the complete documentation index, see [llms.txt](https://mysther.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mysther.gitbook.io/knowledge-base/engenharia-reversa/linux/assembly.md).

# Assembly

### SYSCALL

Sempre que for programar em Assembly utilizando o Linux, devemos nos atentar as chamadas do Syscall e ao tipo de arquitetura (x86 ou x64).

Consulte sempre os devidos arquivos `unistd_32.h` e `unistd_64.h` para realizar corretamente as Syscalls, que geralmente estão localizados em `/usr/include/x86_64-linux-gnu/asm/`.

No fim desse post há 2 sites com base nesses arquivos, porém de uma forma mais amigável.

### Compilando

Converte o arquivo `.asm` em `Object File`. Note que será gerado um arquivo com o mesmo nome, porém com a extensão `.o`, então use o parâmetro `-o` para personalizar o nome do arquivo de saída.

```bash
# 32 bits
nasm -f elf32 <file_x86.asm>

# 64 bits
nasm -f elf64 <file_x64.asm>
```

Utilizando o `linker` para gerar arquivo final.

```bash
# 32 bits
ld --entry _main -m elf_i386 <file_x86.o> -o <output_file>

# 64 bits
ld --entry _main <file_x64.o> -o <output_file>
```

#### Sites

```
https://syscalls.w3challs.com/?arch=x86
https://syscalls.w3challs.com/?arch=x86_64
```
