Assembler in macOS: Hallo Welt

Home PDF

Hallo Welt

#include <stdio.h>

int main() {
    printf("Hallo, Welt!\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	"Hello, World!\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

Experiment

Dieser Code erstellt ein “Hallo, Welt!”-Programm. Er verwendet Systemaufrufe, um die Nachricht auf die Konsole zu schreiben und dann zu beenden. Der Abschnitt .text enthält die ausführbaren Anweisungen, beginnend bei _start. Er richtet zuerst den sys_write-Aufruf (Ausgabe auf stdout) und dann den sys_exit-Aufruf (sauberes Beenden) ein. Der Abschnitt .data speichert die Nachricht selbst und berechnet deren Länge.

.global _start
.text

_start:
    // "Hallo, Welt!" auf stdout schreiben
    mov x8, #64             // Systemaufrufnummer für write (sys_write)
    mov x0, #1              // Dateideskriptor 1 (stdout)
    ldr x1, =msg            // Adresse der Nachricht
    mov x2, #14             // Länge der Nachricht
    svc #0                  // Systemaufruf aufrufen

    // Programm beenden
    mov x8, #93             // Systemaufrufnummer für exit (sys_exit)
    mov x0, #0              // Rückgabewert 0
    svc #0                  // Systemaufruf aufrufen

.data
msg:
    .asciz "Hello, World!\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: ungültiger Systemaufruf  ./hello

Back 2025.02.22 Donate