## Program u main funkciji poziva funkciju sum koja 
## vraca sumu niza elemenata, a zatim ispisuje sumu
## na izlaz.


# Notes:
    # po konvenciji smestamo argumente funkcija u narednom redosledu:
        # rdi, rsi, rdx, rcx, r8, r9

    # u 31. liniji koda koristimo esi umesto rsi zato sto je .int velicine 4 bajta
    # tako da zelimo da upisemo tu vrednost u 4 manja bajta registra rsi
    # njima mozemo pristupiti pomocu esi

    # rax sluzi za povratnu vrednost
    # rcx sluzi kao brojac u petljama.


.intel_syntax noprefix


.data                           # Pocetak sekcije sa inicijalizovanim podacima.

fmt:    .asciz "%d\n"           # format string funkcije printf().
array:  .int 12,4,54,1,2,4,6,7  # niz celih brojeva.
n:      .int 8                  # dimenzija niza "array"

.text                           # Pocetak sekcije sa kodom. 

.global main                    # Definicija globalnih simbola

########################
## int main()
########################
main:
        enter 0,0

        # Pozivanje funkcije sum(array,n); Prvi argument se
        # smesta u rdi, drugi argument se smesta u esi.
        # Povratna vrednost se ocekuje u eax.
        lea     rdi, array
        mov     esi, n
        call    sum             # sum(array, n)

        lea     rdi, fmt        
        mov     esi, eax
        call    printf          # printf("%d\n", eax)

        xor     rax, rax        
        leave
        ret                     # return 0


############################
## int sum(int *a, int n) ##
##      rdi -- int *a
##      esi -- int n
############################

sum:
        enter   0, 0

        xor     eax, eax            # i = 0
        xor     ecx, ecx            # sum = 0

sum_loop_begin:                     # while (i != n)
        cmp     ecx, esi
        je      sum_loop_end

        add     eax, [rdi + 4*rcx]  # res += array[i]

        inc     ecx                 # i++
        jmp     sum_loop_begin
sum_loop_end:

        leave
        ret                         # return res

