最近一周在忙于课程设计,要实现的效果的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
结果就如上图所示
---北医