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 %define cols rdx %define filas rcx %define sigma xmm0 %define radius r8 %define cont_c r9 %define matriz r10 ; Algunos defines ultiles %define PIXEL_SIZE 4 ; Mascaras y esas cosas section .data section .text ;void blur_asm ( ;unsigned char *src, ;unsigned char *dst, ;int filas, ;int cols, ;float sigma, ;int radius) _blur_asm: blur_asm: push rbp mov rbp, rsp ; Stack frame push r9 push r10 .init: mov r9, rdx ;salvo rdx por los mul mov rax, PIXEL_SIZE mul cols mul radius ; rax:=cols*pix_size*radius => cuantas filas debo saltear add src, rax ; Avanzo "radius" filas (col*pix_size*radius) add dst, rax sub filas, radius ;acomodo filas para ignorar los bordes sub filas, radius ;acomodo filas 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 mul cols mov cols, rax ;cols:=cols*pix_size .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, 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: movd [dst], xmm0 ; Escribo en el destino .endLoop: add src, PIXEL_SIZE ; Incremento 4 pixeles add dst, PIXEL_SIZE add cont_c, PIXEL_SIZE jmp .loop .finFila: dec filas cmp filas, qword 0 je .fin lea src, [src+PIXEL_SIZE*radius] ;agrego radius a la columna (termino la fila) lea dst, [dst+PIXEL_SIZE*radius] jmp .iniciarFila .fin: pop r10 pop r9 pop rbp ret