65 lines
1.1 KiB
Plaintext
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
|