嵌入式系统编程题汇编教学内容.docx
《嵌入式系统编程题汇编教学内容.docx》由会员分享,可在线阅读,更多相关《嵌入式系统编程题汇编教学内容.docx(14页珍藏版)》请在冰豆网上搜索。
![嵌入式系统编程题汇编教学内容.docx](https://file1.bdocx.com/fileroot1/2022-10/9/aba30fe8-a4ec-43d4-97d1-2fb48a5cf978/aba30fe8-a4ec-43d4-97d1-2fb48a5cf9781.gif)
嵌入式系统编程题汇编教学内容
嵌入式系统编程题汇编(带答案)
.一。
从一数到十
COUNTEQU0x30003100;定义变量COUNT的基地址
AREAExample1,CODE,READONLY;声明代码段Example1为只读
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTLDRR1,=COUNT;将0X30003100赋给R1
MOVR0,#0;执行R0=0
STRR0,[R1];存储R0寄存器的数据到R1指向的存储单元
LOOPLDRR1,=COUNT;将0X30003100赋给R1
LDRR0,[R1];将R1中的数值作为地址,取出此地址中的数据保存到R0中
ADDR0,R0,#1;执行R0=R0+1
CMPR0,#10;将R0与10进行比较
MOVHSR0,#0;若R0大于等于10,则R0=0
STRR0,[R1];存储R0寄存器的数据到R1指向的地址单元
BLOOP;跳转到LOOP
END;汇编文件结束
二,9的8次幂
XEQU9;初始化X为9
nEQU8;初始化N为8
AREAExample3,CODE,READONLY;生明代码段Example3为只读
ENTRY;标识程序入口路
CODE32;声明32位ARM指令
STARTLDRSP,=0x30003F00;把0x30003F00赋给SP(R13)
LDRR0,=X;把9赋给R0
LDRR1,=n;把8赋给R1
BLPOW;跳转到POW,并把下一条指令地址存入到R14中
HALTBHALT;等待跳转
POWSTMFDSP!
{R1-R12,LR};将R1-R12入栈,满递减堆栈
MOVSR2,R1;将R1赋给R2,并影响标志位
MOVEQR0,#1;若Z=1,则R0=1
BEQPOW_END;若Z=1,跳转到POW_END
MOVR1,R0;将R0中值赋给R1
SUBR2,R2,#1;将R2-1的只赋给R2
POW_L1BLDO_MUL;跳转到DO-MUL,并把下一条指令地址存入R14中
SUBSR2,R2,#1;将R2-1的值赋给R2,并影响标志位
BNEPOW_L1;若Z=0,跳转到POW_L1
POW_ENDLDMFDSP!
{R1-R12,PC};数据出栈,存入到R1-R12,PC中
DO_MULMULR0,R1,R0;把R1*R0的值赋给R0
MOVPC,LR;LR中的值赋给PC
END;汇编结束
三:
从一一直加到一百
程序清单
(一)C语言实验参考程序
#defineuint8unsignedchar;定义一个无符号字符常量uint8
#defineuint32unsignedint;定义一个无符号整形常量unint32
#defineN100;定义一个常量N=100(宏定义,100用N代替)
uint32sum;;定义sum为无符号整型常量(声明一个unsignedint型的变量sum)
voidMain(void);主函数
{uint32i;;定义无符号整型常量i(声明一个unsignedint型的变量i)
sum=0;;sum初始值为0
for(i=0;i<=N;i++);i在N内自增加1(i从0开始,i<=N时循环成立)
{sum+=i;};把sum+i赋给sum
while
(1);;为真循环
}
程序清单
(二)简单的启动代码
IMPORT|Image$$RO$$Limit|;R0输出段存储区域界限
IMPORT|Image$$RW$$Base|;RW输出段运行时起始地址
IMPORT|Image$$ZI$$Base|;ZI输出段运行时起始地址
IMPORT|Image$$ZI$$Limit|;ZI输出段存储区域界限
IMPORTMain;主函数
AREAStart,CODE,READONLY;声明代码段start,为只读
ENTRY;程序入口
CODE32;声明32位ARM指令
ResetLDRSP,=0x40003f00;将0x40003f00赋给SP
LDRR0,=|Image$$RO$$Limit|;将R0输出段存储区域界限赋给R0
LDRR1,=|Image$$RW$$Base|;将RW输出段运行时起始地址赋给R1
LDRR3,=|Image$$ZI$$Base|;将ZI输出段运行时起始地址赋给R3
CMPR0,R1;比较R0和R1,相等Z=1,反之Z=0
BEQLOOP1;若Z=1,则跳到LOOP1
LOOP0CMPR1,R3;比较R1和R3,若R1LDRCCR2,[R0],#4;若C=0,读取R0地址单元内容并且存入R2,且R0=R0+4
STRCCR2,[R1],#4;若C=0,读取R2中的数据存入R1,且R1=R1+4
BCCLOOP0;若C=0,跳转到LOOP0
LOOP1LDRR1,=|Image$$ZI$$Limit|;将ZI输出段存储区域赋给R1
MOVR2,#0;把0赋给R2
LOOP2CMPR3,R1;比较R1和R3,若R1STRCCR2,[R3],#4;若C=0,将R2中数据保存到内存单元R3中,且R3=R3+4
BCCLOOP2;若C=0,跳转到LOOP2
BMain;跳转到主程序
END;汇编结束
实验四
程序清单
(一)C语言调用汇编的参考程序
#defineuint8unsignedchar;定义一个无符号字符常量uint8
#defineuint32unsignedint;定义一个无符号整型常量.uint32
externuint32Add(uint32x,uint32y);//声明子程序Add为一个无符号整型常量,它为2个无符号整型常量x,y的和
uint32sum;;定义sum为无符号整型常量
voidMain(void);无返回主程序
{sum=Add(555,168);;sum等于555+168
while
(1);;为真循环
}
程序清单
(二)汇编加法函数程序
EXPORTAdd;声明子程序Add方便调用
AREAStart,CODE,READONLY;声明代码段start,为只读
ENTRY;程序入口
CODE32;声明32位ARM指令
AddADDR0,R0,R1;将R0+R1值赋给R0
MOVPC,LR;将LR值赋给PC
END;汇编结束
14、设计编程:
LPC2131的P0.7引脚连接了一个蜂鸣器,编程发出等周期的滴滴声。
答:
#define
VoidDelayNS(intm)
{inti;
for(;m>0;m--)
for(i=0;i<50000;i++)
}
main()
{
PINSEL0=0x00000000;
IO0DIR=1<<7;
while
(1)
{
IO0SET=1<<7;
DelayNS(50);
IO0CLR=1<<7;
DelayNS(50);
}
}
15、设计编程:
LPC2131的P0[1:
0]两引脚分别连接了2个按键K1和K4;P0[7:
6]两引脚分别连接了2个指示灯LED1和LED2;请编制驱动程序,使Kx按键时,LEDx灯亮。
答:
#definek11<<0
#definek21<<1
#defineLED11<<7
#defineLED21<<8
main()
{
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(3<<10))|(2<<10);
T0CTCR=0x00;
T0TC=0;
T0PR=99;
T0MCR=0x02<<3;
T0MR1=Fpclk/100;
T0EMR|=0xc2;
T0TCR=0x01;
While
(1);
}
17、使用学过的知识设计设计一个汽车用“车速表”,写出你的设计方案并编程实现。
提示:
可用霍尔元件将车轮的转动转换为脉冲。
车轮每转动一圈会产生一个方波脉冲。
答:
转动脉冲:
void__irqIRQ_Timer0(void)
{
if((IO0SET&BEEP)==0)
IO0SET=BEEP;/*关闭BEEP*/
else
IO0CLR=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;/*设置中断服务程序地址*/
VICIntEnable=1<<0x04;/*使能定时器0中断*/
while
(1){
if((IO0PIN&KEY1)==0){
spped=10;
T0MR0=Fpclk/spped;/*0