.equ STDOUT, 1 .equ SVC_WRITE, 64 .equ SVC_EXIT, 93 .text .global _start _start: stp x29, x30, [sp, -16]! mov x29, sp ldr x0, [sp, 24] // argv[0] bl _strlen // strlen(argv[0]) mov x2, x0 mov x0, #STDOUT ldr x1, [sp, 24] bl _write // write(stdout, argv[0], strlen(argv[0])) ldp x29, x30, [sp], 16 mov x0, #0 b _exit // exit(0); // ssize_t _strlen(const char *str) _strlen: mov x1, x0 mov x0, #-1 1: add x0, x0, #1 ldrb w2, [x1, x0] cbnz x2, 1b ret .text //////////////// system call wrappers // ssize_t _write(int fd, void *buf, size_t count) _write: stp x29, x30, [sp, -16]! mov x8, #SVC_WRITE mov x29, sp svc #0 ldp x29, x30, [sp], 16 ret // void _exit(int retval) _exit: mov x8, #SVC_EXIT svc #0