## Ucitava se broj koji ce se traziti u nizu, a zatim dimenzija niza,
## kao i clanovi niza. Linearnom pretragom se proverava da li
## se trazeni broj nalazi u nizu. Ako se nalazi, ispisuje poruku "y",
## dok ukoliko dodje do kraja niza i nije naisao na broj, ispisuje "n".

.intel_syntax noprefix

.data
rdfmt:	.asciz  "%d"		# Ulazni format.
wrfmt:	.asciz	"%c\n"		# Izlazni format

.bss
.lcomm	value, 4		    # Lokacija za smestanje ucitanih podataka.

.text
.global main

main:
    ## Prolog funkcije.
    enter   0, 0

    ## Ucitava se element koji se trazi i smesta u registar rbx.
    lea     rdi, rdfmt
    lea 	rsi, value
    call    scanf
    mov	    rbx, value

    ## Ucitava se duzina polja i smesta u registar ecx, koji ce
    ## drzati broj preostalih elemenata. Pretpostavka je da ce
    ## duzina polja biti nenegativan broj.
    lea	    rdi, rdfmt
    lea	    rsi, value
    call    scanf
    mov	    ecx, value

    ## Proverava se da li je duzina polja veca od 0.
    jecxz   not_found

next_element:
    ## Ucitava se jedan po jedan element polja i poredi sa trazenim
    ## elementom. Broj elemenata koji je preostao da se ucita se u
    ## medjuvremenu cuva na steku zato sto scanf() funkcija unistava
    ## sadrzaj rcx registra. Ove vrednosti su mogle da se cuvaju i u 
    ## registrima r12, r13, posto po konvenciji njih scanf ne menja.
    push	rcx
    push	rbx
    lea	    rdi, rdfmt
    lea	    rsi, value
    call    scanf
    pop	    rbx
    pop	    rcx

    ## Poredi se trazeni element sa tekucim
    cmp	    ebx, value

    ## Ukoliko su razliciti, i smanjeni rcx nije nula, nastavlja se
    ## sa petljom
    loopne  next_element

    ## Iz petlje se izaslo iz dva moguca razloga: brojevi su jednaki ili
    ## smo dosli do kraja niza. Ukoliko brojevi nisu jednaki, to znaci
    ## da smo dosli do kraja niza
    jne     not_found

    ## Ukoliko jesu jednaki, pronadjen je broj
    mov	    rsi, 'y'
    jmp	    print

not_found:
    mov	    rsi, 'n'

print:
    ## Ispisuje se poruka.
    lea	rdi, wrfmt
    call printf

    xor	rax, rax
    leave
    ret
