← Terug naar home
Blog artikel

Hello World in Assembly (x86-64) op Linux

In dit artikel maken we een eenvoudige `Hello World`-applicatie in x86-64 assembly op Linux. We zullen de basisprincipes van assembly-programmering behandelen en een stap-voor-stap gids geven om je eerste programma te schrijven, assembleren en uitvoeren.

Het programma

# -------------------------------------------------------------------------------------------------
#
# Hello World program in x86-64 Assembly (AT&T syntax)
#
# -------------------------------------------------------------------------------------------------

.section .data

    hello:
        .asciz "Hello, World!\n"
        hello_len = . - hello

.section .text
    .global _start

    _start:

        # Write the string to stdout
        mov    $1, %rax                # syscall: sys_write
        mov    $1, %rdi                # file descriptor: stdout
        mov    $hello, %rsi            # pointer to the string
        mov    $hello_len, %rdx        # length of the string
        syscall                        # invoke the kernel

        # Exit the program
        mov    $60, %rax               # syscall: sys_exit
        xor    %rdi, %rdi              # exit code 0
        syscall                        # invoke the kernel

Dit programma toont hoe je een eenvoudige "Hello, World!" op het scherm kunt afdrukken in x86-64 assembly op een Linux-systeem. De code is geschreven in AT&T-syntaxis, zoals gebruikt door de GNU Assembler (as). We maken gebruik van Linux-systeemaanroepen (syscalls) om tekst naar de standaarduitvoer (stdout) te schrijven en het programma correct af te sluiten. De gegevens worden gedefinieerd in de .data sectie, en de uitvoering start bij het _start label in de .text sectie. Registers zoals %rax, %rdi, %rsi en %rdx worden gebruikt om parameters aan de kernel door te geven volgens de Linux syscall-conventie.

Van Assembly naar ELF

Om een assemblyprogramma uit te voeren op Linux met de GNU Assembler (GAS), gebruik je de AT&T-syntaxis in je code en volg je twee stappen: assembleren en linken. De GNU toolchain bestaat uit as (de GNU assembler) en ld (de GNU linker), die samen een uitvoerbaar ELF-bestand produceren.

  1. Assembleren: De broncode wordt met as omgezet naar een objectbestand (.o).
  2. Linken: Het objectbestand wordt met ld (de GNU linker) gelinkt tot een uitvoerbaar bestand.

Voorbeeld:

  • as -o hello.o hello.s assembleert het bestand hello.s naar een objectbestand.
  • ld -o hello hello.o linkt het objectbestand en produceert een uitvoerbaar bestand.

Daarna kun je het programma uitvoeren met ./hello.

Conclusie

Je hebt nu gezien hoe je een eenvoudig "Hello, World!" programma in x86-64 assembly schrijft, assembleert en uitvoert op een Linux-systeem. Je weet hoe systeemaanroepen (syscalls) werken, hoe je registers correct gebruikt volgens de Linux syscall-conventie, en hoe je met de GNU Assembler (GAS) en GNU Linker (ld) een uitvoerbaar bestand bouwt.

Met deze basiskennis kun je beginnen met het verkennen van complexere programma's en dieper duiken in low-level Linux-programmering in assembly.