default rel global _blur_asm global blur_asm ; Alias para no volverme loco con los registros %define src rdi %define dst rsi %define cont rdx %define size rcx %define sigma r8 %define radius r9 ; 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 .calc_size: ; Calculo el tamaño de la imagen en bytes mov rax, cont ; Cargo filas mul size ; Multiplico por las columnas mov rbx, PIXEL_SIZE ; Multiplico temporal mul rbx ; Multiplico por el tamaño del pixel mov size, rax ; Guardo el tamaño 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 movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......| .cuentas: ; Resto componente a componente de 4 pixeles de cada imagen .write: movdqu [dst], xmm0 ; Escribo en el destino .endLoop: ; TODO: Si el tamaño de la imagen no es multiplo de 4 acá va a sumar y hacer invalid read al llegar al final add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles add dst, PIXEL_SIZE * 4 add cont, PIXEL_SIZE * 4 jmp .loop .fin: pop rbp ret