w90p710作业.docx
《w90p710作业.docx》由会员分享,可在线阅读,更多相关《w90p710作业.docx(16页珍藏版)》请在冰豆网上搜索。
w90p710作业
题目:
程序
1.
AREAT5_1,CODE;1+3+5....+99
ENTRY
start
MOVR2,#50;循环50次
MOVR1,#1;第一个数
MOVR0,#0;结果值
loop
ADDR0,R0,R1;R0=R0+R1,R1每次循环加2
ADDR1,R1,#2;R1每次循环加2
SUBSR2,R2,#1;R2是循环次数
BNEloop
END
2:
AREATEST_2,CODE
ENTRY
MOVR0,#0x400000
ADDR1,R0,#4
ADDR2,R0,#8
LDRR3,[R0]
LDRR4,[R1]
CMPR3,R4
MOVEQR5,#0
STREQR5,[R2]
MOVHIR5,#1
STRHIR5,[R2]
MOVCCR5,#-1
STRCCR5,[R2]
END
3:
:
AREATEST_3,CODE
ENTRY
MOVR0,#0x400000;
MOVR1,#0x480000;
MOVR2,#5;
loop
LDMIAR0!
{R3-R12};
STMIAR1!
{R3-R12};
SUBSR2,R2,#1;
BNEloop;
stop
Bstop;
END
4
(1):
:
AREATEST_4,CODE;取反,64位的数
ENTRY
MOVR0,#0x400000;
MOVR2,#8
loop
LDRBR1,[R0];
EORR1,R1,#0xFF;
STRBR1,[R0],#1
SUBSR2,R2,#1
BNEloop
stop
Bstop;
END
4
(2):
:
AREATEST_4_2,CODE;取64位的数的补码,方法是取反加1
ENTRY
MOVR0,#0x400000;
MOVR2,#0
ADDR3,R0,#8
loop
LDRBR1,[R0],#1;
EORR1,R1,#0xFF;
STRBR1,[R3,R2]
ADDR2,R2,#1
CMPR2,#8
BCCloop;R2<=8那么循环,表示进行八个字节的取反
LDMIAR3,{R4,R5};
ADDSR4,R4,#1;改变标志位
ADCR5,R5,#0
STMIAR3,{R4,R5}
stop
Bstop;
END
5:
:
AREAT5_5,CODE;取64位的数
ENTRY
MRSR0,CPSR
ORRR0,R0,#0x80
MSRCPSR_c,#0xD2
LDRSP,Stack_irq
MSRCPSR_c,R0
stop
Bstop;
Stack_irq
DCD0x40000000
END
;Initialisethesystemmemory
;Flash0~4M
;SDRAM4~20M
ADRLr0,Init_SystemMemory
LDMIAr0,{r1-r6}
LDRr0,=EBICON
STMIAr0,{r1-r6}
LDRr0,=0x0;thestartaddressofrom
LDRr1,=0x300000;thesizeofrom
LDRr2,=0x0800000;thestartaddressofsdram
Copy_Loop
LDRr3,[r0],#4
STRr3,[r2],#4
SUBSr1,r1,#4
BNECopy_Loop
;Remapthesystemmemory
;Flash16~20M
;SDRAM0~16M
ADRLr0,Remap_SystemMemory
LDMIAr0,{r1-r6}
LDRr0,=EBICON
STMIAr0,{r1-r6}
Init_SystemMemory
DCD0x000530C1
DCD0x00040084
DCD0x010090E4
DCD0x200090E4
DCD0x0000014B
DCD0x0000014B
Remap_SystemMemory
DCD0x000530C1
DCD0x10040084
DCD0x000090E4
DCD0x200090E4
DCD0x0000014B
DCD0x0000014B
END
________MAIN.S文件
AIC_MECREQU0xFFF82120
AIC_MDCREQU0xFFF82124
AIC_SCR2EQU0xFFF82008
EBICONEQU0xFFF01000;EBIcontrolregister
EBI_EXT0_VALUEEQU0x12478003
EBILED_ADDRESSEQU0x09200000
REG_EXT0CONEQU0xFFF01018
EXPORT_MAIN
AREAMAIN,CODE,READONLY
ENTRY
_MAIN
LDRR0,=AIC_SCR2
LDRR1,[R0]
BICR1,R1,#0xC0
ORRR1,R1,#0x80
BICR1,R1,#0x07
ORRR1,R1,#0x01
STRR1,[R0]
LDRR0,=AIC_MECR;
MOVR1,#0x04
STRR1,[R0]
LDRR0,=REG_EXT0CON
LDRR1,=EBI_EXT0_VALUE
STRR1,[R0]
MOVR1,#0x80
MOVR3,#8
loop
MVNR2,R1
LDRR0,=EBILED_ADDRESS
STRR2,[R0]
MOVR1,R1,LSR#1
SUBSR3,R3,#1
CMPR3,#0
MOVLER1,#0x80
MOVLER3,#8
MOVR2,#0x200000
delay
SUBSR2,R2,#1
BNEdelay
Bloop
MOVPC,LR;子程序返回
END
________nIRQ0_Handler.S文件
EXPORTnIRQ0_Handler
AREAirq_handler,CODE,READONLY;声明代码段Example1
ENTRY;标识程序入口
nIRQ0_Handler
LDRR0,=REG_EXT0CON
LDRR1,=EBI_EXT0_VALUE
STRR1,[R0]
MOVR1,#0x01
MOVR3,#1
loop
MVNR2,R1
LDRR0,=EBILED_ADDRESS
STRR2,[R0]
MOVR1,R1,LSL#1
ADDSR3,R3,#1
CMPR3,#8
BHIRETURN
MOVR2,#0x200000
delay
SUBSR2,R2,#1
BNEdelay
Bloop
RETURN
MOVPC,LR;子程序返回
⏹编写一段C语言源程序,通过外部中断nIRQ3控制LED1~LED8流水灯显示的流动方向。
当中断被触发时改变灯的流动方向.
#include
#include"wblib.h"
#include"irq_handler.h"
#include"main.h"
INT8roll_flag=0x00;
intmain(void){
INT16led_num=0;
Init_EBILED(0x0);
outpw(REG_AIC_SCR5,0x81);//中断控制寄存器设置,正边沿触发,优先级为1
outpw(REG_AIC_MECR,0x20);//使能相应的中断源
while
(1){
if(roll_flag==ROLL_LEFT)//LED向左滚动
{led_num++;
if(led_num>=8)led_num=0;
Set_EBILED((0x80>>led_num));//给LED发数据
Delay(1000000);
}
if(roll_flag==ROLL_RIGHT)//LED向右滚动
{led_num++;
if(led_num>=8)led_num=0;
Set_EBILED((0x01<Delay(1000000);
}}
return0;
}
/*irq_handler.c文件*/
externINT8roll_flag;
voidnIRQ3_Handler(void)
{
if(roll_flag==ROLL_LEFT)//LED向左滚动
roll_flag=ROLL_RIGHT;
else
roll_flag=ROLL_LEFT;
}
⏹1在AXDDebugger环境下利用CommandLineInterface命令行控制LED10、LED11亮灭.LED10接GPIO0,LED11接GPIO1
设定GPIO0和GPIO1引脚为输出模式,并使能内部上拉电阻
Debug>setmem0xFFF830040x30003,32
使GPIO0和GPIO1引脚输出电平为高。
此时,LED12、LED13应熄灭。
Debug>Setmem0xFFF830080x3,32
使GPIO0和GPIO1引脚输出电平为低。
此时,LED12、LED13应点亮。
Debug>Setmem0xFFF830080x0,32
⏹2.编写一段C语言源程序,实现LED1~LED8流水灯定时控制,每0.3,0.5,0.8,1或2秒走一个灯,通过串口来控制流水灯的流动速度。
参照下面的程序3
3.编写一段C语言源程序,实现LED1~LED8流水灯定时控制,每1秒走一个灯,并通过串口来控制流水灯是向左流动还是向右流动。
/*main.c文件*/
#include
#include"wblib.h"
#include"irq_handler.h"
#include"UART0.h"
#include"main.h“
INT8roll_flag=0x00;
intmain(void)
{
UARTMODEset;
INT8open_show1[]="UARTTEST\n\r'L'--LEDleft\n\r'R'--LEDright\n\r";
INT8bad_command[]="badcommand!
!
!
\n\r";
INT8led_num;
Init_EBILED(0x00);//初始化LED
//设置串口的波特率为115200,数据流为8位,停止位为1位,无校验位
set.datab=8;
set.stopb=1;
set.parity=0;
Uart0Init(115200,set);//串口初始化
uart0Write(open_show1);//将openshow1中的内容装入rcv_buf缓冲区中
Timer0Init();
while
(1){
if(rcv_buf[rcv_num-1]==0x0D)//判断接收新数据是否结束
{//既不是L也不是R//则输出badcommand
if(rcv_buf[0]!
='R'&&rcv_buf[0]!
='L')
{uart0Write(bad_command);}
else{
if(rcv_buf[0]=='L')//左滚动
{roll_flag=ROLL_LEFT;}
if(rcv_buf[0]=='R')//右滚动
{roll_flag=ROLL_RIGHT;}
}
rcv_num=0;
}
}
return0;
}
/*irq_handler.c*/
externINT8roll_flag;
voidTIMER0_Handler(void)
{
if(inpw(REG_TISR)&0x00000001)
{
outpw(REG_TISR,0x1);//中断状态寄存器
//中断标志置数
if(roll_flag==ROLL_LEFT){//LED向左滚动
led_num++;
if(led_num>=8){
led_num=0;
}
Set_EBILED((0x80>>led_num));//给LED发数据
}
if(roll_flag==ROLL_RIGHT){//LED向右滚动
led_num++;
if(led_num>=8){
led_num=0;
}
Set_EBILED((0x01<}
}
}
/*定时器的初始化*/
voidTimer0Init(void)
{
outpw(REG_TCR0,0x08000000);//初始化定时器控制寄存器,设置定时器模式为循环模式
outpw(REG_TICR0,0xE4E1C0);//定时器初始计数值参考下表
outpw(REG_AIC_SCR13,0x41);//中断控制寄存器设置,正边沿触发,优先级为1
outpw(REG_AIC_MECR,0x00002000);//使能相应的中断源
outpw(REG_TCR0,inpw(REG_TCR0)|0x20000000);//开定时器中断
outpw(REG_TCR0,inpw(REG_TCR0)|0x40000000);//定时器启动
}
⏹注:
定时器参考设置值:
Frequency(1/sec)
[Pre-Scalar]
[Counter]
18
0
0xCB735
40
0
0x5B8D8
100
0
0x249F0
其余的题目:
1LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明?
2编写一简单ARM汇编程序段,实现1+2+…+100的运算。
3编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
4将存储器中0x400000开始的200字节的数据,传送到0x400800开始的区域。
5编写一程序,存储器中从0x400200开始有一个64位数。
(1)将取反,再存回原处;
(2)求其补码,存放到0x400208处。
3、存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。
解:
MOVR0,#0x400000
MOVR1,#0
LP
LDRBR2,[R0,R1]
CMPR2,#0x61
BLONEXT
CMPR2,#0x7B;0x61---0x7A为小写字母的ASC
SUBLOR2,R2,#0x20
STRBLOR2,[R0,R1]
NEXT
ADDR1,R1,#1
CMPR1,#100
BNELP
8、编写一简单ARM汇编程序段,实现1+2+…+100的运算。
解:
MOVR2,#100
MOVR1,#0
LOOP
ADDR1,R1,R2;R1中为累加和
SUBSR2,R2,#1;R2控制循环
BNELOOP
4、编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
解:
MOVR0,#0x400000
LDRR1,[R0];取第1个数
LDRR2,[R0,#4];取第2个数
CMPR1,R2;两个数相比较
MOVHIR1,#1;R1大
MOVLOR1,#-1;R1小
MOVEQR1,#0;两个数相等
STRR1,[R0,#8]
•3将存储器中0x400000开始的200字节的数据,传送到0x480000开始的区域。
MOVR0,#0X400000
MOVR1,#0X480000
MOVR2,#0
LOOP
LDRBR3,[R0,R2]
STRBR3,[R1,R2]
ADDR2,R2,#1
CMPR2,#200
BLTLOOP
7、编写一程序,存储器中从0x400000开始有一个64位数。
(1)将取反,再存回原处;
(2)求其补码,存放到0x400008处。
解:
MOVR0,0x400200
MOVR2,#-1
LDRR1,[R0];取低32位数
EORR1,R1,R2;取反
STRR1,[R0];存低32位反码
ADDSR1,R1,#1;又加1为求补
STRR1,[R0,#8];存低32位补码
LDRR1,[R0,#4];取高32位数
EORR1,R1,R2;取反
STRR1,[R0,#4];存高32位反码
ADCR1,R1,#0;高32位求补
STRR1,[R0,#12];存高32位补码