最近一周在忙于课程设计,要实现的效果的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

结果就如上图所示

---北医