## Program implementira primitivan echo servis. 
## Ucitava liniju sa ulaza i stampa na izlaz. 

## Detaljne opise sistemskih poziva mozete naci u 
## 2. sekciji man strana, primeri pristupanja:
## > man 2 function_name
## > man 2 read
## > man 2 write

## Read ukratko:
##     1. arg: prosledjujemo mu File Descriptor(fd) fajla iz kojeg citamo
##     2. arg: buffer u koji zelimo da upisemo bajtove
##     3. arg: broj bajtova koji zelimo maksimalno da unesemo
##     povratna vrednost: br uspesno ucitanih bajtova ili -1 u slucaju greske

## Write ukratko:
##     1. arg: prosledjujemo mu File Descriptor(fd) fajla u koji upisujemo
##     2. arg: buffer iz kojeg zelimo da upisemo bajtove
##     3. arg: broj bajtova koji zelimo maksimalno da unesemo
##     povratna vrednost: br uspesno upisanih bajtova ili -1 u slucaju greske

# Fajl deskriptor je int vrednost koja predstavlja 
#   indentifikator nekog fajla
# stdin   -- 0
# stdout  -- 1
# stderr  -- 2
    

.intel_syntax noprefix

.bss
.lcomm buffer, 80

.text

.global main


main:
    enter   0,0

loop:
                        ## Pozivamo read(0, buffer, 80) sistemski poziv
                        ##  prvi argument - 0 predstavlja stdin, 
    mov     rdi, 0
    lea     rsi, buffer
    mov     rdx, 80
    call    read

                        ## Ako je povratna vrednost manja od nule, nastupila
                        ## je greska
    cmp     rax, 0
    jl      error
    je      done

                        ## Pozivamo write(1, buffer, rax) sistemski poziv
                        ##  prvi argument - 1 predstavlja stdout, 
    mov     rdi, 1
    lea     rsi, buffer
    mov     rdx, rax
    call    write
    jmp     loop

error:
    mov     rax, -1

done:
    leave
    ret

