blur_asm.asm 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. default rel
  2. global _blur_asm
  3. global blur_asm
  4. ; Alias para no volverme loco con los registros
  5. %define src rdi
  6. %define dst rsi
  7. %define cont rdx
  8. %define size rcx
  9. %define sigma r8
  10. %define radius r9
  11. ; Algunos defines ultiles
  12. %define PIXEL_SIZE 4
  13. ; Mascaras y esas cosas
  14. section .data
  15. section .text
  16. ;void blur_asm (
  17. ;unsigned char *src,
  18. ;unsigned char *dst,
  19. ;int filas,
  20. ;int cols,
  21. ;float sigma,
  22. ;int radius)
  23. _blur_asm:
  24. blur_asm:
  25. push rbp
  26. mov rbp, rsp ; Stack frame
  27. .calc_size: ; Calculo el tamaño de la imagen en bytes
  28. mov rax, cont ; Cargo filas
  29. mul size ; Multiplico por las columnas
  30. mov rbx, PIXEL_SIZE ; Multiplico temporal
  31. mul rbx ; Multiplico por el tamaño del pixel
  32. mov size, rax ; Guardo el tamaño
  33. xor cont, cont ; Limpio el contador
  34. .loop:
  35. cmp cont, size ; Comparo tamaño con el contador
  36. jge .fin ; Si ya recorri la imagen voy al final
  37. movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  38. .cuentas: ; Resto componente a componente de 4 pixeles de cada imagen
  39. .write:
  40. movdqu [dst], xmm0 ; Escribo en el destino
  41. .endLoop:
  42. ; 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
  43. add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
  44. add dst, PIXEL_SIZE * 4
  45. add cont, PIXEL_SIZE * 4
  46. jmp .loop
  47. .fin:
  48. pop rbp
  49. ret