ARM实验指导书.docx

上传人:b****6 文档编号:4127618 上传时间:2022-11-28 格式:DOCX 页数:27 大小:436.85KB
下载 相关 举报
ARM实验指导书.docx_第1页
第1页 / 共27页
ARM实验指导书.docx_第2页
第2页 / 共27页
ARM实验指导书.docx_第3页
第3页 / 共27页
ARM实验指导书.docx_第4页
第4页 / 共27页
ARM实验指导书.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

ARM实验指导书.docx

《ARM实验指导书.docx》由会员分享,可在线阅读,更多相关《ARM实验指导书.docx(27页珍藏版)》请在冰豆网上搜索。

ARM实验指导书.docx

ARM实验指导书

1、ADS1.2集成开发环境练习

1.1实验目的

了解ADS1.2集成开发环境的使用方法。

1.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

1.3实验内容

1.建立一个新的工程;

2.建立一个C源文件,并添加到工程中;

1.设置编译连接控制选项;

4.编译连接工程。

1.4实验预习要求

仔细阅读本书第2.2节ADS工程编辑的内容。

1.5实验步骤

1.启动ADS1.2IDE集成开发环境,选择【File】->【New…】,使用ARMExecutableImage

工程模板建立一个工程,工程名称为ADS,见图1。

图1建立ARM指令代码的工程

2.选择【File】->【New…】建立一个新的文件TEST1.S,设置直接添加到项目中,见

图1.2。

输入如程序清单1所示的代码,并保存,见图1.3。

图2新建文件TEST1.S

程序清单1TEST1.S文件代码

AREAExample1,CODE,READONLY;声明代码段Example1

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTMOVR0,#15;设置参数

MOVR1,#8

ADDSR0,R0,R1;R0=R0+R1

BSTART

END

图3添加了TEST1.S的工程管理窗口

1.选择【Edit】->【DebugRelSettings…】,在DebugRelSettings对话框的左边选择ARM

Linker项,然后在Output页设置连接地址(见图1.4),在Options页设置调试入口地址(见图

1.5)。

图4工程连接地址设置

图5工程调试入口地址设置

4.选择【Project】->【Make】,将编译连接整个工程。

1.6思考

工程模板有何作用?

(提示:

编译控制设置)

如何强行重新编译工程的所有文件?

(提示:

选择【Project】->【RemoveObjectCode…】

删除工程中的*.obj文件)

 

2汇编指令实验1

2.1实验目的

1.了解ADS1.2集成开发环境及ARMulator软件仿真;

2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序;

3..掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。

2.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

2.3实验内容

使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指

令把结果写回原地址,若结果大于等于10,则把0写回原地址。

使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor

Registers)监视R0、R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。

2.4实验预习要求

仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;

仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。

(本实验使用软件仿真)

2.5实验步骤

1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction1。

2.建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。

3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入

口地址Imageentrypoint为0x40000000。

4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

5.打开寄存器窗口(ProcessorRegisters),选择Current项监视R0、R1的值。

打开存储

器观察窗口(Memory)设置观察地址为0x40003100,显示方式Size为32Bit,监视

0x40003100地址上的值。

说明:

在Memory窗口中点击鼠标右键,Size项中选择显示格式为8Bit、16Bit、32Bit。

如图1.6所示。

6.可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,调试

时观察寄存器和0x40003100地址上的值。

运行结果见图1.7。

图6Memory窗口显示格式设置

图7汇编实验1程序运行结果

2.6实验参考程序

汇编指令实验1的参考程序见程序清单2。

程序清单2汇编指令实验1参考程序

COUNTEQU0x40003100;定义一个变量,地址为0x40003100

AREAExample2,CODE,READONLY;声明代码段Example2

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTLDRR1,=COUNT;R1<=COUNT

MOVR0,#0;R0<=0

STRR0,[R1];[R1]<=R0,即设置COUNT为0

LOOPLDRR1,=COUNT

LDRR0,[R1];R0<=[R1]

ADDR0,R0,#1;R0<=R0+1

CMPR0,#10;R0与10比较,影响条件码标志

MOVHSR0,#0;若R0大于等于10,则此指令执行,R0<=0

STRR0,[R1];[R1]<=R0,即保存COUNT

BLOOP

END

2.7思考

若使用LDRB/STRB代替程序清单2中的所有加载/存储指令(LDR/STR),程序会得到

正确的执行吗?

LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明?

(提示:

LDR伪指令

的形式为“LDRRn,=expr”)

LDR/STR指令的前索引偏移指令如何编写?

指令是怎样操作的?

在AXD调试时如何复位程序?

(提示:

选择【File】->【ReloadCurrentImage】重新加

载映象文件)

3汇编指令实验2

3.1实验目的

1.掌握ARM数据处理指令的使用方法;

2.了解ARM指令灵活的第2个操作数。

3.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

3.3实验内容

1.使用MOV和MVN指令访问ARM通用寄存器;

2.使用ADD、SUB、AND、ORR、CMP、TST等指令完成数据加减运算及逻辑运算。

3.4实验预习要求

仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;

仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。

(本实验使用软件仿真)

3.5实验步骤

1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction2。

2.建立汇编源文件TEST3.S,编写实验程序,然后添加到工程中。

3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入

口地址Imageentrypoint为0x40000000。

4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。

说明:

使用鼠标左键选择某一个寄存器,然后点击鼠标右键,Format项中选择显示

格式Hex、Decimal等等。

如图1.8所示。

图8设置寄存器显示格式

6.单步运行程序,观察寄存器值的变化。

说明:

有变化的寄存器会以红色显示。

如图1.9所示。

 

图9寄存器值更新的显示

3.6实验参考程序

汇编指令实验2的参考程序见程序清单3。

程序清单3汇编指令实验2参考程序

XEQU11;定义X的值为11

YEQU8;定义Y的值为8

BIT23EQU(1<<23);定义BIT23的值为0x00800000

AREAExample3,CODE,READONLY;声明代码段Example3

ENTRY;标识程序入口

CODE32;声明32位ARM指令

START;使用MOV、ADD指令实现:

R8=R3=X+Y

MOVR0,#X;R0<=X,X的值必须是8位图数据

MOVR1,#Y;R1<=Y,Y的值必须是8位图数据

ADDR3,R0,R1;即是R3=X+Y

MOVR8,R3;R8<=R3

;使用MOV、MVN、SUB指令实现:

R5=0x5FFFFFF8-R8*8

MVNR0,#0xA0000007;0xA0000007的反码为0x5FFFFFF8

SUBR5,R0,R8,LSL#3;R8左移3位,结果即是R8*8

;使用CMP指令判断(5*Y/2)>(2*X)吗?

若大于则R5=R5&0xFFFF0000,否则R5=R5|0x000000FF

MOVR0,#Y

ADDR0,R0,R0,LSL#2;计算R0=Y+4*Y=5*Y

MOVR0,R0,LSR#1;计算R0=5*Y/2

MOVR1,#X

MOVR1,R1,LSL#1;计算R1=2*X

CMPR0,R1;比较R0和R1,即(5*Y/2)和(2*X)进行比较

LDRHIR2,=0xFFFF0000;若(5*Y/2)>(2*X),则R2<=0xFFFF0000

ANDHIR5,R5,R2;若(5*Y/2)>(2*X),则R5=R5&R2

ORRLSR5,R5,#0x000000FF;若(5*Y/2)≤(2*X),则R5=R5|0x000000FF

;使用TST指令测试R5的bit23是否为1,若是则将bit6位清零(使用BIC指令)

TSTR5,#BIT23

BICNER5,R5,#0x00000040

BSTART

END

3.7思考

指令MOVR0,#0x12345678是否正确?

为什么?

将参考程序中应用CMP指令的代码,功能改为若(5*Y/2)>(2*X)则R5=R5|0x000000FF,

否则R5=R5&0xFFFF0000,程序应如何修改?

更改参考程序的X的值为200,Y的值为163,单步运行程序,每执行一步程序的结果

是多少?

如何实现64位加法运算(R6、R5)=(R6、R5)+(R3、R2)?

(提示:

使用ADC指令)

4汇编指令实验3

4.1实验目的

1.掌握ARM乘法指令的使用方法;

2.了解子程序编写及调用。

4.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

4.3实验内容

使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序,然后使用BL指令调用

子程序计算

的值。

4.4实验预习要求

仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;

仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。

(本实验使用软件仿真)

4.5实验原理

=X*X*X……*X,其中相乘的X的个数为n个。

先将X的值装入R0和R1,使用

寄存器R2进行计数,循环n-1次R0=R0*R1,运算结果就保存在R0中。

(不考虑结果溢

出问题)

注意,若n为0,则运算结果直接赋1;若n为1,则运算结果直接赋X。

4.6实验步骤

1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction3。

2.建立汇编源文件TEST4.S,编写实验程序,然后添加到工程中。

3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入

口地址Imageentrypoint为0x40000000。

4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

5.打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0、R1、R13(SP)

和R14(LR)的值。

6.打开存储器观察窗口(Memory)设置观察地址为0x40003EA0,显示方式Size为

32Bit,监视从0x40003F00起始的满递减堆栈区。

7.单步运行程序,跟踪程序执行的流程,观察寄存器值的变化和堆栈区的数据变化,

判断执行结果是否正确。

8.调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。

例如:

先复

位程序(选择【File】->【ReloadCurrentImage】),接着单步执行到“BLPOW”

指令,在寄存器窗口中将R0、R1的值进行修改,然后继续运行程序。

说明:

用鼠标双击寄存器窗口的寄存器,即可修改寄存器的值。

输入数据可以是十进制

数(如136、198),也可以是十六进数(如0x123,0xF0),输入数据后回车确定。

4.7实验参考程序

汇编指令实验3的参考程序见程序清单4。

程序清单4汇编指令实验3参考程序

;文件名:

TEST4.S

;功能:

计算X的n次方的值

;说明:

X和n均为无符号整数

XEQU9;定义X的值为9

nEQU8;定义n的值为8

AREAExample4,CODE,READONLY;声明代码段Example4

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTLDRSP,=0x40003F00;设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)

LDRR0,=X

LDRR1,=n

BLPOW;调用子程序POW,返回值为R0

HALTBHALT

;名称:

POW

;功能:

整数乘方运算。

;入口参数:

R0底数

;R1指数

;出口参数:

R0运算结果

;占用资源:

R0、R1

;说明:

本子程序不考虑溢出问题

POW

STMFDSP!

{R1-R12,LR};寄存器入栈保护

MOVSR2,R1;将指数值复制到R2,并影响条件码标志

MOVEQR0,#1;若指数为0,则设置R0=1

BEQPOW_END;若指数为0,则返回

CMPR2,#1

BEQPOW_END;若指数为1,则返回。

(此时R0没有被更改)

MOVR1,R0;设置DO_MUL子程序的入口参数R0和R1

SUBR2,R2,#1;计数器R2=指数值减1

POW_L1BLDO_MUL;调用DO_MUL子程序,R0=R1*R0

SUBSR2,R2,#1;每循环一次,计数器R2减1

BNEPOW_L1;若计数器R2不为0,跳转到POW_L1

POW_ENDLDMFDSP!

{R1-R12,PC};寄存器出栈,返回

;名称:

DO_MUL

;功能:

32位乘法运算。

;入口参数:

R0乘数

;R1被乘数

;出口参数:

R0计算结果

;占用资源:

R0、R1

;说明:

本子程序不会破坏R1

DO_MULMULR0,R1,R0;R0=R1*R0

MOVPC,LR;返回

END

4.8思考

若需要考虑溢出问题(使用32位运算结果,判断运算是否溢出),如何修改实验参考程

序?

(提示:

使用UMULL指令)

在实验参考程序中的DO_MUL子程序,是否可以使用B、ADD、SUB指令返回?

(提

示:

修改程序进行测试)

 

5汇编指令实验4

5.1实验目的

学习ARM微控制器的16位Thumb汇编指令的使用方法。

5.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

5.3实验内容

使用Thumb指令ADD、MOV、CMP、B实现1+2+3…+N的运算(N为0时,结果为0;

N为1时结果1)。

5.4实验预习要求

仔细阅读《ARM与嵌入式系统基础教程》第4章ARM指令系统的内容;

仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。

(本实验使用软件仿真)

5.5实验原理

ARM微控制器复位后处于ARM状态,此时只能执行ARM指令,所以需要使用BX指

令切换到Thumb状态,才能开始执行Thumb指令。

程序使用R0保存结果,所以一开始就要初始化为0;循环执行R0=R0+R1,R1为循环

计数器,从1开始计数,每一次循环R1加1;当循环计数器R1的值到达N时,运算结束。

5.6实验步骤

1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction4。

2.建立汇编源文件TEST5.S,编写实验程序,然后添加到工程中。

3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入

口地址Imageentrypoint为0x40000000。

4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。

6.单步运行程序,注意执行BXR0指令前后CPSR寄存器的T位。

说明:

在寄存器窗口的CPSR寄存器,大写字母的位表示该位为1,小写字母的位表示

该位为0(比如“T”表示T位为1,“t”表示T位为0)。

5.7实验参考程序

汇编指令实验4的参考代码见程序清单5。

程序清单5汇编指令实验4参考程序

;文件名:

TEST5.S

;功能:

计算1+2+...+N的值

;说明:

N≥0,当N=0时结果为0;当N=1时结果为1。

NEQU100;定义N的值为100

AREAExample5,CODE,READONLY;声明代码段Example5

ENTRY;标识程序入口

CODE32;声明32位ARM指令

ARM_CODELDRSP,=0x40003F00;设置堆栈指针

ADRR0,THUMB_CODE+1

BXR0;跳转并切换处理器状态

LTORG;声明文字池

CODE16;声明16位Thumb指令

THUMB_CODE

LDRR0,=N;设置子程序SUM_N的入口参数

BLSUM_N;调用子程序SUM_N

BTHUMB_CODE

;名称:

SUM_N

;功能:

计算1+2+...+N的值

;入口参数:

R0N的值

;出口参数:

R0运算结果

;占用资源:

R0

;说明:

当N=0时结果为1;当N=1时结果为1。

;若运算溢出,结果为0。

SUM_N

PUSH{R1-R7,LR};寄存器入栈保护

MOVSR2,R0;将N的值复制到R2,并影响条件码标志

BEQSUM_END;若N的值为0,则返回。

(此时R0没有被更改)

CMPR2,#1

BEQSUM_END;若N的值为1,则返回。

(此时R0没有被更改)

MOVR1,#1;初始化计数器R1=1

MOVR0,#0;初始化结果寄存器R0=0

SUM_L1ADDR0,R1;R0=R0+R1

BCSSUM_ERR;结果溢出,跳转到SUM_ERR

CMPR1,R2;将计数器的值与N比较

BHSSUM_END;若计数器的值≥N,则运算结束

ADDR1,#1

BSUM_L1

SUM_ERRMOVR0,#0

SUM_ENDPOP{R1-R7,PC};寄存器出栈,返回

END

5.8思考

在Thumb指令只有哪一条指令具有条件执行功能?

Thumb指令“ADDRd,Rm”是否会更新条件码标志?

Thumb指令“MOVR8,#0xFF000000”是否正确?

如果不正确应如何更改?

7ARM微控制器工作模式实验

7.1实验目的

1.掌握如何使用MRS/MSR指令实现ARM微控制器工作模式的切换;

2.了解在各个工作模式下的寄存器。

7.2实验设备

硬件:

PC机一台

软件:

Windows98/XP/2000系统,ADS1.2集成开发环境

7.3实验内容

1.使用MRS/MSR指令切换工作模式,并初始化各种模式下堆栈指针;

2.观察ARM微控制器在各种模式下寄存器的区别。

7.4实验预习要求

仔细阅读《ARM与嵌入式系统基础教程》第4章ARM体系结构的内容;

仔细阅读本书第2.2、2.3节ADS工程编辑和AXD调试的内容。

(本实验使用软件仿真)

7.5实验步骤

1.启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程MODE。

2.建立汇编源文件TEST7.S,编写实验程序,然后添加到工程中。

3.设置工程连接地址ROBase为0x40000000,RWBase为0x40003000。

设置调试入

口地址Imageentrypoint为0x40000000。

4.编译连接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。

5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。

6.单步运行程序,注意观察CPSR、SPSR、R13(SP)、R14(LR)、R15(PC)寄存器。

说明:

CPSR寄存器显示方式如图1.10所示。

显示分为两部分,一部分是各个标志位,

另一部分是工作模式。

标志位NZCVQ为条件码标志N、Z、C、V、Q,显示为大写字母,表示该位为1;显

示为小写字母,表示该位为0。

Q标志在ARM体系结构v5及以上版本的E变量中才有效。

标志位IFT为IRQ中断禁止位I、FIQ中断禁止位F、ARM微控制器状态位T,显示为

大写字母,表示该位为1;显示为小写字母,表示该位为0。

T标志在ARM体系结构v4及

以上版本的T变量中才有效。

工作模式指示ARM微控制器当前的工作模式,包括User(用户模式)、FIQ(FIQ中断模

式)、IRQ(IRQ中断模式)、SVC(管理模式)、Abort(中止模式)、Undef(未定义模式)、SYS(系

统模式)。

图10CPSR寄存器显示方式

7.6实验参考程序

ARM微控制器工作模式实验的参考程序见程序清单7。

程序清单7ARM微控制器工作模式实验参考程序

;定义堆栈的大小

USR_S

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

当前位置:首页 > 初中教育 > 政史地

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

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