Page 148 - ARM 64 Bit Assembly Language
P. 148

134 Chapter 5



                             Listing 5.26 A function call using the stack in AArch64 assembly.

                1         .section .rodata
                2  format: .asciz  "Results: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n"
                3         // give variable i a label, and let j, k, l, m, n, o, p,
                4         // q, and r follow it.
                5  i:     .word   -1, 2, -3, 4, -5, 6, -7, 8, -9, 10
                6
                7         .text
                8         .type   main, %function
                9         .global main
                10  main:  stp    x29, x30, [sp, #-32]!  // push FP & LR
                11        str     x19, [sp, #16]         // save x19
                12        adr     x19, i                 // x19 = &i
                13
                14        // load the eight register parameters
                15        adr     x0, format          // x0 = &format
                16        ldr     w1, [x19, #(4*0)]      // w1 = i
                17        ldr     w2, [x19, #(4*1)]      // w2 = j
                18        ldr     w3, [x19, #(4*2)]      // w3 = k
                19        ldr     w4, [x19, #(4*3)]      // w4 = l
                20        ldr     w5, [x19, #(4*4)]      // w5 = m
                21        ldr     w6, [x19, #(4*5)]      // w6 = n
                22        ldr     w7, [x19, #(4*6)]      // w7 = o
                23
                24        // marshal params on stack in reverse order - p at bottom
                25        ldr     w9, [x19, #(4*7)]      // w9 = p
                26        ldr     w10, [x19, #(4*8)]     // w10 = q
                27        ldr     w11, [x19, #(4*9)]     // w11 = r
                28        add     sp, sp, #-32
                29        str     w11, [sp, #16]         // 8 bytes per parameter
                30        str     w10, [sp, #8]
                31        str     w9, [sp]
                32
                33        // call printf
                34        bl      printf
                35
                36        // pop p, q, and r from the stack
                37        add     sp, sp, #32
                38
                39        //      return 0
                40        mov     w0, #0
                41        ldr     x19, [sp, #16]    // restore x19
                42        ldp     x29, x30, [sp], #32    // pop FP & LR
                43        ret
                44        .size   main, (. - main)
   143   144   145   146   147   148   149   150   151   152   153