RosettaCodeData/Task/Integer-comparison/AArch64-Assembly/integer-comparison.aarch64

65 lines
1.1 KiB
Plaintext

.equ STDOUT, 1
.equ SVC_WRITE, 64
.equ SVC_EXIT, 93
.text
.global _start
_start:
stp x29, x30, [sp, -16]!
mov x0, #123
mov x1, #456
mov x29, sp
bl integer_compare // integer_compare(123, 456);
mov x0, #-123
mov x1, #-456
bl integer_compare // integer_compare(-123, -456);
mov x0, #123
mov x1, #123
bl integer_compare // integer_compare(123, 123);
ldp x29, x30, [sp], 16
mov x0, #0
b _exit // exit(0);
// void integer_compare(long long x, long long y) - compare two signed integers and print a message
integer_compare:
cmp x0, x1
mov x0, #STDOUT
b.eq 1f
b.gt 2f
// x < y
ldr x1, =msg_lt
mov x2, #17
b _write
1: // x == y
ldr x1, =msg_eq
mov x2, #16
b _write
2: // x > y
ldr x1, =msg_gt
mov x2, #20
b _write
msg_lt:
.ascii "x is less than y\n"
msg_eq:
.ascii "x is equal to y\n"
msg_gt:
.ascii "x is greater than y\n"
.align 4
//////////////// 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