diff_asm.asm 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. ; asmsyntax=nasm
  2. default rel
  3. global _diff_asm
  4. global diff_asm
  5. ; Alias para no volverme loco con los registros
  6. %define src rdi
  7. %define src2 rsi
  8. %define dst rdx
  9. %define cont rcx
  10. %define size r8
  11. ; Algunos defines ultiles
  12. %define PIXEL_SIZE 4
  13. ; Mascaras y esas cosas
  14. section .data
  15. BLUE_MASK: db 0,0,0,255,4,4,4,255,8,8,8,255,12,12,12,255 ; TODO: Ver que hacer con el alpha
  16. ;TODO: Si el alpha viene en 255 entonces puedo poner el mismo byte que vino!!!!
  17. GREEN_MASK: db 1,1,1,255,5,5,5,255,9,9,9,255,13,13,13,255
  18. RED_MASK: db 2,2,2,255,6,6,6,255,10,10,10,255,14,14,14,255
  19. section .text
  20. ;void diff_asm (
  21. ;unsigned char *src, unsigned char *src2, unsigned char *dst, int filas, int cols)
  22. _diff_asm:
  23. diff_asm:
  24. push rbp
  25. mov rbp, rsp ; Stack frame
  26. .calc_size: ; Calculo el tamaño de la imagen en bytes
  27. mov r9, dst ; Muevo el destino un rato para hacer el calculo del tamaño de la imagen
  28. mov rax, cont ; Cargo filas
  29. mul size ; Multiplico por las columnas
  30. xor dst, dst ; Limpio temportal
  31. mov dst, PIXEL_SIZE ; Multiplico temporal
  32. mul dst ; Multiplico por el tamaño del pixel
  33. mov size, rax ; Guardo el tamaño
  34. mov dst, r9
  35. xor cont, cont ; Limpio el contador
  36. ; movdqu xmm3, [DIVIDIR] ; Cargo el valor para las divisiones para el promedio
  37. .loop:
  38. cmp cont, size ; Comparo tamaño con el contador
  39. jge .fin ; Si ya recorri la imagen voy al final
  40. pxor xmm1, xmm1
  41. movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  42. movdqu xmm1, [src2] ; Cargo la imagen 2 => xmm1 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  43. .cuentas: ; Resto componente a componente de 4 pixeles de cada imagen
  44. psubb xmm1, xmm0 ; xmm1 = |B(img1_P1) - R(img2_P1)|G(Img1_P1) - Img2_P2|....|
  45. pabsb xmm0, xmm1 ; Almaceno en xmm0 el valor absoluto de la resta anterior
  46. .max:
  47. ; TODO: Mover afuera del ciclo
  48. movdqu xmm15, [BLUE_MASK]
  49. movdqu xmm14, [GREEN_MASK]
  50. movdqu xmm13, [RED_MASK]
  51. movdqu xmm2, xmm0
  52. movdqu xmm3, xmm0
  53. pshufb xmm0, xmm15 ; Pongo en la misma posición cada elemento maximo
  54. pshufb xmm2, xmm14
  55. pshufb xmm3, xmm13
  56. pmaxub xmm2, xmm3
  57. pmaxub xmm0, xmm2
  58. .write:
  59. movdqu [dst], xmm0 ; Escribo en el destino
  60. .endLoop:
  61. add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
  62. add src2, PIXEL_SIZE * 4
  63. add dst, PIXEL_SIZE * 4
  64. add cont, PIXEL_SIZE * 4
  65. jmp .loop
  66. .fin:
  67. pop rbp
  68. ret