基于SDL的四则运算即C语言和汇编语言的混编实验设计总结

   最近一周在忙于课程设计,要实现的效果的C语言和汇编语言混编实现加减乘除的四则运算

先看看效果图:



需要的准备有

libSDL-1.2.so.0.11.3  、libSDL-1.2.so.0、libSDL.so、---------------〉   SDL的一些链接库

libSDL_gfx.so、libSDL_gfx.so.13、libSDL_gfx.so.13.9.0、libSDL_gfx.so.13.9.1、  ----------〉SDL_gfx 的一些链接库

libSDL_image-1.2.so.0、libSDL_image-1.2.so.0.8.0、libSDL_image.so、     ---------------〉   SDL_image的一些链接库

libts-0.0.so.0、libts-0.0.so.0.1.1、libts.so、    ---------------〉   触摸屏的一些链接库

bg.bmp 

up-6410开发板上触屏下代码如下:

#include<stdlib.h>
#include "SDL/SDL.h"
#include<stdio.h>
#include"ts.h"
#include <time.h> 


SDL_Surface * screen;
SDL_Surface * image;
XTsEvent event;


int i,m,n, j,k;
char num1[10];
char num2[10];
char result[10];
char subresult[10];
char mulresult[10];
char divresult[10];
char quyuresult[10];
int drawsreen();
int init_SDL();
int srandtest();
int event_test();
int event_linster();
extern int add(int a,int b);
extern int sub(int a,int b);
extern int mul(int a,int b);


static void sig(int argv) {
	exit(0);


}
int main(){


init_SDL();
drawsreen();
event_test();


}


int init_SDL(){




//初始化SDL 
	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
		fprintf(stderr, "init SDL %s\n", SDL_GetError());
		return -1;
	}
 


TsInit();
signal(SIGINT, sig);
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
	if (screen == NULL) {
		fprintf(stderr, "屏幕初始化失败 640x480x8 video mode %s\n",SDL_GetError());
		return -1;
	}
 SDL_WM_SetCaption("加减乘除四则运算", NULL);


}




 int drawsreen(){




	image = SDL_LoadBMP("./bg.bmp");


	if (image == NULL) {
		fprintf(stderr, "图片加载失败, %s\n", SDL_GetError());
		return -1;
		     if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) {
		fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());
		return -1;
	}


	
 		boxColor(screen, 0, 0,80, 50,0xff8f66);
		boxColor(screen, 100, 0,180, 50,0xff8f66);
		boxColor(screen, 200, 0,280, 50,0xff8f66);


          
		//clear quit 
		boxColor(screen, 400, 70,480, 120,0xff8f66);
 		boxColor(screen, 500, 70,580, 120,0xff8f66);
		//srand %
		boxColor(screen, 400, 140,480, 190,0xff8f66);
		boxColor(screen, 500, 140,580, 190,0xff8f66);
   		// * /
		boxColor(screen, 400, 210,480, 260,0xff8f66);
		boxColor(screen, 500, 210,580, 260,0xff8f66);
		//+  --
	     boxColor(screen, 400, 280,480, 330,0xff8f66);
 		boxColor(screen, 500, 280,580, 330,0xff8f66);


          stringColor(screen, 420, 305,"+",0xFFFFFFFF);
		stringColor(screen, 520, 305,"-",0xFFFFFFFF);
		stringColor(screen, 420, 235,"*",0xFFFFFFFF);
		stringColor(screen, 520, 235,"/",0xFFFFFFFF);
		stringColor(screen, 420, 95,"clear",0xFFFFFFFF);
		stringColor(screen, 520, 95,"Quit",0xFFFFFFFF);
		stringColor(screen, 420, 165, "srand", 0xFFFFFFFF);
		stringColor(screen, 520, 165, "%", 0xFFFFFFFF);
		SDL_UpdateRect(screen, 0, 0, 0, 0);


}


int srandtest(){


srand((int)time(0));


j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
k=1+(int)(10.0*rand()/(RAND_MAX+1.0));


sprintf(num1,"%x",j);
sprintf(num2,"%x",k);
sprintf(result,"%x",add(j,k)%16);
sprintf(subresult,"%x",sub(j,k)%16);
sprintf(mulresult,"%x",mul(j,k));
sprintf(divresult,"%x",j/k);
sprintf(quyuresult,"%x",j%k);


}




int event_test(){




while ( 1 ) {


		TsEvent(&event);
        switch (event.type) {
                    
            case TSDOWN: 
		event_linster();
		SDL_UpdateRect(screen, 0, 0, 0, 0);
                  break;
		case TSUP:
			event_linster();
			SDL_UpdateRect(screen, 0, 0, 0, 0);
			break;


            case SDL_QUIT: {


                printf("Quit requested, quitting.\n");
                exit(0);
            }
            break;
        }
    }


}


int event_linster(){










	
        if ((event.x<=580&&event.x>=500)&&(event.y>=280 && event.y<=330)){
//减法运算 
			drawsreen();
			srandtest();			
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"-", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,subresult, 0xFFFFFFFF);
		if(j<k){


				stringColor(screen, 90, 70,"Divide Overflow", 0xFFFFFFFF);
			}
			SDL_UpdateRect(screen, 0, 0,0,0);


		}else if((event.x<=480&&event.x>=400)&&(event.y>=280 && event.y<=330)){
//加法运算 
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"+", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,result, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.x<=480&&event.x>=400)&&(event.y>=70 && event.y<=120)){
//清屏 
drawsreen();




}else if((event.x<=580&&event.x>=500)&&(event.y>=70 && event.y<=120)){
			
//退出
			exit(0);








}else if((event.x<=480&&event.x>=400)&&(event.y>=140 && event.y<=190)){
//产生随机数 
			drawsreen();
			srandtest();			
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);


			
}else if((event.x<=480&&event.x>=400)&&(event.y>=210 && event.y<=260)){
// 乘法运算 
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"*", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,mulresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.x<=580&&event.x>=500)&&(event.y>=210 && event.y<=260)){
// 除法运算 
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"/", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,divresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.x<=580&&event.x>=500)&&(event.y>=140 && event.y<=190)){
//取余运算 
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"%", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,quyuresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}


             


}
2,汇编语句的代码如下:

add.s

.section .text
.global add
add:
	add r0,r0,r1
	mov pc,lr

sub.s

.section .text
.global sub
sub:
	sub r0,r0,r1
	mov pc,lr

mul.s

.section .text
.global mul
mul:
	add r0,r0,r1
	mov pc,lr

2.pc下纯C语言和SDL的代码如下

#include<stdlib.h>
#include "SDL/SDL.h"
#include<stdio.h>
#include <time.h>

SDL_Surface * screen;
SDL_Surface * image;
SDL_Event event;

int i,m,n, j,k;
char num1[10];
char num2[10];
char result[10];
char subresult[10];
char mulresult[10];
char divresult[10];
char quyuresult[10];
int drawsreen();
int init_SDL();
int srandtest();
int event_test();
int main(){

init_SDL();
drawsreen();
event_test();

}

int init_SDL(){


//初始化SDL
	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
		fprintf(stderr, "init SDL %s\n", SDL_GetError());
		return -1;
	}
 atexit(SDL_Quit);




screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
	if (screen == NULL) {
		fprintf(stderr, "初始化屏幕失败 640x480x8 video mode %s\n",SDL_GetError());
		return -1;
	}
 SDL_WM_SetCaption("四则运算, NULL);

}


 int drawsreen(){


	image = SDL_LoadBMP("./bg.bmp");

	if (image == NULL) {
		fprintf(stderr, "下载图片失败, %s\n", SDL_GetError());
		return -1;
	}

	     if (SDL_BlitSurface(image, NULL, screen, NULL) < 0) {
		
		fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());
		return -1;
	}

	
 		boxColor(screen, 0, 0,80, 50,0xff8f66);
		boxColor(screen, 100, 0,180, 50,0xff8f66);
		boxColor(screen, 200, 0,280, 50,0xff8f66);

          
		//clear quit 
		boxColor(screen, 400, 70,480, 120,0xff8f66);
 		boxColor(screen, 500, 70,580, 120,0xff8f66);
		//srand %
		boxColor(screen, 400, 140,480, 190,0xff8f66);
		boxColor(screen, 500, 140,580, 190,0xff8f66);
   		// * /
		boxColor(screen, 400, 210,480, 260,0xff8f66);
		boxColor(screen, 500, 210,580, 260,0xff8f66);
		//+  --
	     boxColor(screen, 400, 280,480, 330,0xff8f66);
 		boxColor(screen, 500, 280,580, 330,0xff8f66);

          stringColor(screen, 420, 305,"+",0xFFFFFFFF);
		stringColor(screen, 520, 305,"-",0xFFFFFFFF);
		stringColor(screen, 420, 235,"*",0xFFFFFFFF);
		stringColor(screen, 520, 235,"/",0xFFFFFFFF);
		stringColor(screen, 420, 95,"clear",0xFFFFFFFF);
		stringColor(screen, 520, 95,"Quit",0xFFFFFFFF);
		stringColor(screen, 420, 165, "srand", 0xFFFFFFFF);
		stringColor(screen, 520, 165, "%", 0xFFFFFFFF);
		SDL_UpdateRect(screen, 0, 0, 0, 0);

}

int srandtest(){

srand((int)time(0));

j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
k=1+(int)(10.0*rand()/(RAND_MAX+1.0));

sprintf(num1,"%x",j);
sprintf(num2,"%x",k);
sprintf(result,"%x",(j+k)%16);
sprintf(subresult,"%x",(j-k)%16);
sprintf(mulresult,"%x",j*k);
sprintf(divresult,"%x",j/k);
sprintf(quyuresult,"%x",j%k);

}


int event_test(){


while ( SDL_WaitEvent(&event) >= 0 ) {
        switch (event.type) {
                    
            case SDL_MOUSEBUTTONDOWN: {


        if ((event.button.x<=580&&event.button.x>=500)&&(event.button.y>=280 && event.button.y<=330)){
//减法运算		
			drawsreen();
			srandtest();			
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"-", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,subresult, 0xFFFFFFFF);
			if(j<k){

				stringColor(screen, 90, 70,"Divide Overflow", 0xFFFFFFFF);
			}
			SDL_UpdateRect(screen, 0, 0,0,0);

		}else if((event.button.x<=480&&event.button.x>=400)&&(event.button.y>=280 && event.button.y<=330)){
//加法运算
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"+", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,result, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.button.x<=480&&event.button.x>=400)&&(event.button.y>=70 && event.button.y<=120)){
//清屏
drawsreen();


}else if((event.button.x<=580&&event.button.x>=500)&&(event.button.y>=70 && event.button.y<=120)){
			
//退出
			exit(0);




}else if((event.button.x<=480&&event.button.x>=400)&&(event.button.y>=140 && event.button.y<=190)){
//产生随机数
			drawsreen();
			srandtest();			
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);

			
}else if((event.button.x<=480&&event.button.x>=400)&&(event.button.y>=210 && event.button.y<=260)){
// 乘法运算
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"*", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,mulresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.button.x<=580&&event.button.x>=500)&&(event.button.y>=210 && event.button.y<=260)){
//除法运算
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"/", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,divresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}else if((event.button.x<=580&&event.button.x>=500)&&(event.button.y>=140 && event.button.y<=190)){
// 取余运算
			drawsreen();
			srandtest();
			stringColor(screen, 40, 25, num1, 0xFFFFFFFF);
			stringColor(screen, 90, 25,"%", 0xFFFFFFFF);
			stringColor(screen, 120, 25,num2, 0xFFFFFFFF);
			stringColor(screen, 190, 25,"=", 0xFFFFFFFF);
			stringColor(screen, 220, 25,quyuresult, 0xFFFFFFFF);
			SDL_UpdateRect(screen, 0, 0,0,0);
}

               }
                  break;

            case SDL_QUIT: {

                printf("Quit requested, quitting.\n");
                exit(0);
            }
            break;
        }
    }

}

备注:需要注意的是SDL的一些库的用法,比如呀:

./configure

make &&make install

然后,编译的时候

PC上:

gcc  *.c  -o test -I/usr/local/include   -L/usr/lib    -lSDL     -lSDL_image      -lSDL_gfx 

./test

交叉编译:

arm-linux-gcc  *.s   *.c  -o test    -I/usr/local/include    -L/usr/lib    -lSDL    -lSDL_image    -lSDL_gfx   

./test

 挂载U盘的命令:

1.查看U盘 的名字

fdisk  

mount       /dev/sda1  /mnt/nfs

cd            /mnf/nfs

cd    wangjie(可执行文件所在的文件夹)

./test

结果就如上图所示

---北医

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值