Ensamblaje en macOS: Hola Mundo
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