| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- ; asmsyntax=nasm
- default rel
- global _diff_asm
- global diff_asm
- ; Alias para no volverme loco
- %define src rdi
- %define src2 rsi
- %define dst rdx
- %define cont rcx
- %define size r8
- ; Algunos defines ultiles
- %define PIXEL_SIZE 4
- section .data
- section .text
- ;void diff_asm (
- ;unsigned char *src,
- ;unsigned char *src2,
- ;unsigned char *dst,
- ;int filas,
- ;int cols)
- _diff_asm:
- diff_asm:
- push rbp
- mov rbp, rsp
- .calc_size:
- mov r9, dst ; Muevo el destino un rato para hacer el calculo del tamaño de la imagen
- mov rax, cont ; Cargo filas
- mul size ; Multiplico por las columnas
- xor dst, dst ; Limpio temportal
- mov dst, PIXEL_SIZE ; Multiplico temporal
- mul dst ; Multiplico por el tamaño del pixel
- mov size, rax ; Guardo el tamaño
- mov dst, r9
- 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
- pxor xmm1, xmm1
- movdqu xmm0, [src] ; Cargo la imagen 1
- movdqu xmm1, [src2] ; Cargo la imagen 2
- .cuentas:
- ; psubb xmm0, xmm1 ; Resto de xmm0 los pixeles de xmm1
- ; mpsadbw xmm0, xmm1, 0b00100100
- mpsadbw xmm0, xmm1, 36
- .write:
- movdqu [dst], xmm0 ; Escribo en el destino
- .endLoop:
- add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
- add src2, PIXEL_SIZE * 4
- add dst, PIXEL_SIZE * 4
- add cont, PIXEL_SIZE * 4
- jmp .loop
- .fin:
- pop rbp
- ret
|