diff_asm.asm 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. ; asmsyntax=nasm
  2. default rel
  3. global _diff_asm
  4. global diff_asm
  5. ; Alias para no volverme loco
  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. section .data
  14. section .text
  15. ;void diff_asm (
  16. ;unsigned char *src,
  17. ;unsigned char *src2,
  18. ;unsigned char *dst,
  19. ;int filas,
  20. ;int cols)
  21. _diff_asm:
  22. diff_asm:
  23. push rbp
  24. mov rbp, rsp
  25. .calc_size:
  26. mov r9, dst ; Muevo el destino un rato para hacer el calculo del tamaño de la imagen
  27. mov rax, cont ; Cargo filas
  28. mul size ; Multiplico por las columnas
  29. xor dst, dst ; Limpio temportal
  30. mov dst, PIXEL_SIZE ; Multiplico temporal
  31. mul dst ; Multiplico por el tamaño del pixel
  32. mov size, rax ; Guardo el tamaño
  33. mov dst, r9
  34. xor cont, cont ; Limpio el contador
  35. .loop:
  36. cmp cont, size ; Comparo tamaño con el contador
  37. jge .fin ; Si ya recorri la imagen voy al final
  38. pxor xmm1, xmm1
  39. movdqu xmm0, [src] ; Cargo la imagen 1
  40. movdqu xmm1, [src2] ; Cargo la imagen 2
  41. .cuentas:
  42. ; psubb xmm0, xmm1 ; Resto de xmm0 los pixeles de xmm1
  43. ; mpsadbw xmm0, xmm1, 0b00100100
  44. mpsadbw xmm0, xmm1, 36
  45. .write:
  46. movdqu [dst], xmm0 ; Escribo en el destino
  47. .endLoop:
  48. add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
  49. add src2, PIXEL_SIZE * 4
  50. add dst, PIXEL_SIZE * 4
  51. add cont, PIXEL_SIZE * 4
  52. jmp .loop
  53. .fin:
  54. pop rbp
  55. ret