;compilar: nasm -f elf64 -l flutuanteExample.lst  flutuanteExample.asm
;linkar  : gcc -m64 -no-pie -o flutuanteExample  flutuanteExample.o

global main
extern printf
extern exit

section .data
    ;word: 2bytes (16 bits) dword : 4bytes (float, 32 bits) quadword: 8 bytes (double, 64 bits)
 
	v1  dd 1.1, 2.2, 3.3, 4.4 ; primeiro conjunto de 4 celulas
    v2  dd 5.5, 6.6, 7.7, 8.8
    msgResultado db "Resultado: [%.2f, %.2f, %.2f, %.2f]", 10,10,0
    

section .bss
	v3  resd 4 ; resultado

section .text
	main:
	push rbp

    ;xmm tem 128 bits, 2 quadwords ou 2 doubles
	movups xmm0, [v1] ; carrega v1 em xmm0. xmm0 possui quatro células do tipo qword
	     

    movups xmm1, [v2]

	addps xmm0, xmm1  ; adiciona os 4 numeros de xmm1 aos 4 numeros de xmm0
	
	mulps xmm0,xmm1
	subps xmm0,xmm1

	movups [v3], xmm0 ;   celula  | 30,8 | 51,48 | 77 | 107,36| 
                      ;   indice      0    1*4    2*4    3*4
	mov rdi, msgResultado   ;rdi, rsi, rdx, rcx, r8, r9
    ;mov esi, dword [v3] 
	cvtss2sd xmm0,dword [v3]   ;converte um valor float (dword) para double (qword), em C v3[0]
    cvtss2sd xmm1,dword [v3+4] ;converte float (dword) para double (qword), em C v3[1]                                                     
    cvtss2sd xmm2,dword [v3+8] ;converte um valor float (dword) para double (qword), em C v3[2]                                         
    cvtss2sd xmm3,dword [v3+12];converte um valor float (dword) para double (qword), em C v3[3]                                          
    ;shufps xmm0,xmm0,0xC6
    mov rax,4                  ;informa ao printf que usarei 4 registradores xmmm
    call printf
	pop rbp
	mov rdi,0
	call exit

