aboutsummaryrefslogtreecommitdiff
path: root/hi.s
diff options
context:
space:
mode:
Diffstat (limited to 'hi.s')
-rw-r--r--hi.s31
1 files changed, 31 insertions, 0 deletions
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