Assemblage macOS : Bonjour le monde

Home PDF

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

Back 2025.02.22 Donate