c - MMX:淡入两幅图像结果

标签 c assembly x86 simd mmx

我试图淡化两个图像,但结果不是预期的(之前用 C 代码做过)。 这是 MMX 代码:

void fadeMMX(ImagenBMP *imagen1, ImagenBMP *imagen2, int f) {
double *puntero1;
double *puntero2;
int valor = (int)f*255;
for (int i=0; i <imagen1->tamanyo; i+=4) //De 4 en 4, ya que leemos 4 pixels cada vez
        {
            puntero1 = (double*) &imagen1->datos[i];
            puntero2 = (double*) &imagen2->datos[i];
            _asm{
                /*Guardar Imagenes*/
                /*Imagen A*/
                mov esi, puntero1[0]//imagen 1, leer
                mov edi, puntero1[0]//imagen 1, guardar
                movq mm1, [esi] //guardamos A (32 bits)
                punpcklbw mm2,mm1 //desempaquetamos A en mm2 
                /*Imagen B*/
                mov esi, puntero2[0]//imagen 2, leer
                movq mm3, [esi] //guardamos B (32 bits)
                punpcklbw mm4,mm3 //desempaquetamos B en mm4

                //Guardamos el valor
                movq mm0, valor     
                punpcklbw mm6,mm0 

                //Operaciones
                psubsw mm2,mm4  //restamos B a A y guardamos en A 
                pmulhw mm2, mm6 //multiplicamos A * F y guardamos en A, los bits mas significativos
                paddusw mm2, mm4 //sumamos lo que tenemos ahora en A mas lo que teniamos en B y guardamos en A

                /*Empaquetar*/
                packsswb mm5, mm2 //empaquetamos en mm5 - saturacion con signo
                movd [edi], mm5 //guardamos en memoria el nuevo valor
            }
} //end for
_asm
                {
                    emms //Finalizar utilización de registros MMX   
                }}; //end fadeMMX

Resulting image of fadeMMX with f = 100

Expected image

最佳答案

我刚刚找到了“答案”:我忘记添加这一行

mov edi, puntero2[0]//imagen 2, guardar

将第二个图像保存到指针中。

关于c - MMX:淡入两幅图像结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942179/

相关文章:

c - 为什么在从文件加载期间起始指针会发生变化?

CUDA C - 使用 Clock() 和 cudaEvent 的 CPU 和 GPU 执行时间,是否正确?

if-statement - 对 MIPS 中的 if 跳转感到困惑

string - 子字符串搜索程序总是返回 false

assembly - 在 x86 实模式汇编中编写中断处理程序

c - 为什么写入文件时字符会加倍 (uupp)?

gcc - 与 glibc 的静态链接,无需调用 main

linux - 使用 ASM 生成 shell

x86 - i9 处理器采用什么内存访问架构?

c - 使用 C 在终端中打印多字节字符