CS301 – Fall 2003

Prof. Hartman

Homework #7

Due Wednesday, November 12th by 5:00 pm

 

The program below contains a commented out C function. Write an assembly routing that uses MMX instructions to quickly perform its equivalent. (The point of the function is to add the elements from arrays a and b together into array c. This kind of thing would be useful if the arrays are holding pixel data for two images that you want to combine. Unsigned char is used as the data type to represent unsigned bytes. You can test your program by making sure you get the same results with your assembly language function that you get if you uncomment the C function.) Turn in sample output and your listing file.

 

#include <stdio.h>

 

int asm_main( void );

 

void addemup(unsigned char a[], unsigned char b[], unsigned char c[], int n); //n will always be divisible by 8

 

/*

void addemup(unsigned char a[], unsigned char b[], unsigned char c[], int n) //n will always be divisible by 8

{

int ii;

for(ii=0;ii<n;++ii)

   {

   int sum;

   sum = a[ii] + b[ii];

   if(sum>255) sum=255;

   c[ii]=sum;

   }

}

*/

 

int main()

{

int ii;

unsigned char a[16]={0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};

unsigned char b[16]={0,0,2,2,0,0,2,2,0,0,2,2,0,0,2,2};

unsigned char c[16]={0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4};

unsigned char d[16]={0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8};

unsigned char e[16]={250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250};

unsigned char temp1[16],temp2[16];

 

addemup(a,b,temp1,16);

addemup(c,temp1,temp2,16);

addemup(d,temp2,temp1,16);

for(ii=0;ii<16;ii++) printf("%d ",temp1[ii]);

printf("\n");

addemup(e,temp1,temp2,16);

for(ii=0;ii<16;ii++) printf("%d ",temp2[ii]);

printf("\n");

}