Assemblage macOS : Bonjour le monde
Bonjour le monde
#include <stdio.h>
int main() {
printf("Bonjour, le monde !\n");
return 0;
}
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 15, 0 sdk_version 15, 2
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #32
stp x29, x30, [sp, #16] ; 16-byte Folded Spill
add x29, sp, #16
.cfi_def_cfa w29, 16
.cfi_offset w30, -8
.cfi_offset w29, -16
mov w8, #0 ; =0x0
str w8, [sp, #8] ; 4-byte Folded Spill
stur wzr, [x29, #-4]
adrp x0, l_.str@PAGE
add x0, x0, l_.str@PAGEOFF
bl _printf
ldr w0, [sp, #8] ; 4-byte Folded Reload
ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
add sp, sp, #32
ret
.cfi_endproc
; -- End function
.section __TEXT,__cstring,cstring_literals
l_.str: ; @.str
.asciz "Bonjour, le monde !\n"
.subsections_via_symbols
gcc -S hello.c -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello
./hello
hexdump -C hello.o
Expérience
Ce code crée un programme “Bonjour le monde”. Il utilise des appels système pour écrire le message sur la console puis se terminer. La section .text
contient les instructions exécutables, commençant à _start
. Elle configure d’abord l’appel sys_write
(écriture sur stdout) puis l’appel sys_exit
(sortie propre). La section .data
stocke le message lui-même et calcule sa longueur.
.global _start
.text
_start:
// Écrire "Bonjour le monde !" sur stdout
mov x8, #64 // Numéro d'appel système pour write (sys_write)
mov x0, #1 // Descripteur de fichier 1 (stdout)
ldr x1, =msg // Adresse du message
mov x2, #17 // Longueur du message
svc #0 // Appeler l'appel système
// Quitter le programme
mov x8, #93 // Numéro d'appel système pour exit (sys_exit)
mov x0, #0 // Code de sortie 0
svc #0 // Appeler l'appel système
.data
msg:
.asciz "Bonjour le monde !\n"
as -o hello.o hello.s
% clang -o hello hello.o -nostdlib -e _start -Wl,-platform_version,macos,15.0,15.0 -arch arm64
% ./hello
zsh: appel système invalide ./hello