Hello World in Assembly (x86-64) op Linux
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.
- Assembleren: De broncode wordt met
as
omgezet naar een objectbestand (.o
). - Linken: Het objectbestand wordt met
ld
(de GNU linker) gelinkt tot een uitvoerbaar bestand.
Voorbeeld:
as -o hello.o hello.s
assembleert het bestandhello.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.