Premier programme 64 bit en assembleur sous FreeBSD : afficher du texte sur le terminal
Installation du compilateur NASM
Passer en root
su -
Installer le compilateur nasm
pkg ins -y nasm
Premier programme : hello.asm
Ecrivez le programme 'hello.asm' dans votre éditeur de code préféré
section .data
hello_message db 'hello world', 10 ; Le message à afficher avec un saut de ligne
section .text
global _start
_start:
; Écrire 'hello world' sur STDOUT
mov rax, 4 ; Le numéro de système pour sys_write sur FreeBSD
mov rdi, 1 ; STDOUT
mov rsi, hello_message ; Pointer vers le message à afficher
mov rdx, 12 ; La longueur du message à afficher (incluant le saut de ligne)
syscall ; Appeler le système
; Terminer le programme proprement
mov rax, 1 ; Le numéro de système pour sys_exit sur FreeBSD
xor rdi, rdi ; Code de sortie 0
syscall ; Appeler le système
Assembler
nasm -f elf64 hello.asm -o hello.o
Linker
ld hello.o -o hello
Lancer le programme
./hello
Seconde version : Deux lignes de texte
Créons désormais une seconde version de notre programme :
Ajoutons à présent une seconde ligne à notre sortie :
hello world
I'm great!
Voici le code :
- vous remarquerez qu'il faut faire 2 retours à la ligne après 'I'm great', autrement le prompt du shell sera collé ! Pas évident à comprendre au début.
- vous remarquerez aussi que la longueur du message à afficher est également différente (logique !)
section .data
hello_message db 'hello world', 10, 'I''m great!', 10, 10 ; Les messages à afficher avec un saut de ligne après chaque ligne et un saut de ligne à la fin
section .text
global _start
_start:
; Écrire 'hello world' et 'I'm great!' sur STDOUT
mov rax, 4 ; Le numéro de système pour sys_write sur FreeBSD
mov rdi, 1 ; STDOUT
mov rsi, hello_message ; Pointer vers le message à afficher
mov rdx, 23 ; La longueur des messages à afficher (incluant les sauts de ligne)
syscall ; Appeler le système
; Terminer le programme proprement
mov rax, 1 ; Le numéro de système pour sys_exit sur FreeBSD
xor rdi, rdi ; Code de sortie 0
syscall ; Appeler le système
Version alternative : Deux messages séparés
Le programme peut également être écrit ainsi :
section .data
hello_message db 'hello world', 10 ; Le message à afficher avec un saut de ligne
great_message db 'I''m great!', 10 ; Le second message à afficher avec un saut de ligne
section .text
global _start
_start:
; Écrire 'hello world' sur STDOUT
mov rax, 4 ; Le numéro de système pour sys_write sur FreeBSD
mov rdi, 1 ; STDOUT
mov rsi, hello_message ; Pointer vers le message à afficher
mov rdx, 12 ; La longueur du message à afficher (incluant le saut de ligne)
syscall ; Appeler le système
; Écrire 'I'm great!' sur STDOUT
mov rax, 4 ; Le numéro de système pour sys_write sur FreeBSD
mov rdi, 1 ; STDOUT
mov rsi, great_message ; Pointer vers le second message à afficher
mov rdx, 11 ; La longueur du second message à afficher (incluant le saut de ligne)
syscall ; Appeler le système
; Terminer le programme proprement
mov rax, 1 ; Le numéro de système pour sys_exit sur FreeBSD
xor rdi, rdi ; Code de sortie 0
syscall ; Appeler le système
Vous savez désormais comment afficher du texte sur le shell en assembleur !
ça paraît peu, mais c'est déjà beaucoup !
Version avec boucle : Répétition 10 fois
Créons désormais une boucle pour répéter l'apparition de nos 2 lignes 10 fois :
section .data
hello_message db 'hello world', 10, 'I''m great!', 10, 10 ; Les messages à afficher avec un saut de ligne après chaque ligne
hello_message_len equ $ - hello_message ; Longueur du message
section .text
global _start
_start:
; Initialiser le compteur de boucle
mov ecx, 10 ; Répéter 10 fois
repeat_loop:
; Écrire 'hello world' et 'I'm great!' sur STDOUT
mov rax, 4 ; Le numéro de système pour sys_write sur FreeBSD
mov rdi, 1 ; STDOUT
mov rsi, hello_message ; Pointer vers le message à afficher
mov rdx, hello_message_len ; La longueur des messages à afficher
syscall ; Appeler le système
; Décrémenter le compteur de boucle
dec ecx
jnz repeat_loop ; Répéter jusqu'à ce que ecx soit égal à zéro
; Terminer le programme proprement
mov rax, 1 ; Le numéro de système pour sys_exit sur FreeBSD
xor rdi, rdi ; Code de sortie 0
syscall ; Appeler le système
↑ Haut de page