; 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