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)