# Program ucitava dimenziju kvadratne matrice, a zatim i clanove matrice.
# Ispisuje na izlaz uniformnu normu racunatu kao maksimalnu sumu apsolutnih
# vrednosti elemenata po vrsti, max_po_i(sum_po_j(abs(a[i][j]))).

.intel_syntax noprefix

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

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

.text
.global	main		# Definise se globalni simbol

main:

    enter   0, 0            # Prolog

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

    xor	    rbx, rbx        # U rbx cuvamo tekucu vrednost uniformne norme, osnosno
                            #   najvecu sumu elemenata po vrsti.

    mov	    eax, value      # Dimenzija matrice
    cmp	    eax, 0
    jle	    print           # Ako je dimenzija manja ili jednaka nuli, prelazimo na
                            #   ispis

    mov	    r12d, eax       # Cuvamo dimenziju matrice u pomocni registar, jer ce nam
                            #   trebati za inicijalizaciju brojaca u unutrasnjoj petlji
    mov	    ecx, eax        # Smestamo brojac u spoljasnjoj petlji u ecx

outer_loop:
    push	rcx             # Cuvamo ga na steku, posto nam je potreban ecx za un. petlju
    mov	    ecx, r12d       # Inicijalizujemo brojac u unutrasnjoj petlji

    xor	    r13d, r13d      # Tekuca suma apsolutnih vrednosti elemenata reda
                            #   postavlja na nulu

inner_loop:
    push	rcx             # Cuvamo brojac na steku zbog poziva scanf
    lea	    rdi, rdfmt
    lea 	rsi, value
    call    scanf           # Ucitavamo sledeci element
    pop	    rcx             # Vracamo brojac sa steka

    mov	    eax, value      # Racunamo apsolutnu vrednost broja
    cmp	    eax, 0
    jge	    skip_negation   # Ako je broj veci ili jednak nuli prelazimo na sabiranje
    neg	    eax             # Ako nije, komplementiramo ga u smislu potpunog komplementa

skip_negation:
    add 	r13d, eax       # Dodajemo apsolutnu vrednost broja na sumu
    loop	inner_loop      # Smanjuj se rcx za jedan, i prelazi na ucitavanje sledeceg
                            #   elementa ukoliko rcx nije nula
#inner_loop_end

    cmp	    ebx, r13d       # Ako smo ucitali celu vrstu, poredimo tekucu sumu sa 
                            #   tekucom normom
    jge	    continue        # Ako je tekuca norma veca ili jednaka nuli, idemo dalje
    mov	    ebx, r13d       # Ako nije, postavljamo tekucu sumu za tekucu normu

continue:
    pop 	rcx             # Vracamo brojac spoljne petlje
    loop	outer_loop      # Smanjuje se brojac spoljne petlje za jedan, i ako je 
                            #   veci od nule, prelazi se na ucitavanje sledeceg reda
#outer_loop_end

print:                      # Ispisuje se rezultat.
    lea	    rdi, wrfmt
    mov	    esi, ebx
    call    printf

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