|
|
@@ -1,7 +1,8 @@
|
|
|
-default rel
|
|
|
-global _blur_asm
|
|
|
+default rel global _blur_asm
|
|
|
global blur_asm
|
|
|
|
|
|
+extern convulcion_matriz
|
|
|
+
|
|
|
; Alias para no volverme loco con los registros
|
|
|
%define src rdi
|
|
|
%define dst rsi
|
|
|
@@ -9,6 +10,8 @@ global blur_asm
|
|
|
%define filas rcx
|
|
|
%define sigma xmm0
|
|
|
%define radius r8
|
|
|
+%define cont_c r9
|
|
|
+%define matriz r10
|
|
|
|
|
|
; Algunos defines ultiles
|
|
|
%define PIXEL_SIZE 4
|
|
|
@@ -31,70 +34,57 @@ blur_asm:
|
|
|
mov rbp, rsp ; Stack frame
|
|
|
push r9
|
|
|
push r10
|
|
|
- push r11
|
|
|
|
|
|
.init:
|
|
|
mov r9, rdx ;salvo rdx por los mul
|
|
|
mov rax, PIXEL_SIZE
|
|
|
mul cols
|
|
|
mul radius
|
|
|
- ;rax ahora es cols*pix_size*radius
|
|
|
- add src, rax ; Avanzo el radius filas (col*pix_size)
|
|
|
- add dst, rax ; idem
|
|
|
-
|
|
|
- mov rax, PIXEL_SIZE
|
|
|
- mul radius ;rax ahora es radius pixeles
|
|
|
+ ; rax:=cols*pix_size*radius => cuantas filas debo saltear
|
|
|
+ add src, rax ; Avanzo "radius" filas (col*pix_size*radius)
|
|
|
+ add dst, rax
|
|
|
|
|
|
- add src, rax ;avanzo radius pixeles (borde)
|
|
|
- add dst, rax ;idem
|
|
|
-
|
|
|
- mov cols, r9 ;recupero cols por el mul
|
|
|
sub filas, radius ;acomodo filas para ignorar los bordes
|
|
|
sub filas, radius ;acomodo filas para ignorar los bordes
|
|
|
|
|
|
- sub cols, rax ;acomodo cols para ignorar los bordes
|
|
|
+ mov cols, r9 ;recupero cols por el mul
|
|
|
+ sub cols, radius ;resto radius columnas
|
|
|
+ sub cols, radius ;resto radius columnas
|
|
|
|
|
|
- mov rax,PIXEL_SIZE
|
|
|
+ mov rax, PIXEL_SIZE
|
|
|
mul cols
|
|
|
mov cols, rax ;cols:=cols*pix_size
|
|
|
- xor r9,r9
|
|
|
- xor r10,r10
|
|
|
+
|
|
|
+.iniciarFila:
|
|
|
+ lea src, [src+PIXEL_SIZE*radius] ;avanzo radius pixeles (borde)
|
|
|
+ lea dst, [dst+PIXEL_SIZE*radius] ;avanzo radius pixeles (borde)
|
|
|
+ xor cont_c,cont_c
|
|
|
+
|
|
|
.loop:
|
|
|
- cmp cols, r9 ; Comparo tamaño con el contador
|
|
|
- jl .finFila ; Si ya recorri la imagen voy al final
|
|
|
+ cmp cols, cont_c ; Comparo tamaño con el contador
|
|
|
+ je .finFila ; Si ya recorri la imagen voy al final
|
|
|
;movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
|
|
|
pxor xmm0,xmm0
|
|
|
|
|
|
.write:
|
|
|
- movdqu [dst], xmm0 ; Escribo en el destino
|
|
|
+ movd [dst], xmm0 ; Escribo en el destino
|
|
|
.endLoop:
|
|
|
- add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
|
|
|
- add dst, PIXEL_SIZE * 4
|
|
|
- add r9, PIXEL_SIZE * 4
|
|
|
+ add src, PIXEL_SIZE ; Incremento 4 pixeles
|
|
|
+ add dst, PIXEL_SIZE
|
|
|
+ add cont_c, PIXEL_SIZE
|
|
|
jmp .loop
|
|
|
|
|
|
.finFila:
|
|
|
- inc r10
|
|
|
- cmp r10,filas
|
|
|
- jge .fin
|
|
|
-
|
|
|
- xor r9,r9
|
|
|
-
|
|
|
- mov r11, rdx ;salvo rdx
|
|
|
- mov rax, PIXEL_SIZE
|
|
|
- mul radius ;rax ahora es radius pixeles
|
|
|
-
|
|
|
- add src, rax ;agrego radius a la columna inicial
|
|
|
- add src, rax ;agrego radius a la columna inicial
|
|
|
- add dst, rax
|
|
|
- add dst, rax
|
|
|
+ dec filas
|
|
|
+ cmp filas, qword 0
|
|
|
+ je .fin
|
|
|
|
|
|
- mov rdx, r11 ;recupero rdx
|
|
|
+ lea src, [src+PIXEL_SIZE*radius] ;agrego radius a la columna (termino la fila)
|
|
|
+ lea dst, [dst+PIXEL_SIZE*radius]
|
|
|
|
|
|
- jmp .loop
|
|
|
+ jmp .iniciarFila
|
|
|
|
|
|
.fin:
|
|
|
- pop r11
|
|
|
pop r10
|
|
|
pop r9
|
|
|
pop rbp
|