2015-11-26 2 views
0

Я пытался выцветать два изображения, и результаты не были ожидаемыми (раньше это было с кодом C). Вот код MMX: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

+1

Любая конкретная причина, по которой вы решили использовать MMX и сборку для этого? Реализация SSE, использующая встроенные функции, была бы намного проще кодировать и, вероятно, обеспечивала бы 2x быструю работу. –

+0

Это практика школьного проекта, следующее упражнение - это сделать это с помощью SSE, не могли бы вы дать мне какие-либо советы? @PaulR – danibeam

+1

Для реализации SSE я бы определенно рекомендовал использовать встроенные средства, а не сырую сборку. Помимо этого он, вероятно, будет довольно похож на ваш подход MMX, ожидайте, что вы будете обрабатывать в два раза больше пикселей на итерацию цикла. Посмотрите на некоторые вопросы и ответы в теге [tag: sse] здесь, на StackOverflow, для полезных идей. –

ответ

1

Я только что нашел ответ '': Я забыл добавить эту строку

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

Чтобы сохранить второе изображение в указатель.

Смежные вопросы