w90p710作业Word文档格式.docx
- 文档编号:16232620
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:16
- 大小:1.71MB
w90p710作业Word文档格式.docx
《w90p710作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《w90p710作业Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
MOVR1,#0x480000;
MOVR2,#5;
LDMIAR0!
{R3-R12};
STMIAR1!
BNEloop;
stop
Bstop;
4
(1):
AREATEST_4,CODE;
取反,64位的数
MOVR2,#8
LDRBR1,[R0];
EORR1,R1,#0xFF;
STRBR1,[R0],#1
SUBSR2,R2,#1
4
(2):
AREATEST_4_2,CODE;
取64位的数的补码,方法是取反加1
MOVR2,#0
ADDR3,R0,#8
LDRBR1,[R0],#1;
STRBR1,[R3,R2]
ADDR2,R2,#1
CMPR2,#8
BCCloop;
R2<
=8那么循环,表示进行八个字节的取反
LDMIAR3,{R4,R5};
ADDSR4,R4,#1;
改变标志位
ADCR5,R5,#0
STMIAR3,{R4,R5}
END
5:
AREAT5_5,CODE;
取64位的数
ENTRY
MRSR0,CPSR
ORRR0,R0,#0x80
MSRCPSR_c,#0xD2
LDRSP,Stack_irq
MSRCPSR_c,R0
Bstop;
Stack_irq
DCD0x40000000
;
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
STMIAr0,{r1-r6}
Init_SystemMemory
DCD0x000530C1
DCD0x00040084
DCD0x010090E4
DCD0x200090E4
DCD0x0000014B
Remap_SystemMemory
DCD0x10040084
DCD0x000090E4
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
LDRR0,=REG_EXT0CON
LDRR1,=EBI_EXT0_VALUE
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
MVNR2,R1
LDRR0,=EBILED_ADDRESS
STRR2,[R0]
MOVR1,R1,LSL#1
ADDSR3,R3,#1
CMPR3,#8
BHIRETURN
MOVR2,#0x200000
delay
BNEdelay
Bloop
RETURN
MOVPC,LR;
⏹编写一段C语言源程序,通过外部中断nIRQ3控制LED1~LED8流水灯显示的流动方向。
当中断被触发时改变灯的流动方向.
#include<
stdio.h>
#include"
wblib.h"
irq_handler.h"
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向右滚动
if(led_num>
=8)led_num=0;
Set_EBILED((0x01<
<
}}
return0;
}
/*irq_handler.c文件*/
externINT8roll_flag;
voidnIRQ3_Handler(void)
{
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应熄灭。
Setmem0xFFF830080x3,32
使GPIO0和GPIO1引脚输出电平为低。
此时,LED12、LED13应点亮。
Setmem0xFFF830080x0,32
⏹2.编写一段C语言源程序,实现LED1~LED8流水灯定时控制,每0.3,0.5,0.8,1或2秒走一个灯,通过串口来控制流水灯的流动速度。
参照下面的程序3
3.编写一段C语言源程序,实现LED1~LED8流水灯定时控制,每1秒走一个灯,并通过串口来控制流水灯是向左流动还是向右流动。
/*main.c文件*/
UART0.h"
main.h“
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]!
='
&
&
rcv_buf[0]!
)
{uart0Write(bad_command);
else{
if(rcv_buf[0]=='
)//左滚动
{roll_flag=ROLL_LEFT;
if(rcv_buf[0]=='
)//右滚动
{roll_flag=ROLL_RIGHT;
rcv_num=0;
return0;
/*irq_handler.c*/
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>
if(roll_flag==ROLL_RIGHT){//LED向右滚动
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);
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
0xCB735
40
0x5B8D8
100
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
LOOP
ADDR1,R1,R2;
R1中为累加和
SUBSR2,R2,#1;
R2控制循环
BNELOOP
4、编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
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
LDRBR3,[R0,R2]
STRBR3,[R1,R2]
ADDR2,R2,#1
CMPR2,#200
BLTLOOP
7、编写一程序,存储器中从0x400000开始有一个64位数。
(2)求其补码,存放到0x400008处。
MOVR0,0x400200
MOVR2,#-1
取低32位数
EORR1,R1,R2;
取反
STRR1,[R0];
存低32位反码
ADDSR1,R1,#1;
又加1为求补
STRR1,[R0,#8];
存低32位补码
LDRR1,[R0,#4];
取高32位数
STRR1,[R0,#4];
存高32位反码
ADCR1,R1,#0;
高32位求补
STRR1,[R0,#12];
存高32位补码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- w90p710 作业