## Za vektor v, program ispisuje uniformnu normu racunatu kao max_po_i(abs(v[i]))

.intel_syntax noprefix

.data
rdfmt:	.asciz	"%d"        # Format za citanje
wrfmt:	.asciz	"%d\n"      # Format za ispis

.bss
.lcomm	value, 4            # Alocira se mesto za promenljivu

.text
.global	main                # Definise se globalni simbol main

main:

    enter   0, 0            # Prolog

    lea	    rdi, rdfmt      # Ucitava se dimenzija vektora
    lea	    rsi, value
    call    scanf

    xor	    rbx, rbx        # U rbx ce biti tekuca vrednost uniformne norme

    mov	    eax, value      # Proverava se da li je dimenzija matrice
                            # veca od nule. 
                            # Tokom izvrsavanja ove instrukcije vrednost value 
                            #   upisujemo u registar eax
                            #   koji predstavlja niza 32 bita registra rax
                            #   ostalih 32 bita registra rax se popunjavaju u zavisnosti
                            #   od znaka vrednosti value
    cmp	    eax, 0
    jle	    print           # Ako je manja ili jednaka nuli, prelazi se na stampanje

    mov	    ecx, value      # Ako je veca od nule, inicijalizuje se brojac

next_element:
    mov	    r12d, ecx       # Cuvamo brojac u registru koji pripada pozivajucoj
                            #       funkciji, posto ga scanf unistava
    lea	    rdi, rdfmt
    lea 	rsi, value
    call    scanf           # Ucitavamo sledeci broj
    mov	    ecx, r12d       # Vracamo brojac u rcx

    mov	    eax, value      # Racunamo apsolutnu vrednost broja
    cmp	    eax, 0
    jge	    compare         # Ako je broj nenegativan, idemo na poredjenje
    neg	    eax             # Ako je negativan, komplementiramo ga

compare:
    cmp	    ebx, eax        # Poredimo tekucu normu sa tekucim elementom
    jge	    continue        # Ukoliko je tekuca norma veca ili jednaka nastavljamo dalje
    mov	    ebx, eax        # Ukoliko je manja, novi element postaje tekuca norma

continue:
    loop    next_element	# Smanjuje se vrednost u ecx za jedan i prelazi se na
                            #       ucitavanje sledeceg elementa ukoliko nije nula.
                            #       Ukoliko je nula, prelazi se na stampanje


print:		                # Stampa se tekuca norma.
    lea	    rdi, wrfmt
    mov	    esi, ebx
    call    printf

    xor	    rax, rax        # Inicijalizuje se povratna vrednost na nulu
    leave                   # Epilog
    ret
