%macro PRINT 1

    ; Save state
    push rax
    push rdi
    push rsi
    push rdx

    jmp %%astr ;salta para evitar de ler como codigo os dados abaixo

    ;section .rodata 
    %%str    db  %1, 10,0       ; arg0 + null terminator
    %%strln  equ $ - %%str   ; current position - string start 
    
    ;section .text
    ; Write
    ;_syscall_write %%str, 13 ;%%strln

    ; Restore state
    %%astr: _syscall_write %%str, %%strln
    pop rdx
    pop rsi
    pop rdi
    pop rax

%endmacro

%macro _syscall_write 2
    mov rax, 1
    mov rdi, 1
    mov rsi, %1  ; str
    mov rdx, %2  ; strln
    syscall
%endmacro



%macro _printf 2
  mov rax,1              ; escrita
  mov rdi,1              ; fd=1, na tela
  mov rsi,%1             ;buffer a ser gravado 
  mov rdx,%2             ;tamanho a ser gravado 
  syscall
%endmacro

%macro _exit 1
  mov rax,60
  mov rdi,%1
  syscall
%endmacro 

%macro _writeFile 3
 mov rax,1              ; escrita
 mov rdi,%1             ; descritor
 mov rsi,%2             ; buffer a ser gravado
 mov rdx,%3             ; tamanho a ser gravado
 syscall
%endmacro

%macro _readFile 3
  mov rax,0             ; leitura
  mov rdi,%1            ; descritor
  mov rsi,%2            ; buffer de leitura
  mov rdx,%3            ; tamanho maximo a ser lido
  syscall
%endmacro

%macro _closeFile 1
  mov rax,3             ; close
  mov rdi,%1            ; descritor
  syscall
%endmacro

%macro _open 2
  mov rax,2         ; open
  mov rdi,%1        ; str nomeArquivo
  mov rsi,%2        ;  modo de abertura, leitura
  syscall
  ;mov [%3],rax     ; caso queira passar para um descritor o fd

%endmacro

%macro _creat 2
  mov rax,2         ; open
  mov rdi,%1        ; str nomeArquivo 
  mov rsi,64        ; modo de criacao O_CREAT
  mov rdx,%2        ; permissao
  syscall
%endmacro

