Ensamblaje en macOS: Hola Mundo

Home PDF

Hola Mundo

#include <stdio.h>

int main() {
    printf("Hola, Mundo!\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	"Hola, Mundo!\n"

.subsections_via_symbols
gcc -S hola.c -o hola.s
gcc -c hola.s -o hola.o
gcc hola.o -o hola
./hola
hexdump -C hola.o

Experimento

Este código crea un programa “Hola, Mundo!”. Utiliza llamadas al sistema para escribir el mensaje en la consola y luego salir. La sección .text contiene las instrucciones ejecutables, comenzando en _start. Primero configura la llamada sys_write (escribir en stdout) y luego la llamada sys_exit (salir limpiamente). La sección .data almacena el mensaje en sí y calcula su longitud.

.global _start
.text

_start:
    // Escribir "Hola, Mundo!" en stdout
    mov x8, #64             // Número de llamada al sistema para write (sys_write)
    mov x0, #1              // Descriptor de archivo 1 (stdout)
    ldr x1, =msg            // Dirección del mensaje
    mov x2, #14             // Longitud del mensaje
    svc #0                  // Invocar llamada al sistema

    // Salir del programa
    mov x8, #93             // Número de llamada al sistema para exit (sys_exit)
    mov x0, #0              // Código de salida 0
    svc #0                  // Invocar llamada al sistema

.data
msg:
    .asciz "Hola, Mundo!\n"
as -o hola.o hola.s

% clang -o hola hola.o -nostdlib -e _start -Wl,-platform_version,macos,15.0,15.0 -arch arm64

% ./hola
zsh: llamada al sistema inválida  ./hola

Back 2025.02.22 Donate