; Chamadas de sistema...
%define SYS_WRITE  1
%define SYS_OPEN   2
%define SYS_CLOSE  3
%define SYS_DUP2   33
%define SYS_EXIT   60

; Flags da chamada SYS_OPEN...
%define O_WRONLY   0x1     ; apenas para escrita
%define O_CREAT    0x40    ; cria se não existir
%define O_TRUNC    0x200   ; trunca conteúdo existente

; Permissões do arquivo criado...
%define F_MODE     0o644

; Descritores de arquivos...
%define STDOUT     1
	
section .rodata
	file db "mensagem.txt", 0         ; arquivo de destino
	msg  db "Salve, simpatia!", 10    ; Mensagem
	len  equ $ - msg                  ; Tamanho da mensagem

section .text
	global _start

_start:
	; open (ARQUIVO, FLAGS, MODO)
	mov rax, SYS_OPEN
	mov rdi, file
	mov rsi, O_WRONLY | O_CREAT | O_TRUNC
	mov rdx, F_MODE
	syscall

	mov r12, rax ; salvar descritor de arquivo retornado

	; dup2(ANTIGO_FD, NOVO_FD)
	mov rax, SYS_DUP2
	mov rdi, r12
	mov rsi, STDOUT
	syscall

	; write(FD, STRING, SIZE)
	mov rax, SYS_WRITE
	mov rdi, STDOUT
	mov rsi, msg
	mov rdx, len
	syscall

	; close(FD)
	mov rax, SYS_CLOSE
	mov rdi, r12
	syscall

	; exit(STATUS)
	mov rax, SYS_EXIT
	xor rdi, rdi
	syscall
