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