## Program ucitava ime dva fajla, a zatim sadrzaj prvog fajla
## kopira u drugi fajl.

.intel_syntax noprefix

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

.bss
.lcomm buffer, 80	        # Bafer za razmenu poruka

.text

.global main

main:
    enter 0,0

                            ## Ucitavamo ime prvog fajla
    lea     rdi, rdfmt
    lea     rsi, buffer
    call    scanf

                            ## O_RDONLY - 0
                            ## O_WRONLY - 1
                            ## O_RDWR   - 2
                            ## O_CREAT  - 64
                            ## S_IRWXU  - 0700
                            ## ...

                            ## fd = open(filename, O_RDONLY)
    lea     rdi, buffer
    mov     rsi, 0
    call    open

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

                            ## Smestamo fajl deskriptor fd u r12
    mov     r12, rax

                            ## Ucitavamo ime drugog fajla
    lea     rdi, rdfmt
    lea     rsi, buffer
    call    scanf

                            ## S_IRWXU, su privilegije za fajl koji se potencijalno pravi
                            ## 0700 oznacava da user-u treba dati sve privilegije (Read,Write,eXecute)
                            ## a ostalima nikakve privilegije

                            ## fd1 = open(filename, O_WRONLY | O_CREAT, S_IRWXU)
    lea     rdi, buffer
    mov     rsi, 65
    mov     rdx, 448
    call    open

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

                            ## Smestamo fajl deskriptor fd1 u r13
    mov     r13, rax

loop:
                            ## Pozivamo  sistemski poziv read(0, buffer, 80)
    mov     rdi, r12
    lea     rsi, buffer
    mov     rdx, 80
    call    read

    cmp     rax, 0
    jl      error
    je      done

                            ## Pozivamo sistemski poziv write(1, buffer, rax)
    mov     rdi, r13
    lea     rsi, buffer
    mov     rdx, rax
    call    write
    jmp     loop

error:
                            ## Ispisujemo da je nastupila greska
    lea     rdi, wrfmt
    call    printf

done:
    leave
    ret
