Parcourir la source

Falta hacer el calculo del diff, usar instruccion MPSADBW(p667).

Fabian il y a 11 ans
Parent
commit
e90c481d7f
1 fichiers modifiés avec 48 ajouts et 1 suppressions
  1. 48 1
      filtros/diff_asm.asm

+ 48 - 1
filtros/diff_asm.asm

@@ -1,10 +1,20 @@
+; asmsyntax=nasm
+
 default rel
 global _diff_asm
 global diff_asm
 
+; Alias para no volverme loco
+%define src rdi
+%define src2 rsi
+%define dst rdx
+%define cont rcx
+%define size r8
 
-section .data
+; Algunos defines ultiles
+%define PIXEL_SIZE	4
 
+section .data
 
 
 section .text
@@ -17,6 +27,43 @@ section .text
 
 _diff_asm:
 diff_asm:
+    push rbp
+    mov rbp, rsp
+
+.calc_size:
+    mov r9, dst		; Muevo el destino un rato para hacer el calculo del tamaño de la imagen
+    mov rax, cont	; Cargo filas
+    mul size		; Multiplico por las columnas
+    xor dst, dst	; Limpio temportal
+    mov dst, PIXEL_SIZE	; Multiplico temporal
+    mul dst		; Multiplico por el tamaño del pixel
+    mov size, rax	; Guardo el tamaño
+    mov dst, r9
+
+    xor cont, cont	; Limpio el contador
+
+.loop:
+    cmp cont, size	; Comparo tamaño con el contador
+    jge .fin		; Si ya recorri la imagen voy al final
+    pxor xmm1, xmm1
+    movdqu xmm0, [src]	; Cargo la imagen 1
+    movdqu xmm1, [src2]	; Cargo la imagen 2
+
+.cuentas:
+;    psubb xmm0, xmm1	; Resto de xmm0 los pixeles de xmm1
+;    mpsadbw xmm0, xmm1, 0b00100100
+    mpsadbw xmm0, xmm1, 36
+
+.write:
+    movdqu [dst], xmm0	; Escribo en el destino
 
+.endLoop:
+    add src, PIXEL_SIZE	* 4	; Incremento 4 pixeles
+    add src2, PIXEL_SIZE * 4
+    add dst, PIXEL_SIZE * 4
+    add cont, PIXEL_SIZE * 4
+    jmp .loop
 
+.fin:
+    pop rbp
     ret