Program name: Difference between revisions
→{{header|AArch64 Assembly}}
m (Add AArch64 assembly header) |
|||
Line 9:
=={{header|AArch64 Assembly}}==
{{works with|aarch64-linux-gnu-as/qemu-aarch64}}
Without built-in CRT, <code>argc</code> and <code>argv</code> are stored in the stack. The format looks like:
<lang>sp+0 = argc
sp+8 = argv[0]
sp+16 = argv[1] ...</lang>
Each item of <code>argv</code> is a pointer to a null-terminated 8-bit string.
<lang ARM_Assembly>.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</lang>
=={{header|Ada}}==
|