Jump to content

Program name: Difference between revisions

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}}==
15

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.