w90p710作业.docx

上传人:b****6 文档编号:3327090 上传时间:2022-11-21 格式:DOCX 页数:16 大小:1.71MB
下载 相关 举报
w90p710作业.docx_第1页
第1页 / 共16页
w90p710作业.docx_第2页
第2页 / 共16页
w90p710作业.docx_第3页
第3页 / 共16页
w90p710作业.docx_第4页
第4页 / 共16页
w90p710作业.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

w90p710作业.docx

《w90p710作业.docx》由会员分享,可在线阅读,更多相关《w90p710作业.docx(16页珍藏版)》请在冰豆网上搜索。

w90p710作业.docx

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位补码

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1