| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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
|