/*
 * File: stack.s
 * Description: This program illustrates passing arguments in registers
 * and on the stack.
 */
        .arch   armv8-a

        .global main
        .text
        .align 2
main:                                   // The main function
        stp     fp, lr, [sp,-16]!
        mov     fp, sp
        sub     sp, sp, #32

        adr     x0, fmt                 // Arg 0 (Integer 1)
        mov     x1, #1                  // Arg 1 (Integer 2)
        mov     x2, #2                  // Arg 2 (Integer 3)
        mov     x3, #3                  // Arg 3 (Integer 4)
        mov     x4, #4                  // Arg 4 (Integer 5)
        fmov    d0, #-5                 // Arg 5 (Double  1)
        mov     x5, #6                  // Arg 6 (Integer 6)
        mov     x6, #7                  // Arg 7 (Integer 7)
        fmov    d1, #8                  // Arg 8 (Double 2)
        mov     x7, #9                  // Arg 9 (Integer 8)
        fmov    d2, #10                 // Arg 10 (Double 3)
        mov     x10, #11                // Arg 11 (Integer 9)
        str     x10, [sp]
        fmov    d3, #12                 // Arg 12 (Double 4)
        fmov    d4, #13                 // Arg 13 (Double 5)
        fmov    d5, #14                 // Arg 14 (Double 6)
        fmov    d6, #15                 // Arg 15 (Double 7)
        fmov    d7, #16                 // Arg 16 (Double 8)
        fmov    d10, #17                // Arg 17 (Double 9)
        str     d10, [sp, 8]
        mov     x10, #8                 // Arg 18 (Double 10)
        str     x10, [sp, 16]
        bl      printf
        add     sp, sp, #32
        
        mov     x0, #0                  // Return from main
        ldp     fp, lr, [sp], 16
        ret

        .section .rodata
        
fmt:    .ascii  "a1: %ld\n"
        .ascii  "a2: %ld\n"
        .ascii  "a3: %ld\n"
        .ascii  "a4: %ld\n"
        .ascii  "a5: %2.1f\n"
        .ascii  "a6: %ld\n"
        .ascii  "a7: %ld\n"
        .ascii  "a8: %2.1f\n"
        .ascii  "a9: %ld\n"
        .ascii  "a10: %2.1f\n"
        .ascii  "a11: %ld\n"
        .ascii  "a12 %2.1f\n"
        .ascii  "a13: %2.1f\n"
        .ascii  "a14: %2.1f\n"
        .ascii  "a15: %2.1f\n"
        .ascii  "a16: %2.1f\n"
        .ascii  "a17: %2.1f\n"
        .string  "a18: %ld\n"
