From b328a92f0e3c648bad7ef47a98f1db75e545789a Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Wed, 24 Jul 2024 22:39:59 -0400 Subject: initial commit --- hi.s | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 hi.s (limited to 'hi.s') diff --git a/hi.s b/hi.s new file mode 100644 index 0000000..90190cb --- /dev/null +++ b/hi.s @@ -0,0 +1,31 @@ +// hi.s: print "alonzo sucks!" to standard output and then exit. +// +// uses write() and exit() linux system calls directly to elide libc and +// assembles to a static, 384 byte arm64 binary. + +// entry point +// +// uses 32-bit registers (wN) instead of 64-bit registers (xN) to +// save a few bytes in the assembled binary +.text +.global _start +_start: + // write(stdout, msg, len) + mov w0, #1 // stdout fd (1) + ldr w1, =msg // message + mov w2, len // message length + mov w8, #64 // write() (64) + svc #0 // call write() + + // exit(0) + mov w0, #0 // exit code (0) + mov w8, #93 // exit() (93) + svc #0 // call exit() + +// message and message length +// +// technically the message belongs in the .rodata section, but sticking +// it here allows it to be packed after _start and the saves ~60 bytes +// in the assembled binary +msg: .ascii "alonzo sucks!\n" // message (14 bytes) +len = . - msg // message length -- cgit v1.2.3