嵌入式系统原理及应用题目要求+程序代码
- 格式:doc
- 大小:120.00 KB
- 文档页数:17
嵌入式系统编程题汇编(带答案).一。
从一数到十COUNT EQU 0x30003100 ;定义变量 COUNT 的基地址AREA Example1,CODE,READONLY;声明代码段 Example1 为只读START储单元LOOP到 R0 中址单元ENTRYCODE32LDR R1,=COUNTMOV R0,#0STR R0,[R1]LDR R1,=COUNTLDR R0,[R1]ADD R0,R0,#1CMP R0,#10MOVHS R0,#0STR R0,[R1]B LOOPEND;标识程序入口;声明 32 位 ARM 指令;将 0X30003100 赋给 R1;执行 R0=0;存储 R0 寄存器的数据到 R1 指向的存;将 0X30003100 赋给 R1;将 R1 中的数值作为地址,取出此地址中的数据保存;执行 R0=R0+1;将 R0 与 10 进行比较;若 R0 大于等于 10,则 R0=0;存储 R0 寄存器的数据到 R1 指向的地;跳转到 LOOP;汇编文件结束二, 9 的 8 次幂X EQU 9 ;初始化 X 为 9n EQU 8AREA;初始化 N 为 8Example3,CODE,READONLY ;生明代码段 Example3 为只读ENTRY ;标识程序入口路CODE32 ;声明 32 位 ARM 指令START LDR S P,=0x30003F00 ;把 0x30003F00 赋给 SP (R13)LDR R0,=X ;把 9 赋给 R0LDR R1,=n ;把 8 赋给 R1BL POW ;跳转到 POW,并把下一条指令地址存入到R14 中HALT POWPOW_L1 R14 中位B HALT ;等待跳转STMFD SP!,{R1-R12,LR} ;将 R1-R12 入栈,满递减堆栈MOVS R2,R1 ;将 R1 赋给 R2,并影响标志位MOVEQ R0,#1 ;若 Z=1,则 R0=1BEQ POW_END ;若 Z=1,跳转到 POW_ENDMOV R1,R0 ;将 R0 中值赋给 R1SUB R2,R2,#1 ;将 R2-1 的只赋给 R2BL DO_MUL ;跳转到 DO-MUL,并把下一条指令地址存入SUBS R2,R2,#1 ;将 R2-1 的值赋给 R2,并影响标志BNE POW_L1POW_END LDMFD SP!,{R1-R12,PC} DO_MUL MUL R0,R1,R0MOV PC,LREND三:从一一直加到一百;若 Z=0,跳转到 POW_L1;数据出栈,存入到 R1-R12,PC 中;把R1*R0 的值赋给 R0;LR 中的值赋给 PC;汇编结束#define #define #define uint32程序清单(一) C 语言实验参考程序uint8 unsigned charuint32 unsigned intN 100;定义一个无符号字符常量 uint8;定义一个无符号整形常量unint32;定义一个常量N=100(宏定义, 100用N代替) sum; ;定义sum为无符号整型常量(声明一个 unsigned int型的变量sum)void Main (void) ;主函数{uint32 i; ;定义无符号整型常量i (声明一个unsigned int型的变量i)sum=0;for (i=0;i<=N;i++){sum+=i;}while (1) ; } ;sum初始值为0;i在N内自增加1 (i从0开始, i<=N时循环成立) ;把sum+i赋给sum;为真循环程序清单(二) 简单的启动代码IMPORT|Image$$RO$$Limit |;R0输出段存储区域界限IMPORT|Image$$RW$$Base |;RW输出段运行时起始地址IMPORT|Image$$ZI$$Base |;ZI输出段运行时起始地址IMPORT|Image$$ZI$$Limit |;ZI输出段存储区域界限IMPORT Main;主函数AREAENTRYCODE32 ResetStart,CODE,READONLYLDR SP,=0x40003f00;声明代码段start,为只读;程序入口;声明32位ARM指令;将0x40003f00赋给SPLDRLDRLDRR0,=|Image$$RO$$Limit| ; 将R0输出段存储区域界限赋给R0 R1,=|Image$$RW$$Base | ; 将RW输出段运行时起始地址赋给 R1R3,=|Image$$ZI$$Base | ;将ZI输出段运行时起始地址赋给R3LOOP0 R0=R0+4 R1=R1+4 LOOP1 LOOP2 R3=R3+4 CMP R0,R1BEQ LOOP1CMP R1,R3LDRCC R2,[R0],#4;比较R0和R1,相等Z=1,反之Z=0;若Z=1,则跳到LOOP1;比较R1和R3,若R1<R3, C=0;若C=0,读取R0地址单元内容并且存入R2,且STRCC R2,[R1],#4 ;若C=0,读取R2中的数据存入R1,且BCCLDRMOVCMPLOOP0R1,=|Image$$ZI$$Limit|R2,#0R3,R1;若C=0,跳转到LOOP0;将ZI输出段存储区域赋给R1;把0赋给R2;比较R1和R3,若R1<R3, C=0 STRCCBCCBENDR2,[R3],#4LOOP2Main;若C=0,将R2中数据保存到内存单元R3中,且;若C=0,跳转到LOOP2;跳转到主程序;汇编结束实验四程序清单(一) C 语言调用汇编的参考程序#define uint8 unsigned char #define uint32 unsigned int ;定义一个无符号字符常量 uint8 ;定义一个无符号整型常量 .uint32extern uint32 Add (uint32 x,uint32 y) ; //声明子程序 Add 为一个无符号整型常量,它为 2 个无符号整型常量 x,y 的和uint32 sum;void Main (void) {sum=Add (555,168) ;while (1) ;} ;定义 sum 为无符号整型常量;无返回主程序;sum 等于 555+168;为真循环程序清单(二) 汇编加法函数程序EXPORT AREA ENTRY CODE32 ADD MOV END AddStart,CODE,READONLYR0,R0,R1PC,LR;声明子程序 Add 方便调用;声明代码段 start,为只读;程序入口;声明 32 位 ARM 指令;将 R0+R1 值赋给 R0;将 LR 值赋给 PC;汇编结束14 、设计编程: LPC2131 的 P0.7 引脚连接了一个蜂鸣器,编程发出等周期的滴滴声。
嵌入式Linux实时操作系统及应用编程代码与答案嵌入式系统是一种特殊的计算机系统,它被用于控制、监测和管理各种设备和系统。
嵌入式Linux系统由Linux内核和一些特定的应用程序组成,其实时性能在许多嵌入式应用领域具有重要意义。
本文将介绍嵌入式Linux实时操作系统及应用编程的相关代码和答案。
一、嵌入式Linux实时操作系统1. 定义实时系统实时系统是指需要在特定时间范围内完成某个任务,并对任务执行时间的可控性要求较高的系统。
在嵌入式领域,实时性能尤为重要,特别是在要求高响应性和低延迟的应用中。
2. Linux内核的实时性能Linux内核是一种开源、免费的操作系统内核,它在实时性能方面存在一定的局限性。
然而,通过对Linux内核进行优化和定制,可以实现嵌入式Linux实时操作系统的要求。
3. 实时调度策略实时调度策略是指操作系统在多任务环境下,对任务进行调度和分配的策略。
Linux内核提供了多种实时调度策略,如先来先服务(FIFO)、循环调度(Round Robin)等。
4. 实时内核补丁为了提高Linux内核的实时性能,开发者们开发了一些实时内核补丁,如PREEMPT-RT等。
这些内核补丁可以改进Linux内核的调度算法,提高系统的实时性能。
二、嵌入式Linux应用编程代码与答案1. 嵌入式Linux应用编程语言在嵌入式Linux应用编程中,常用的编程语言有C和C++。
C语言是一种中级语言,它具有高效性和可移植性的特点,被广泛应用于嵌入式系统开发。
C++语言是基于C语言的扩展,它提供了更多的特性和面向对象的编程能力。
2. 嵌入式Linux应用程序的开发嵌入式Linux应用程序的开发包括编写代码、编译、链接和调试等过程。
在开发过程中,需要使用一些开发工具和库文件,如GCC编译器、Make工具、GDB调试器等。
3. 嵌入式Linux应用程序示例以下是一个简单的嵌入式Linux应用程序示例,用C语言编写:```c#include <stdio.h>int main() {printf("Hello, Embedded Linux!\n");return 0;}```这段代码实现了一个简单的打印功能,将"Hello, Embedded Linux!"输出到终端。
#include"stdio.h"#include" gtk/gtk.h"#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h> #include"time.h"#include "string.h"#define UP 72#define DOWN 80#define LEFT 75#define RIGHT 77#define esc 27int rows;int cols;int s;clock_t start,end,K;int G=0;char playername[10];void play();void drawA();void drawM1();void drawM2();void init(struct list *L);void judge1();void judge2();void judge3();void face();void score();void exit();void clear(struct list *L); void Md();void rank(struct list *L);void Load1;void saveuser(struct list *L);struct pacman{int row;int col;int direction;int live;}A,p;struct monster{int row;int col;int direction;}M1,M2,q1,q2;struct Cell{int row;int col;int life;}c[39];struct wall{int row;int col;}w[60];struct player{ char name[10];int time;int f;}T;struct node//设置节点{struct player data;struct node *next;};struct list{struct node *tail,*head;}L;void main() //主函数{int select;face();QFile file("/home /scene.txt");Load1();select=getch();switch(select){case '1':cleardevice();init(&L);play();break;case '2':rank(&L);}}void load1(char *filename) //场景对象设计{FILE *fp;char st[10];int i,j,t=0,d=0;if((fp=fopen(filename,"r"))==NULL)exit();fscanf(fp,"%d,%d\n",&rows,&cols);for(i=0;i<rows;i++){fgets(st,30,fp);for(j=0;j<cols;j++)switch(st[j]){case '1':w[d].row=i;w[d].col=j;d++;setcolor(BLACK);setfillcolor(WHITE);fillrectangle(200+j*40,100+i*40,200+j*40+39,100+i*40+39);break;case '0':c[t].row=i;c[t].col=j;c[t].life=1;t++;setcolor(BLACK);setfillcolor(LIGHTGREEN);fillcircle(200+j*40+20,100+i*40+20,15);break;case 'A':A.row=i;A.col=j;setcolor(BLACK);setfillcolor(LIGHTRED);fillcircle(200+A.col*40+20,100+A.row*40+20,15);break;case 'M':setcolor(BLACK);setfillcolor(GREEN);fillrectangle(200+j*40,100+i*40,200+j*40+39,100+i*40+39);break;}}getch();fclose(fp);}void drawA() //画精灵{setlinecolor(BLACK);setfillcolor(BLACK);fillcircle(200+p.col*40+20,100+p.row*40+20,15);setfillcolor(LIGHTBLUE);fillcircle(200+A.col*40+20,100+A.row*40+20,15);}void drawM1() //画怪物1{setlinecolor(BLACK);setfillcolor(BLACK);fillrectangle(200+q1.col*40,100+q1.row*40,200+q1.col*40+39,100+q1.row*40+39);int i;for(i=0;i<42;i++){if(q1.col==c[i].col&&q1.row==c[i].row){if(c[i].life==1){setlinecolor(BLACK);setfillcolor(LIGHTGREEN);fillcircle(200+c[i].col*40+20,100+c[i].row*40+20,15);}}}setfillcolor(RED);fillrectangle(200+M1.col*40,100+M1.row*40,200+M1.col*40+39,100+M1.row*40+39); }void drawM2() //画怪物2{setlinecolor(BLACK);setfillcolor(BLACK);fillrectangle(200+q2.col*40,100+q2.row*40,200+q2.col*40+39,100+q2.row*40+39);int i;for(i=0;i<42;i++){if(q2.col==c[i].col&&q2.row==c[i].row){if(c[i].life==1){setlinecolor(BLACK);setfillcolor(LIGHTGREEN);fillcircle(200+c[i].col*40+20,100+c[i].row*40+20,15);}}}setfillcolor(RED);fillrectangle(200+M2.col*40,100+M2.row*40,200+M2.col*40+39,100+M2.row* 40+39);}void Md()//怪物移动{int a,b;Sleep(400);a=rand()%4;switch(a){case 0:q1.col=M1.col;q1.row=M1.row;M1.col--;judge2();drawM1();break;case 1:q1.col=M1.col;q1.row=M1.row;M1.row--;judge2();drawM1();break;case 2:q1.col=M1.col;q1.row=M1.row;M1.col++;judge2();drawM1();break;case 3:q1.col=M1.col;q1.row=M1.row;M1.row++;drawM1();break;}b=rand()*123%4;switch(b){case 0:q2.col=M2.col;q2.row=M2.row;M2.col--;judge3();drawM2();break;case 1:q2.col=M2.col;q2.row=M2.row;M2.row--;judge3();drawM2();break;case 2:q2.col=M2.col;q2.row=M2.row;M2.col++;judge3();drawM2();break;case 3:q2.col=M2.col;q2.row=M2.row;M2.row++;judge3();drawM2();break;}}void judge1()//精灵移动判定{int k;for(k=0;k<42;k++){if(A.col==c[k].col&&A.row==c[k].row)if(c[k].life==1){c[k].life=0;G++;}}for(k=0;k<60;k++){if(A.col==w[k].col&&A.row==w[k].row){A.col=p.col;A.row=p.row;}}}void judge2() //怪物1移动判定{int k;for(k=0;k<60;k++){if(M1.col==w[k].col&&M1.row==w[k].row){M1.col=q1.col;M1.row=q1.row;}}if(M1.col==A.col&&M1.row==A.row)exit();}void judge3() //怪物2移动判定{int k;for(k=0;k<60;k++){if(M2.col==w[k].col&&M2.row==w[k].row){M2.col=q2.col;M2.row=q2.row;}}if(M2.col==A.col&&M2.row==A.row)exit();}void face() //初始界面{initgraph(800,600);setbkcolor(BLACK);cleardevice();settextcolor(YELLOW);outtextxy(250,180,"PacMan--吃豆豆");outtextxy(250,300,"1.Start the game");outtextxy(250,350,"2.Ranking list");outtextxy(250,500,"092715206");}void init(struct list *L) //游戏初始化{struct node *p;p=(struct node *)malloc(sizeof(struct node));int i=0,j=100;setbkcolor(BLACK);cleardevice();setcolor(YELLOW);rectangle(40,40,760,560);settextcolor(WHITE);settextcolor(YELLOW);outtextxy(100,j,"Enter your name:");scanf("%s",);outtextxy(600,100,);strcpy(p->,);p->next=NULL;if(L->head==NULL){L->head=p;L->tail=p;}else{L->tail->next=p;L->tail=p;}getch();cleardevice();outtextxy(50,50,"SCORE:0");outtextxy(400,50,"Time:0");QFile file("/home /scene.txt");A.col=1;A.row=1;M1.col=1;M1.row=8;M2.col=7;M2.row=8;}void play() //进行游戏{srand(time(NULL));start=clock();A.live=1;int ch;do{while(A.live==1&&G<39){while(kbhit()){ch=getch();K=clock();T.time=K-start;score();switch(ch){case 72:p.col=A.col;p.row=A.row;A.row--;judge1();drawA();break;case 80:p.col=A.col;p.row=A.row;A.row++;judge1();drawA();break;case 75:p.col=A.col;p.row=A.row;A.col--;judge1();drawA();break;case 77:p.col=A.col;p.row=A.row;A.col++;judge1();drawA();break;case 27:exit();break;}Sleep(10);Md();if(G==50){A.live=0;clear(&L);saveuser(&L);rank(&L);}}while(!kbhit()){Md();K=clock();T.time=K-start;score();}if(G==10){A.live=0;clear(&L);saveuser(&L);rank(&L);}}}while(1);}void clear(struct list *L)//游戏通关{struct node *p;p=(struct node *)malloc(sizeof(struct node));char time[5];int s;cleardevice();outtextxy(250,250,"CLEAR");end=clock();T.time=(end - start)/CLOCKS_PER_SEC;s=(100-T.time)*10;sprintf(time, "%d",T.time);outtextxy(100,250,"You use seconds");outtextxy(300,250,time);sprintf(time, "%d",s);outtextxy(100,400,"You get score");outtextxy(300,400,time);p->data.time=T.time;strcpy(p->,);p->data.f=s;p->next=NULL;if(L->head==NULL){L->head=p;L->tail=p;}else{L->tail->next=p;L->tail=p;}getch();}void exit()//游戏失败{A.live=0;cleardevice();outtextxy(250,250,"GAME OVER");getch();closegraph();}void score()//得分{s=G*10;char o[5],o2[5];settextcolor(RED);sprintf(o, "%d",s);outtextxy(190,50,o);T.time=(K - start)/CLOCKS_PER_SEC;sprintf(o2, "%d",T.time);outtextxy(525,50,o2);}void saveuser(struct list *L) //保存文件{struct node *p;FILE *fp;if(QFile file("/home /scene.txt"))==NULL) exit();for(p=L->head;p!=NULL;p=p->next){fwrite(p,sizeof(struct node),1,fp);}fclose(fp);}void rank(struct list *L)//排行榜{struct node *q;struct node *p;struct node *t;int i=0;char r[20];p=(struct node *)malloc(sizeof(struct node));q=(struct node *)malloc(sizeof(struct node));t=(struct node *)malloc(sizeof(struct node));for(p=L->head;p!=L->tail;p=p->next)for(q=p->next;q!=NULL;q=q->next){if(p->data.f<q->data.f){strcpy(t->,p->);strcpy(p->,q->);strcpy(q->,t->);t->data.time=p->data.time;p->data.time=q->data.time;q->data.time=t->data.time;t->data.f=p->data.f;p->data.f=q->data.f;q->data.f=t->data.f;}}cleardevice();p=L->head;settextcolor(CYAN);outtextxy(300,60,"Rank");outtextxy(200,80,"Player");outtextxy(400,80,"Score");for(i=0;i<5;i++){if(p!=NULL){strcpy(r,p->);outtextxy(200,100+i*20,r);sprintf(r,"%d",p->data.f);outtextxy(400,100+i*20,r);p=p->next;}}getch();closegraph();}。
1.建立一个main.c文件,程序代码如下#define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) #define PCLK 66000000 //for S3C6410 66MHZ#define HCLK 133000000 //for S3C6410 133MHZ#define rTCFG0 (*(volatile unsigned *)(0x7F006000))#define rTCFG1 (*(volatile unsigned *)(0x7F006004))#define rTCON (*(volatile unsigned *)(0x7F006008))#define rTCNTB0 (*(volatile unsigned *)(0x7F00600C))#define rTCMPB0 (*(volatile unsigned *)(0x7F006010))#define rTCNTO0 (*(volatile unsigned *)(0x7F006014))#define rTCNTB1 (*(volatile unsigned *)(0x7F006018))#define rTCMPB1 (*(volatile unsigned *)(0x7F00601c))#define rTCNTO1 (*(volatile unsigned *)(0x7F006020))#define rTCNTB2 (*(volatile unsigned *)(0x7F006024))#define rTCNTO2 (*(volatile unsigned *)(0x7F00602c))#define rTCNTB3 (*(volatile unsigned *)(0x7F006030))#define rTCNTO3 (*(volatile unsigned *)(0x7F006038))#define rTCNTB4 (*(volatile unsigned *)(0x7F00603c))#define rTCNTO4 (*(volatile unsigned *)(0x7F006040))#define rTINT_CSTAT (*(volatile unsigned *)(0x7F006044)) void uDelay(int usec){unsigned int val = (PCLK)/1000000-1;rTCFG0 &= ~(0xff<<8);rTCFG0 |= 0<<8;rTCFG1 &= ~(0x0f<<8);rTCFG1 |= 0<<8;rTCNTB2 = val;rTCON &= ~(0x0f<<12);rTCON |= 0x0b<<12;rTCON &= ~(2<<12);while(usec--) {while(rTCNTO2>=val>>1);while(rTCNTO2<val>>1);}}void msDelay(int time){volatile unsigned int i,j;for(i = 0; i < 2000000; i++)for(j=0; j<time; j++);}void GPIO_Init(void){rGPMCON = 0x11111;rGPMPUD = 0x00;rGPMDAT = 0X1F;}void LedTest(void){volatile unsigned int i,j;while (1){for(i=0; i<4; i++){rGPMDAT = ~(1<<i);for (j=0; j<1000; j++)uDelay(1000);}}}void Main(void){GPIO_Init();LedTest();}2.init.s程序代码如下,注意除了start前边都应空出一个Tab键IMPORT MainAREA |C$$code|, CODE, READONLYglobal startstartbl MainEND。
单片机原理与嵌入式系统的实验源代码#include //80C52特殊功能寄存器定义#define LED_PORT0 P0 //用P0口驱动灯,低亮,高灭#define LED_PORT1 P1 //用P1口驱动灯,低亮,高灭#define LED_PORT2 P2 //用P2口驱动灯,低亮,高灭#define LED_PORT3 P3 //用P3口驱动灯,低亮,高灭void time(unsigned int ucMs);/* 延时单位:毫秒 */void main(void){unsigned char ucTimes;#define DELAY_TIME 400 //延时while(1){for(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P0口灯LED_PORT0 = LED_PORT0 - (0x80>>ucTimes);//亮灯需低电平驱动time(200);}LED_PORT0=0xff;//灭P0口灯for(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P1口灯LED_PORT1 = LED_PORT1 - (0x80>>ucTimes);//亮灯需低电平驱动time(200);}LED_PORT1=0xff;//灭P1口灯for(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P2口灯LED_PORT2 = LED_PORT2 - (0x80>>ucTimes);//亮灯需低电平驱动time(200);}LED_PORT2=0xff;//灭P2口灯for(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P3口灯LED_PORT3 = LED_PORT3 - (0x80>>ucTimes);//亮灯需低电平驱动time(200);}LED_PORT3=0xff;//灭P3口灯LED_PORT3=0x00;//然后从右往左依次点亮LEDfor(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P1口灯LED_PORT3 = LED_PORT3 - (0x01<time(200);}LED_PORT3=0x00;//全亮LED_PORT3=0x00;//然后从右往左依次点亮LEDfor(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P1口灯LED_PORT2 = LED_PORT2 - (0x01<time(200);}LED_PORT2=0x00;//全亮LED_PORT3=0x00;//然后从右往左依次点亮LEDfor(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P1口灯LED_PORT1 = LED_PORT1 - (0x01<time(200);}LED_PORT1=0x00;//全亮LED_PORT3=0x00;//然后从右往左依次点亮LEDfor(ucTimes=0;ucTimes<8;ucTimes++){//循环点亮P0口灯LED_PORT0 = LED_PORT0 - (0x01<time(200);}LED_PORT0=0x00;//全亮}}/*********** time C **************/void time(unsigned int ucMs)//延时单位:ms {#define DELAYTIMES 239unsigned char ucCounter; // 延时设定的循环次数while (ucMs!=0) {for (ucCounter=0; ucCounterucMs--;}}。
《嵌入式系统开发与应用实验教程第二版》增加的光盘内容:《嵌入式系统开发与应用教程》/第五章1.《嵌入式系统开发与应用教程》/第五章/5.3嵌入式C语言程序设计基础/例程一44blib.h例程一:“44blib.h”以下是“44blib.h”的定义:/*********************************************************************** File:44BLIB.H* Desc:Samsung 44B0X CPU function declare and common define**********************************************************************/#ifndef __44BLIB_H__#define __44BLIB_H__#ifdef __cplusplusextern "C" {#endif//常量本部分内容定义了一些常量#define DebugOut Uart_Printf#define min(x1,x2) ((x1<x2)? x1:x2)#define max(x1,x2) ((x1>x2)? x1:x2)#define ONESEC0 (62500) //16us resolution, max 1.04 sec#define ONESEC1 (31250) //32us resolution, max 2.09 sec#define ONESEC2 (15625) //64us resolution, max 4.19 sec#define ONESEC3 (7812) //128us resolution, max 8.38 sec#define ONESEC4 (MCLK/128/(0xff+1)) //@60Mhz, 128*4us resolution, max 32.53 sec#define NULL 0#define EnterPWDN(clkcon) ((void (*)(int))0xe0)(clkcon)#define DOWNLOAD_ADDRESS _RAM_STARTADDRESS/* 8led control register address */#define LED8ADDR (*(volatile unsigned char *)(0x2140000))#define LCD 0xFF#define UART 0xFE/*44blib.c本部分内容对开发中用到的一些库函数作函数原型定义*/void Delay(int time); //Watchdog Timer is used.void DelayMs(int ms_time);void *malloc(unsigned nbyte);void free(void *pt);void Cache_Flush(void);void ChangeMemCon(unsigned *pMemCfg);void Uart_Select(int ch);void Uart_TxEmpty(int ch);void Uart_Init(int mclk,int baud);char Uart_Getch(void);char Uart_GetKey(void);int Uart_GetIntNum(void);void Uart_SendByte(int data);void Uart_Printf(char *fmt,...);void Uart_SendString(char *pt);void Timer_Start(int divider); //Watchdog Timer is used.int Timer_Stop(void); //Watchdog Timer is used.void Led_Display(int LedStatus);void Beep(int BeepStatus);void ChangePllValue(int m,int p,int s);#ifdef __cplusplus}#endif#endif /* __44BLIB_H__ */◆"44b.h"主要是用宏的方式定义了程序中所需的44B0X片上涉及到各模块中各寄存器的宏定义的地址。
嵌入式系统原理与应用1.对于8086CPU,mov ds,0是错误的指令2. GPIO可以用于模拟Flash的接口,对Flash存储器进行读写操作3. RS232-C串口通信中,表示逻辑1的电平是-5v~-15v4. 上电启动默认的是小端方式,可以通过对MMU 的R1控制寄存器的第7位B进行设置成大端方式5. S3C2440X I/O口常用的控制器是端口控制寄存器和上拉寄存器,端口数据寄存器,外部中断控制寄存器(EXTINTn)。
6. 有关 ARM 处理器工作状态的描述,切换工作状态时必须保存现场是不正确的7.BootLoader第二阶段代码大部分由C语言写成8. 在汇编语言源程序中,不由编译器执行的伪指令有对应的机器指令是错误的9.指令长度不固定,执行需要多个周期不属于RISC 计算机的特点10. PC机的最小信息单位是bit11. ARM汇编语句“ADD R0, R2, R3, LSL#1”的作用是 R0 = R2 + (R3 << 1)12. IIC的器件地址是64bit是错误的13.S3C2410X处理器为用户进行应用设计提供了支持多主总线的IIC接口。
处理器提供符合IIC协议的设备连接的串行连接线为SCL和SDA14. 强大多任务支持不是嵌入式操作系统的主要目标15. DRAM 存储器不属于非易失的存储器16.GPIO可以用于模拟 Flash 的接口,对 Flash 存储器进行读写操作17. 在嵌入式系统设计中,进行硬件版图设计是在进行软硬件设计时完成。
18.Flash 存储器的写操作与 SDRAM 存储器的写操作并不基本相同19. 程序存储空间与数据存储空间合并是关于冯・诺依曼结构正确的描述20. 在带MMU的操作系统控制下,运行的任务必须知道其他与之无关的任务的存储需求情况,这就简化了各个任务的设计是关于存储管理单元(MMU)错误的说法21. GPIO可以由CPU编程决定方向,但不能查询其状态;GPIO通常用于连接外部的SDRAM,进行高速传输;CPU可以通过编程,决定GPIO是输入、输出的通信功能,但不能是双向的是对于GPIO错误的描述22. 大端格式,字数据的低字节存放在高地址中,小端格式,字数据的低字节存储在低地址中23.嵌入式Linux中,内存管理,网络接口,进程间通信是属于Linux内核部分的功能24. 设置内核编译配置选项,考虑的方面有节省存储空间,节省运行时间,减少漏洞25. mov ax,bx; mov ax,[bx]; mov ax,0都是对于8086CPU正确的指令26. ARM7,ARM9,ARM10不具有Thumb-2状态的ARM处理器内核27. 指令的长度固定,指令格式种类少,大部分指令在一个时钟周期内完成,采用指令流水线操作是RISC 的设计要点28.BootLoader的第一阶段代码在Flash中运行,BootLoader中可以使用glib库中的函数,BootLoader 第二阶段代码大部分由C语言写成,所以需要使用栈29. 嵌入式处理器,支撑硬件,嵌入式软件是可以组成嵌入式系统的部分30. 内存可以被 CPU 访问,也可以被 DMA 控制器访问,DMA 可以和 CPU 并行工作,DMA 开始前,CPU 需要初始化 DMA 控制器,结束后,DMA 控制器产生中断31. 条件转移不属于ARM异常中断32. ARM9的FIQ中断不可以同时设置多个中断源33. ARM处理器结构体系中具有T变种处理器核可以工作在ARM状态和Thumb状态34.嵌入式系统的硬件一般包括嵌入式微处理器、外围电路和嵌入式外围设备等组成。
嵌⼊式原理实验代码集合=============================================================实验⼀AREA Examplel,CODE,READONLY;声明代码段ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START MOV R0,#15 ;设置参数MOV R1,#8ADDS R0,R0,R1 ;R0=R0+R1B STARTEND========================================================================= 实验⼆=========================================================================实验⼆汇编指令实验1COUNT EQU 0x40003100 ;定义⼀个变量,地址为0x40003100AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#0 ;R0<=0STR R0,[R1] ;[R1]<=R0LOOP LDR R1,=COUNTLDR R0,[R1] ;R0<=[R1]ADD R0,R0,#1 ;R0<=R0+1CMP R0,#10 ;R0与10⽐较,影响条件码标志MOVHS R0,#0 ;若R0⼤于等于10.执⾏R0<=0STR R0,[R1] ;[R1]<=R0,即保存COUNTB LOOPEND实验⼆思考题:思考题:第五题:COUNT EQU 0x40003400 ;定义⼀个变量,地址为0x40003400AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#80 ;R0<=80STR R0,[R1] ;[R1]<=R0LOOP LDR R1,=COUNTLDR R0,[R1] ;R0<=[R1]SUB R0,R0,#2 ;R0<=R0-2CMP R0,#60 ;R0与60⽐较,影响条件码标志MOVLO R0,#80 ;若R0⼤于等于60.执⾏R0<=80STR R0,[R1] ;[R1]<=R0,即保存COUNTB LOOPEND思考题第六题COUNT EQU 0x40003400 ;定义⼀个变量,地址为0x40003400AREA Example2,CODE,READONLY ;声明代码段Example2ENTRY ;标识程序⼊⼝CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1<=COUNTLDR R0,=0xAA11BB22 ;R0<=0xAA11BB22STR R0,[R1] ;[R1]<=R0LDR R1,=COUNTLDR R0,[R1]LDRH R0,[R1]LDRSH R0,[R1]LDRB R0,[R1]LDRSB R0,[R1]LDR R0,=0xFFFFFFCCSTRB R0,[R1]STRH R0,[R1]STR R0,[R1]B STARTEND实验三汇编指令实验2X EQU 11 ; 定义X的值为11Y EQU 8 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、ADD指令实现:R8 = R3 = X + YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据ADD R3,R0,R1 ; 即是R3 = X + YMOV R8,R3 ; R8 <= R3; 使⽤MVN、SUB指令实现:R5 = 0x5FFFFFF8 - R8 * 8MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8SUB R5,R0,R8,LSL #3 ; R8左移3位,结果即是 R8 * 8; 使⽤CMP指令判断(5*Y/2)>(2*X)吗?若⼤于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FF MOV R0,#YADD R0,R0,R0,LSL #2 ; 计算R0 = Y + 4*Y = 5*YMOV R0,R0,LSR #1 ; 计算R0 = 5*Y/2MOV R1,#XMOV R1,R1,LSL #1 ; 计算R1 = 2*XCMP R0,R1 ; ⽐较R0和R1,即(5*Y/2)和(2*X)进⾏⽐较LDRHI R2,=0xFFFF0000 ; 若(5*Y/2)>(2*X),则R2 <= 0xFFFF0000ANDHI R5,R5,R2 ; 若(5*Y/2)>(2*X),则R5 = R5&R2ORRLS R5,R5,#0x000000FF ; 若(5*Y/2)≤(2*X),则R5 = R5|0x000000FF; 使⽤TST指令测试R5的bit23是否为1,若是则将bit6位清零(使⽤BIC指令)TST R5,#BIT23BICNE R5,R5,#0x00000040B STARTEND实验三思考题:思考题1:不正确,直接带⼊,不符合图8位AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令STARTLDR R2,=0x1234LDR R3,=0x5678LDR R5,=0x9ACDLDR R6,=0xEF12ADDS R5,R2,R5;ADC R6,R3,R6;B STARTENDX EQU 11 ; 定义X的值为11Y EQU 8 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、ADD指令实现:R8 = R3 = X + YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据ADD R3,R0,R1 ; 即是R3 = X + YMOV R8,R3 ; R8 <= R3; 使⽤MVN、SUB指令实现:R5 = 0x5FFFFFF8 - R8 * 8MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8SUB R5,R0,R8,LSL #3 ; R8左移3位,结果即是 R8 * 8; 使⽤CMP指令判断(5*Y/2)>(2*X)吗?若⼤于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FF MOV R0,#YADD R0,R0,R0,LSL #2MOV R0,R0,LSR #1MOV R1,#XMOV R1,R1,LSL #1CMP R0,R1LDRLS R2,=0xFFFF0000;ANDHI R5,R5,#0x000000FF;ORRLS R5,R5,R2B STARTENDX EQU 200 ; 定义X的值为11Y EQU 163 ; 定义Y的值为8BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000AREA Example3,CODE,READONLY ; 声明代码段Example3ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START ; 使⽤MOV、RSB指令实现:R8 = R3 = X - YMOV R0,#X ; R0 <= X,X的值必须是8位图数据MOV R1,#Y ; R1 <= Y,Y的值必须是8位图数据RSB R3,R0,R1 ; 即是R3 = X-YMOV R8,R3 ; R8 <= R3;R5=R8*5-0x123ADD R8,R8,R8,LSL #2;R8=R8+4*R8=5R8LDR R2,=0x123;SUB R5,R8,R2;; 使⽤CMP指令判断(4*Y/3+30)>(3*X-20)吗?若⼤于则R5 = R5&0xFF0000FF,否则R5 = R5|0x00FF0000 MOV R0,#Y/3MOV R0,R0,LSL #2ADD R0,R0,#30MOV R1,#XADD R1,R1,R1,LSL #1SUB R1,R1,#20;CMP R0,R1 ; ⽐较R0和R1LDRHI R2,=0xFF0000FF ; 若断(4*Y/3+30)>(3*X-20)则R2 <= 0xFF0000FFANDHI R5,R5,R2 ; 若(4*Y/3+30)>(3*X-20),则R5 = R5&R2ORRLS R5,R5,#0x00FF0000 ; 若(4*Y/3+30)<=(3*X-20),则R5 = R5|0x00FF0000B STARTEND实验四汇编指令实验3实验的⽬的使⽤ARM汇编指令实现结构化程序编程1 使⽤ARM汇编指令实现 if 条件执⾏2 使⽤ARM汇编指令实现 for 循环结构3 使⽤ARM汇编指令实现 while 循环结构4 使⽤ARM汇编指令实现 do...while 循环结构5 使⽤ARM汇编指令实现 switch 开关结构1 使⽤ARM汇编指令实现 if 条件执⾏第⼀个案例 if结构;if(x>y); z=100;;else; z=50;;设x为R0,y为R1,z为R2(x,y,z均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#76;初始化x的值MOV R1,#234;初始化y的值CMP R0,R1;判断x>yMOVHI R2,#100;x>y条件正确,z=100MOVLS R2,#50;条件失败,z=502 使⽤ARM汇编指令实现 for 循环结构⼆案例 for结构;forIi==0;i<10;i++);{;x++;};设x为R0,i为R2(i,x均为⽆符号整数)AREA Example5,CODE,READONLY;声明代码段 Example5ENTRY;CODE32 ;声明32位ARM指令MOV R0,#0;初始化x的值MOV R2,#0;设置i=0FOR_L1 CMP R2,#10;判断i<10?BHS FOR_END;若条件失败,退出循环ADD R0,R0,#1;循环体,X++ADD R2,R2,#1;i++B FOR_L1FOR_END NOP3 使⽤ARM汇编指令实现 while 循环结构第三个案例 while结构;while(x<y);{;x*=2;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R0,#1;初始化x的值MOV R2,#20;初始化y的值B WHILE_L2;⾸先要盘判断条件WHILE_L1 MOV R0,R0,LSL #1;循环体,x*=2WHILE_L2 CMP R0,R1;判断x<=yBLS WHILE_L1;若条件正确,继续循环WHILE_END NOP4 使⽤ARM汇编指令实现 do...while 循环结构第四个案例do....while()结构;do;{;x--;;}while(x>0);设x为R0,(x为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R0,#5;初始化x的值DOWHILE_L1 ADD R0,R0,#-1;循环体,x--;DOWHILE_L2 MOVS R0,R0;R0<=R0,并且影响条件标志BNE DOWHILE_L1;若R0不为0(即x不为0)继续循环DOWHILE_END NOP5 使⽤ARM汇编指令实现 switch 开关结构第五个案例switch;switch(key&0x0F);{; case0:; case2:; case3:x=key+y;; break;; case5:x=key-y;; break;; case7:x=key*y;; break;; default x=168;; break;;};设x为R0,y为R1,key为R2(x,y,key均为⽆符号整数)AREA Example6,CODE,READONLY;声明代码段 Example6 ENTRY;CODE32 ;声明32位ARM指令MOV R1,#3;初始化y的值MOV R2,#2;初始化key的值SWITCH AND R2,R2,#0x0F;switch(key&0x0F)CASE_0 CMP R2,#0;case0:CASE_2 CMPNE R2,#2;case2:CASE_3 CMPNE R2,#3;case3:BNE CASE_5ADD R0,R2,R1;x=key+yB SWITCH_END;break;CASE_5 CMP R2,#5;case5:BNE CASE_7SUB R0,R2,R1;x=key-yB SWITCH_END;break;CASE_7 CMP R2,#7;case7:BNE DEFAULTMUL R0,R2,R1;x=key*yB SWITCH_END;breakDEFAULT MOV R0,#168;default x=168SWITCH_END NOPHALT B HALTEND实验四思考题:;if(x>80){; if(x>90){; z=4;; }else{; z=3;; };}else{; if(x>70){; z=2;; }else{; if(x>=60) z=1;else z=0;; };};设x为R0,z为R2(x,z均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4 ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#76;初始化x的值CMP R0,#80;x与80⽐较BHS IF_L1;⼤于或者等于80的时候BLO IF_L2;⼩于80的时候IF_L1 CMP R0,#90;x与90⽐较MOVHS R2,#4;⼤于等于90的时候对z=4MOVLO R2,#3;⼤于80⼩于90的时候z=3IF_L2 CMP R0,#70;x与70⽐较MOVHS R2,#2CMPLO R0,#60;MOVHS R2,#1;MOVLO R2,#0;HALT B HALTEND思考题3:if结构;if(a==b) c=100;;else c=50;;设a为R0,b为R1,c为R2;a,b,c均为⽆符号整数AREA Example4,CODE,READONLY;声明代码段 Example4 ENTRY;CODE32 ;声明32位ARM指令START MOV R1,#3;初始化y的值MOV R2,#2;初始化key的值CMP R0,R1;判断a==bMOVEQ R2,#100;MOVHE R2,#50;思考题3:for结构;for(x=0;i=5;i>0;i--);{;x=x+i;;};设x为R0,i为R2(i,x均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#0;初始化x的值MOV R2,#5;初始化iFOR_L1 CMP R2,#0;i>0?BLS FOR_END;ADD R0,R0,R2;SUB R2,R2,#1;B FOR_L1FOR_END NOP思考题3:while()结构;x=0;y=0;;while(x<10);{; y=y+x;; x++;;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#0;MOV R1,#0;B WHILE_L1;⾸先要盘判断条件WHILE_L1 ADD R1,R0,R1;ADD R0,R0,#1;WHILE_L2 CMP R0,#10;BLO WHILE_L1;WHILE_END NOP;思考题3:swith()结构;x=1;;switch(x){; case0:y=0;break;; case1:y=1;break;; case2:y=2;break;; default:y=3;break;;};设x为R0,y为R1(x,y均为⽆符号整数)AREA Example4,CODE,READONLY;声明代码段 Example4ENTRY;CODE32 ;声明32位ARM指令START MOV R0,#1;SWITCHCASE_0 CMP R0,#0;ENE CASE_1MOV R1,#0;B SWITCH_ENDCASE_1 CMP R0,#1;BNE CASE_2MOV R1,#1;B SWITCH_ENDCASE_2 CMPNE R0,#2;BNE DEFAULTMOV R1,#2;B SWITCH_ENDDEFAULT MOV R1,#3;SWITCH_END实验五;定义堆栈的⼤⼩USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0AREA Example5,CODE,READONLY ; 声明代码段Example5ENTRY ; 标识程序⼊⼝CODE32 ; 声明32位ARM指令START MOV R0,#0MOV R1,#1MOV R2,#2MOV R3,#3MOV R4,#4MOV R5,#5MOV R6,#6MOV R7,#7MOV R8,#8MOV R9,#9MOV R10,#10MOV R11,#11MOV R12,#12BL InitStack ; 初始化各模式下的堆栈指针; 打开IRQ中断 (将CPSR寄存器的I位清零)MRS R0,CPSR ; R0 <= CPSRBIC R0,R0,#0x80MSR CPSR_cxsf,R0 ; CPSR <= R0; 切换到⽤户模式MSR CPSR_c, #0xd0MRS R0,CPSR; 切换到管理模式MSR CPSR_c, #0xdfMRS R0,CPSRHALT B HALT; 名称:InitStack; 功能:堆栈初始化,即初始化各模式下的堆栈指针。
《嵌入式系统原理与应用》实验报告实验序号:01 实验项目名称:汇编指令实验1学号姓名专业、班实验地点指导教师实验时间一、实验目的1.了解ADS 1.2 集成开发环境及ARMulator 软件仿真;2.掌握ARM7TDMI 汇编指令的用法,并能编写简单的汇编程序;3. 掌握 ARM 数据处理指令的使用方法;4. 了解 ARM 指令灵活的第 2 个操作数。
二、实验设备(环境)及要求硬件:PC机;软件:PC机操作系统windows XP,ADS1.2集成开发环境。
三、实验内容与步骤1. 建立一个新的工程;2. 建立一个S 源文件,将该文件添加到工程中。
该程序可实现1+ (100)计算,并将结果写回到内存中;3. 设置编译连接控制选项;4. 编译连接工程。
5. 使用ADS 1.2 软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor Registers)监视R0、R1 等寄存器的值,四、实验结果与数据处理截图:汇编代码:AREA Example1,CODE,READONLY;ENTRY;CODE32;START MOV R0,#0;MOV R1,#0;MOV R2,#1;MOV R3,#0x40000000;LOOPCMP R1,#100;ADDLS R1,R1,R2;ADD R0,R0,#1;CMP R1,#100BLS LOOP;STR R0,[R3];END五、分析与讨论1、指令MOV R0,#0x12345678 是否正确?为什么?2、本题实现的方法有很多种,请给出其他的实现方式。
六、教师评语成绩签名:日期:。
《嵌入式系统原理及应用》作业题目作业1一、调试下面的程序,并回答问题。
.global _start.text_start:LDR SP, =srcLDMFD SP!,{R0-R6}STMFD SP!,{R0-R6}LDMFD SP!,{R3}LDMFD SP!,{R4}LDMFD SP!,{R5}LDMFD SP!,{R6}LDMFD SP!,{R0}LDMFD SP!,{R1}LDMFD SP!,{R2}stop: b stop.ltorgsrc:.long 1,2,3,4,5,6,7.end问:该程序完成了什么功能?答:该程序完成的功能:先把数据区堆栈中的1~7这七个数据送给R0~R0寄存器,然后又把寄存器列表中的R0~R7存入堆栈,然后又依次把堆栈中的1~7这七个数送给R3~R6,R0~R2,然后程序就结束了,在取数和存数的过程中。
堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4 。
二、LDMFD,STMFD伪代码实现的原理。
答:指令STMFD和LDMFD分析:根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:STMFD指令的寻址方式为事后递减方式(DB)而DB寻址方式实际内存地址为:start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4) end_address = Rn - 4STM指令操作的伪代码:if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Memory[address] = Riaddress = address + 4有上面两个伪代码可以得出 STMFD SP!,{R0-R7,LR} 的伪代码如下: SP = SP -9×4;address = SP;for i = 0 to 7Memory[address] = Ri;address = address + 4;Memory[address] = LR;LDMFD指令的寻址方式为事后递增方式(IA)IA内存的实际地址的伪代码start_address = Rnend_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4 LDM指令操作的伪代码(未考虑PC寄存器):if ConditionPassed(cond) thenaddress = start_addressfor i = 0 to 15if register_list[i] == 1Ri = Memory[address,4]address = address + 4所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是: address = SP;for i = 0 to 7Ri = Memory[address ,4]address = address + 4;SP = address;作业2一、用移位操作完成(R0)*10运算。
参考程序:.text.global _start_start:mov R0,#10mov R1,R0,LSL #3mov R2,R0,LSL #1add R3,R1,R2stop:B stop.end二、已知数据缓冲池中有两组数据x和y,每组中有3个数据(例如x: 90,60,30,y: 60,40,20),将x中的数据减去y中的数据,最后将两组数相减得到的结果送回到x中去!参考代码:.text.global _start_start:LDR SP,=xLDMFD SP!,{R0-R2}LDMFD SP!,{R3-R5}sub R2,R2,R5Sub R1,R1,R4Sub R0,R0,R3STMFD SP!,{R0-R2}stop:b stop.ltorgx: .long 80,90,100y: .long 10,20,30.end作业3已知R0和R1的值,要求保留R0的低16位,保留R1的高16位状态,最后将这两个值组成一个新的数送给R3.参考代码:.text.global _startLDR R0,=0x12345678LDR R1,=0x87654321ldr R2,=0xffffLDR R4,=0xffff0000AND R0,R0,R2AND R1,R1,R4ORR R3,R0,R1stop: B stop.end作业4在ARM GNU环境下用ARM汇编语言编程序实现,00,0,0x xy x xx x>⎧⎪===⎨⎪-<⎩参考代码:.text.global _start_start:LDR R0,=xLDR R1,=yLDR R2,[R0]CMP R2,#0BEQ ZEROBGT ZHENGBLT FUZERO:MOV R3,#0STR R3,[R1]B stopZHENG:mov R3,R2STR R3,[R1]B stopmvn R3,R2mov R4,#0x1add R3,R3,R4STR R3,[R1]B stopstop:B stop.ltorgx: .long -10y: .long 0作业5求20的阶乘:64位结果放在【R9:R8】中,R9放高32位,R放低32位思路:每轮乘法操作中,低32位(R8)乘以X(R0)后,结果的低32位放在R8中,高32位放在R9中;高32位R1乘以X(R0)后再加上R9,得到64位结果的高32位,存入R9参考程序:.global _start.text_start:MOV R8 , #20 @低32位初始化为20MOV R9 , #0 @高位初始化为0SUB R0,R8,#1 @初始化计数器Loop:MOV R1 , R9 @暂存高位值UMULL R8 , R9 , R0 , R8 @[R9:R8]=R0*R8MLA R9 , R1 , R0 , R9 @R9=R1*R0+R9SUBS R0 , R0 , #1 @计数器递减BNE Loop @计数器不为0继续循环Stop:B stop.end二、已知a=R0,b=R1.while(a< >b) doif(a>b) thena=a-belsea=b-aend ifend whileresult=a根据以上代码写出对应的汇编代码:参考代码:CMP R0,R1CMPNE R0,R1SubGT R0,R0,R1SubLT R0,R1,R0.end作业61.将下面的ADS环境下的程序代码改写成GUN环境下的程序代码。
(调试时使用F11 step into,注意和F10 step over的区别)AREA Jump, CODE, READONL Ynum EQU 4 ; 函数地址表内容的个数ENTRYCODE32startLDR R0, =choice ; R0指向存储区的choice单元LDR R0, [R0] ; 设置第一个参数:选择执行哪一个函数MOV R1, #16 ; 设置第1个操作数MOV R2, #2 ; 设置第2个操作数BL arithfunc ; 调用子程序arithfuncstopMOV R0, #0x18 ; 程序结束返回编译器调试环境LDR R1, =0x20026SWI 0x123456arithfuncCMP R0, #num ; 比较R0的值是否超过函数地址表的个数MOVHS PC, LR ; 如果大于,那么就返回到标号stop处ADR R3, JumpTable ; 将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL #2] ; 根据R0参数进入对应的子程序JumpTable ; 函数地址表的入口基地址DCD DoAdd ; 加法子程序DCD DoSub ; 减法子程序DCD DoMul ; 乘法子程序DCD DoDiv ; 除法子程序DoAddADD R0, R1, R2 ; R0 = R1 + R2MOV PC, LR ; 返回DoSubSUB R0, R1, R2 ; R0 = R1 - R2MOV PC, LR ; 返回DoMulMOV R0, R1, LSL R2 ; R0 = R1 << R2MOV PC, LR ; 返回DoDivMOV R0, R1, LSR R2 ; R0 = R1 >> R2MOV PC, LR ; 返回AREA NUM, DA TA, READWRITEchoice DCD 3 ; 0:表示选择加法子程序1:表示选择减法子程序; 2:表示选择乘法子程序3:表示选择除法子程序END参考程序:.equ num,4 @ 函数地址表内容的个数.text.global _start_start:LDR R0,=choice @R0指向存储区的choice单元LDR R0,[R0] @设置第一个参数:选择执行哪一个函数MOV R1,#16 @设置第1个操作数MOV R2,#2 @设置第2个操作数Bl arithfunc @调用子程序arithfuncstop:b stoparithfunc:CMP R0,#num @比较R0的值是否超过函数地址表的个数MOVHS PC, LR @如果大于,那么就返回到标号stop处ADR R3, JumpTable @将函数地址表的地址作为基地址LDR PC, [R3, R0, LSL#2] @根据R0参数进入对应的子程序JumpTable: @函数地址表的入口基地址.long DoAdd @加法子程序.long DoSub @减法子程序.long DoMul @乘法子程序.long DoDiv @除法子程序DoAdd:ADD R0, R1, R2 @R0 = R1 + R2MOV PC, LR @返回DoSub:SUB R0, R1, R2 @R0 = R1 - R2MOV PC, LR @返回DoMul:MOV R0, R1, LSL R2 @R0 = R1 << R2MOV PC, LR @返回DoDiv:MOV R0, R1, LSR R2 @R0 = R1 >> R2MOV PC, LR @返回.ltorgchoice: .long 3 @0:表示选择加法子程序@1:表示选择减法子程序@2:表示选择乘法子程序@:表示选择除法子程序.end2.改写以下程序,实现从ARM状态切换到thumb状态,最后再切换到ARM状态!#*******************************************************************************************# NAME: ThumbCode.s *# Author: Embest *# Desc: ThumbCode examples *# History: shw.He 2005.02.22 *#*********************************************************************************************/*-----------------------------------------------------------------------------------------------------------*//* constant define *//*-----------------------------------------------------------------------------------------------------------*/.global _start/*-----------------------------------------------------------------------------------------------------------*//* unable to locate source file. code *//*-----------------------------------------------------------------------------------------------------------*/.text_start:.arm /* Subsequent instructions are ARM */header:adr r0, Tstart + 1 /* Processor starts in ARM state, */bx r0 /* so small ARM code header used *//* to call Thumb main program. */ nop.thumbTstart:mov r0, #10 /* Set up parameters */mov r1, #3bl doadd /* Call subroutine */stop:b stop/*------------------------------------------------------------------------------------------*//* Subroutine code:R0 = R0 + R1 and return *//*------------------------------------------------------------------------------------------*/doadd:add r0, r0, r1 /* Subroutine code */mov pc, lr /* Return from subroutine. */.end /* Mark end of file */参考程序:.global _start.text_start:mov r3,#0.armheader:adr r0,Tstart + 1add r3,r3,#1 //设置循环标志,便于从thumb切换到arm后能停止程序cmp r3,#2Beq stopbx r0stop:b stop.thumbTstart:LDR r2,=headermov r0, #10mov r1, #3bl doaddbx r2doadd:add r0, r0, r1mov pc, lr.end作业7已知1,00,01,0xy xx>⎧⎪==⎨⎪-<⎩,若任意给一个定值,假定为-25,存放在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。