嵌入式系统编程题汇编.docx
- 文档编号:29298128
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:19
- 大小:37.15KB
嵌入式系统编程题汇编.docx
《嵌入式系统编程题汇编.docx》由会员分享,可在线阅读,更多相关《嵌入式系统编程题汇编.docx(19页珍藏版)》请在冰豆网上搜索。
嵌入式系统编程题汇编
嵌入式系统编程题汇编(带答案)
。
从一数到十
COUNT
EQU0x30003100
;定义变量C0UNT的基地址
AREAExample1,C0DE,READ0NLY;声明代码段Examplel为只读
ENTRY
;标识程序入口
C0DE32
;声明32位ARM指令
START
LDRR1,=C0UNT
;将0X30003100赋给R1
M0VR0,#0
;执行R0=0
STRR0,[R1]
;存储R0寄存器的数据到
R1指向的存
储单元
LOOP
LDRR1,=C0UNT
;将0X30003100赋给R1
LDRR0,[R1]
;将R1中的数值作为地址,取出此地址中的数据保存
到R0中
ADDR0,R0,#1
;执行R0=R0+1
CMPR0,#10
;将RO与10进行比较
M0VHSR0,#0
;若R0大于等于10,则
R0=0
STRR0,[R1]
;存储R0寄存器的数据到
R1指向的地
址单元
BL00P
;跳转到L00P
END
;汇编文件结束
;初始化X为9
;初始化N为8
,9的8次幂
XEQU9
nEQU8
AREAExample3,CODE,READONLY;生明代码段Example3为只读ENTRY;标识程序入口路
CODE32;声明32位ARM指令
START
(R13)
LDRSP,=0x30003F00
;把0x30003F00赋给SP
;把9赋给R0
;把8赋给R1
;跳转到POW,并把下一条指令地址存入到
LDRR0,=X
LDRR1,=n
BLPOW
R14中
HALT
B
HALT
POW
STMFD
SP!
{R1-R12,LR}
MOVSR2,R1MOVEQR0,#1BEQPOW_ENDMOVR1,R0
SUBR2,R2,#1POW_L1BLDO_MULR14中
SUBSR2,R2,#1位
;等待跳转
;将R1-R12入栈,满递减堆栈
將R1赋给R2,并影响标志位
若Z=1,则R0=1
;若Z=1,跳转到POW_END
;将R0中值赋给R1
;将R2-1的只赋给R2
;跳转到DO-MUL,并把下一条指令地址存入
;将R2-1的值赋给R2,并影响标志
BNE
POW_ENDLDMFD
DO_MULMUL
MOV
POW_L1
SP!
{R1-R12,PC}R0,R1,R0
PC,LR
END
:
从一一直加到一百
;若Z=0,跳转到POW_L1
;数据出栈,存入到R1-R12,PC中
;把R1*R0的值赋给R0
;LR中的值赋给PC
;汇编结束
#define
#define
#define
uint32
程序清单
(一)C语言实验参考程序
uint8
uint32
sum;
unsignedchar
unsignedint
100
;定义一个无符号字符常量uint8;定义一个无符号整形常量unint32
;定义一个常量N=100(宏定义,100用N代替)
voidMain(void)
{uint32i;
sum=0;
for(i=0;i<=N;i++)
{sum+=i;}
while
(1);
;定义sum为无符号整型常量(声明一个unsignedint型的变量sum)
;主函数
;定义无符号整型常量i(声明一个unsignedint型的变量i)
;sum初始值为0
;i在N内自增加1(i从0开始,i<=N时循环成立)
;把sum+i赋给sum
;为真循环
IMPORT
|Image$$RO$$Limit|
IMPORT
|Image$$RW$$Base|
IMPORT
|Image$$ZI$$Base|
IMPORT
|Image$$ZI$$Limit|
IMPORT
Main
程序清单
(二)简单的启动代码
;R0输出段存储区域界限;RW输出段运行时起始地址;ZI输出段运行时起始地址;ZI输出段存储区域界限;主函数
AREA
ENTRY
CODE32
Start,CODE,READONLY
;声明代码段start,为只读
;程序入口
;声明32位ARM指令
Reset
LDR
SP,=0x40003f00
;将0x40003f00赋给SP
LDR
RO,=|lmage$$RO$$Limit|;将RO输出段存储区域界限赋给R0
LDR
R1,=|lmage$$RW$$Base|;将RW输出段运行时起始地址赋给R1
LDR
R3,=|lmage$$ZI$$Base|;将ZI输出段运行时起始地址赋给R3
CMP
RO,R1
;比较R0和R1,相等Z=1,反之Z=0
BEQ
LOOP1
;若Z=1,则跳到LOOP1
LOOP0
CMP
R1,R3
;比较R1和R3,若R1 LDRCCR2,[R0],#4 ;若C=0,读取R0地址单元内容并且存入R2,且 R0=R0+4 STRCCR2,[R1],#4 ;若C=O,读取R2中的数据存入R1,且 R1=R1+4 BCC LOOPO ;若C=0,跳转到LOOP0 LOOP1 LDR R1,=|Image$$ZI$$Limit|;将ZI输出段存储区域赋给R1 MOV R2,#O ;把0赋给R2 LOOP2 CMP R3,R1 ;比较R1和R3,若R1 STRCCR2,[R3],#4 ;若C=0,将R2中数据保存到内存单兀R3中,且 R3=R3+4 BCC LOOP2 ;若C=0,跳转到LOOP2 B Main ;跳转到主程序 END ;汇编结束 #define uint8 unsignedchar #define uint32 unsignedint extern uint32 Add(uint32x,uint32y) ;定义一个无符号字符常量uint8 ;定义一个无符号整型常量.uint32 ;//声明子程序Add为一个无符号整型常量,它 实验四 程序清单(一 )C语言调用汇编的参考程序 程序清单 (二)汇编加法函数程序 EXPORT Add ;声明子程序Add方便调用 AREA Start,CODE,READONLY ;声明代码段start,为只读 ENTRY ;程序入口 CODE32 ;声明32位ARM指令 AddADD R0,R0,R1 ;将R0+R1值赋给R0 MOV PC,LR ;将LR值赋给PC END ;汇编结束 指令条件码列表 条件码助记符 标志 含义 Z=l 柑等 NE z=o 不相爭 CS/HS C=1 无符号毅大于成等于 CC/LO c=c 无符号甦小于 MI N=1 负数 PL E 正数或零 VS V=1 溢出 VC v=o 没有溢出 HI C=l*z=o 无符号数大于 LS C=0rZ=1 无符号甦小于或等于 GE 带符号数大于或等于 LT K! =V 带符号数小于 GT Z=0ts=v 带符号独大于 LE 带符号数小于或等于 AL 任何 无条件执行(指令默认条件) 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*/ IOODIR=BEEP;/*设置BEEP空制口输出*/ IRQEnable();/*IRQ中断使能*/ /*定时器O初始化*/ TOTC=O;/*定时器设置为O*/ TOPR=O;/*时钟不分频*/ TOMCR=0x03;/*设置T0MR匹配后复位TOTC,并产生中断标志*/ TOMRO=Fpclk/spped;/*O.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.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&(~(3<<20)))|(2<20); PINSEL0=PINSEL0&(0<<24); T0CTCR&=0xf0;T0TC=0; T0PR=99; T0MCR=0x03; T0MR0=Fpclk/300; T1CTCR=(T1CTCR&(~0x0f)|0xf1);T1TC=0; T1MCR=0x00; T1CCR&=~0x07; T0TCR=0x01; T1TCR=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。 ADCCO格式如下: 151413……6543210 ECFLGPRSCENPRSCVLSEL_MUXSTDBMREAD_STARETNABLE_START ADCDAT格式如下: 1514131211109……0 UPDOW! AUTO_PSTXY_PST保留(0)转换结果 ADCCONADCDAT的地址宏定义为: #definerADCCON #definerADCDAT0 #definepref #definech (*(volatileunsigned*)0x58000000) (*(volatileunsigned*)0x5800000c) 49 3 intadc(void) //允许预分频,启动转换 //查询是否已经启动转换 //查询转换是否结束 //读取转换结果 ,adc_data); {rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1; while(rADCCON&0x01==1);while(rADCCON&0x8000==0);returnrADCDAT0&0x3ff; } voidmain() {intadc_data=0,i;for(i=0;i<100;i++)adc_data+=adc(); adc_data=adc_data/100;printf("adcaverageis: %d\n" 1、编写程序,将存储器从0x400000开始的200个字数据,传送到0x400600开始的区域。 解: MOVR0,#0x400000 LDRR1,=0x400600 MOVR7,#200 LP: LDRR2,[R0],#4 STRR2,[R1],#4 SUBSR7,R7,#1 BNELP HEREBHERE 2、编写一程序,查找存储器从0x500000开始的200个字中为5的数目,将其结果存到0x600000中。 解: MOVR0,#0x500000 M0VR1,#0 MOVR7,#200 LPLDRR2,[R0],#4 CMRR2,#5 BNENEXT ADDR1,R1,#1 NEXTSUBSR7,R7,#1 BNE_P MOVR0,#0x600000 STRR1,[R0] B$ 3、实现1+2+……+N。 NEQU5;;常量的定义 AREAExample,CODE,READONLY;定义段名属性等 ENTRY;程序入口 CODE32;ARM代码 START;行标定义 LDRR0,=N;R0赋值 MOVR2,R0;R2充当计数器 MOVR0,#0;R0J0 MOVR1,#0;R1J0 LOOP;行标 CMPR1,R2;比较R1R2 BHIADD_END;女口果R1>R2跳转至到ADD_END ;分支的实现 ADDR0,R0,R1;ROJR0+R1 ADDR1,R1,#1;R1JR1+1 BLOOP;无条件跳转至LOOP ;循环的实现 ADD_END;行标定义 BADD_END;无条件跳转ADD_END END;代码结束 以实验平台PXA270为设计环境,试写出一段代码,能控制八段数码管以递减方 式点亮显示(15分) #include #include"register_variant.h" #defineLED_CS2 (*((volatileunsignedshortint*)(0x10300000))) //LED1 andLED2 #defineLED_CS3 (*((volatileunsignedshortint*)(0x10400000))) //LED3 andLED4 voidDelay(unsignedintx){ unsignedinti,j,k; for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++);} voiddummyOs(void){ LED_CS2=0x2479; //12 LED_ _CS3=0x1930; //34 while (1){ Delay(300); LED_CS2= 0x3024; //23 LED_CS3= 0x1219; //45 Delay(300); LED_CS2= 0x1930; //34 LED_CS3= 0x0212; //56 Delay(300); LED_CS2= 0x1219; //45 LED_CS3= 0x7802; //67 Delay(300); LED_CS2= 0x0212; //56 LED_CS3= 0x0078; //78 Delay(300); LED_CS2= 0x7802; //67 LED_CS3= 0x1000; //89 Delay(300); LED_CS2=0x0078;//78 LED_CS3= 0x8f10; //90 Delay(300); LED_CS2= 0x1000; //89 LED_CS3= 0x8f8f; //00 Delay(300); LED_CS2= 0x8f10; //90 LED_CS3= 0x8f8f; //00 Delay(300); LED_CS2= 0x8f8f; //00 LED_CS3= 0x8f8f; //00 Delay(300); LED_CS2= 0x2479; //12 LED_CS3= 0x1930; //34}} 12/12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 编程 汇编