45 lines
727 B
Plaintext
45 lines
727 B
Plaintext
.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
|