您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 嵌入式系统-编程题汇编
1嵌入式系统编程题汇编(带答案).一。从一数到十COUNTEQU0x30003100;定义变量COUNT的基地址AREAExample1,CODE,READONLY;声明代码段Example1为只读ENTRY;标识程序入口CODE32;声明32位ARM指令STARTLDRR1,=COUNT;将0X30003100赋给R1MOVR0,#0;执行R0=0STRR0,[R1];存储R0寄存器的数据到R1指向的存储单元LOOPLDRR1,=COUNT;将0X30003100赋给R1LDRR0,[R1];将R1中的数值作为地址,取出此地址中的数据保存到R0中ADDR0,R0,#1;执行R0=R0+1CMPR0,#10;将R0与10进行比较MOVHSR0,#0;若R0大于等于10,则R0=0STRR0,[R1];存储R0寄存器的数据到R1指向的地址单元BLOOP;跳转到LOOPEND;汇编文件结束二,9的8次幂XEQU9;初始化X为9nEQU8;初始化N为8AREAExample3,CODE,READONLY;生明代码段Example3为只读ENTRY;标识程序入口路CODE32;声明32位ARM指令STARTLDRSP,=0x30003F00;把0x30003F00赋给SP(R13)LDRR0,=X;把9赋给R0LDRR1,=n;把8赋给R1BLPOW;跳转到POW,并把下一条指令地址存入到R14中2HALTBHALT;等待跳转POWSTMFDSP!,{R1-R12,LR};将R1-R12入栈,满递减堆栈MOVSR2,R1;将R1赋给R2,并影响标志位MOVEQR0,#1;若Z=1,则R0=1BEQPOW_END;若Z=1,跳转到POW_ENDMOVR1,R0;将R0中值赋给R1SUBR2,R2,#1;将R2-1的只赋给R2POW_L1BLDO_MUL;跳转到DO-MUL,并把下一条指令地址存入R14中SUBSR2,R2,#1;将R2-1的值赋给R2,并影响标志位BNEPOW_L1;若Z=0,跳转到POW_L1POW_ENDLDMFDSP!,{R1-R12,PC};数据出栈,存入到R1-R12,PC中DO_MULMULR0,R1,R0;把R1*R0的值赋给R0MOVPC,LR;LR中的值赋给PCEND;汇编结束三:从一一直加到一百程序清单(一)C语言实验参考程序#defineuint8unsignedchar;定义一个无符号字符常量uint8#defineuint32unsignedint;定义一个无符号整形常量unint32#defineN100;定义一个常量N=100(宏定义,100用N代替)uint32sum;;定义sum为无符号整型常量(声明一个unsignedint型的变量sum)voidMain(void);主函数{uint32i;;定义无符号整型常量i(声明一个unsignedint型的变量i)sum=0;;sum初始值为0for(i=0;i=N;i++);i在N内自增加1(i从0开始,i=N时循环成立){sum+=i;};把sum+i赋给sumwhile(1);;为真循环}程序清单(二)简单的启动代码IMPORT|Image$$RO$$Limit|;R0输出段存储区域界限IMPORT|Image$$RW$$Base|;RW输出段运行时起始地址IMPORT|Image$$ZI$$Base|;ZI输出段运行时起始地址IMPORT|Image$$ZI$$Limit|;ZI输出段存储区域界限IMPORTMain;主函数3AREAStart,CODE,READONLY;声明代码段start,为只读ENTRY;程序入口CODE32;声明32位ARM指令ResetLDRSP,=0x40003f00;将0x40003f00赋给SPLDRR0,=|Image$$RO$$Limit|;将R0输出段存储区域界限赋给R0LDRR1,=|Image$$RW$$Base|;将RW输出段运行时起始地址赋给R1LDRR3,=|Image$$ZI$$Base|;将ZI输出段运行时起始地址赋给R3CMPR0,R1;比较R0和R1,相等Z=1,反之Z=0BEQLOOP1;若Z=1,则跳到LOOP1LOOP0CMPR1,R3;比较R1和R3,若R1R3,C=0LDRCCR2,[R0],#4;若C=0,读取R0地址单元内容并且存入R2,且R0=R0+4STRCCR2,[R1],#4;若C=0,读取R2中的数据存入R1,且R1=R1+4BCCLOOP0;若C=0,跳转到LOOP0LOOP1LDRR1,=|Image$$ZI$$Limit|;将ZI输出段存储区域赋给R1MOVR2,#0;把0赋给R2LOOP2CMPR3,R1;比较R1和R3,若R1R3,C=0STRCCR2,[R3],#4;若C=0,将R2中数据保存到内存单元R3中,且R3=R3+4BCCLOOP2;若C=0,跳转到LOOP2BMain;跳转到主程序END;汇编结束实验四程序清单(一)C语言调用汇编的参考程序#defineuint8unsignedchar;定义一个无符号字符常量uint8#defineuint32unsignedint;定义一个无符号整型常量.uint32externuint32Add(uint32x,uint32y);//声明子程序Add为一个无符号整型常量,它为2个无符号整型常量x,y的和uint32sum;;定义sum为无符号整型常量voidMain(void);无返回主程序{sum=Add(555,168);;sum等于555+168while(1);;为真循环}4程序清单(二)汇编加法函数程序EXPORTAdd;声明子程序Add方便调用AREAStart,CODE,READONLY;声明代码段start,为只读ENTRY;程序入口CODE32;声明32位ARM指令AddADDR0,R0,R1;将R0+R1值赋给R0MOVPC,LR;将LR值赋给PCEND;汇编结束14、设计编程:LPC2131的P0.7引脚连接了一个蜂鸣器,编程发出等周期的滴滴声。答:#defineVoidDelayNS(intm){inti;for(;m0;m--)for(i=0;i50000;i++)}main(){5PINSEL0=0x00000000;IO0DIR=17;while(1){IO0SET=17;DelayNS(50);IO0CLR=17;DelayNS(50);}}15、设计编程:LPC2131的P0[1:0]两引脚分别连接了2个按键K1和K4;P0[7:6]两引脚分别连接了2个指示灯LED1和LED2;请编制驱动程序,使Kx按键时,LEDx灯亮。答:#definek110#definek211#defineLED117#defineLED218main(){PINSEL0=0x00000000;IO0DIR=IO0DIR&(~k1);IO0DIR=IO0DIR&(~k2);IO0DIR=IO0DIR|LED1;IO0DIR=IO0DIR|LED2;IO0CLR=IO0CLR|LED1|LED2;While(1){If((IO0PIN&k1)==0)IO0SET=LED1;elseIO0SET=LED1;If((IO0PIN&k2)==0)IO0SET=LED2;elseIO0SET=LED2;}}16、ARM芯片中定时器结构原理如下图,试设计一个周期为2秒的方波发生器。(假设该系统的外围设备时钟频率Fpclk=10MHz)答:intmian{PINSEL0=PINSEL0&(1(310))|(210);6T0CTCR=0x00;T0TC=0;T0PR=99;T0MCR=0x023;T0MR1=Fpclk/100;T0EMR|=0xc2;T0TCR=0x01;While(1);}17、使用学过的知识设计设计一个汽车用“车速表”,写出你的设计方案并编程实现。提示:可用霍尔元件将车轮的转动转换为脉冲。车轮每转动一圈会产生一个方波脉冲。答:转动脉冲:void__irqIRQ_Timer0(void){if((IO0SET&BEEP)==0)IO0SET=BEEP;/*关闭BEEP*/elseIO0CLR=BEEP;T0IR=0x01;/*清除中断标志*/VICVectAddr=0x00;/*通知VIC中断处理结束*/}intmain(void){intspped=1;PINSEL1=0x00000000;/*设置管脚连接GPIO*/IO0DIR=BEEP;/*设置BEEP控制口输出*/IRQEnable();/*IRQ中断使能*//*定时器0初始化*/T0TC=0;/*定时器设置为0*/T0PR=0;/*时钟不分频*/T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TCR=0x01;/*启动定时器*//*设置定时器0中断IRQ*/VICIntSelect=0x00;/*所有中断通道设置为IRQ中断*/VICVectCntl0=0x20|0x04;/*设置定时器0中断通道分配最高优先级*/VICVectAddr0=(uint32)IRQ_Timer0;/*设置中断服务程序地址*/7VICIntEnable=10x04;/*使能定时器0中断*/while(1){if((IO0PIN&KEY1)==0){spped=10;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY2)==0){spped=20;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY3)==0){spped=30;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY4)==0){spped=40;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}};return0;}汽车车速:intmain(void){intVx;PINSEL0=(PINSEL0&(~(320)))|(220);PINSEL0=PINSEL0&(024);T0CTCR&=0xf0;T0TC=0;T0PR=99;T0MCR=0x03;T0MR0=Fpclk/300;T1CTCR=(T1CTCR&(~0x0f)|0xf1);T1TC=0;T1MCR=0x00;T1CCR&=~0x07;T0TCR=0x01;8T1TCR=0x01;while(1){if((T0IR&0x01)==1){T0IR=0x01;Vx=T1TC;T1TC=0;VtotalLen+=Vx;VthisLen+=Vx;Vspeed=(Vx*L*3.6)/HrN;}if((IO0PIN&KClr)==0)VthisLen=0;}return0;}1、编写一程序,用查询的方式,对S3C2410的A/D转换器的第3通道连续进行100次A/D转换,然后将其结果求平均值。设预分频为49。注意:A/D转换器有独立的模拟信号输入引脚AIN0---AIN9。ADCCON格式如下:151413……6543210ECFLGPRSCENPRSCVLSEL_MUXSTDBMREAD_STARTENABLE_STARTADCDAT0格式如下:1514131211109……0UPDOWNAUTO_PSTXY_PST保留(0)转换结果ADCCON、ADCDAT0的地址宏定义为:#definerADCCON(*(volatileunsigned*)0x58000000)#definerADCDAT0(*(volatileunsigned*)0x5800000c)#de
本文标题:嵌入式系统-编程题汇编
链接地址:https://www.777doc.com/doc-8567306 .html