aboutsummaryrefslogtreecommitdiff
path: root/hi.s
blob: 90190cb582ce93ed40303ce8abde910b2f9ce868 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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