您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页大学ARM嵌入式实验报告

大学ARM嵌入式实验报告

来源:保捱科技网


大学ARM嵌入式实验报告

《嵌入式系统》

实验报告

20__年4月

实验一ARM汇编指令实验1

一、实验目的

1.初步学会使用ADS1.2开发环境及ARM软件模拟器;

2.通过实验掌握简单ARM汇编指令的使用方法。

二.实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/_P。

三.实验内容

1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。

2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四.实验原理

ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。

1.ARM通用寄存器

通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。

2.存储器格式

ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节0~3存放第一个字,字节4~7存放第2个字,以此类推。

ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

五.实验程序

1.实验A参考程序

_EQU45:定义变量_,并赋值为45

YEQU:定义变量y,并赋值为

STACK_TOPEQU0_1000:定义栈顶0_1000

AREAE_ample,CODE,READONLY:声明代码段

ENTRY:标识入口

START

MOVSP,STACK_TOP

MOVR0,_:_的值放入R0

STRR0,[SP]:R0的值保存到堆栈

MOVR0,Y:y的值放入R0

LDRR1,[SP]:取堆栈中的数到R1

ADDR0,R0,R1

STRR0,[sp]

STOPBSTOP:死循环

END:结束

2.实验B参考程序

_EQU45:定义变量_,并赋值为45

YEQU:定义变量y,并赋值为

ZEQU87:定义变量z,并赋值为87

STACK_TOPEQU0_1000:定义堆栈顶0_1000

AREAHU_IANG,CODE,READONLY:声明代码段,只读ENTRY:标识入口

START

MOVR0,_:_的值放入R0

MOVR0,R0,LSL8:R0的值乘以2的8次方

MOVR1,Y:y的值放入R1

ADDR2,R0,R1,LSR1:R1的值除以2加上r0的值放入R2MOVSP,0_1000

STRR2,[SP]

MOVR0,Z:z的值放入R0

ANDR0,R0,0_FF:取R0的低八位

MOVR1,Y:y的值放入R1

ADDR2,R0,R1,LSR1:R1的值除以2加上r0的值放入R2LDRR0,[SP]:y的值放入R1

MOVR1,0_01

ORRR0,R0,R1

MOVR1,R2:y的值放入R1

ADDR2,R0,R1,LSR1:R1的值除以2加上r0的值放入R2

STOPBSTOP:死循环

END:结束

六.实验结果及分析

1.程序A的实验结果截图如下:

实验分析;

本实验使用LDR、STR、MOV等指令访问寄存器和存储单元,使用堆栈和寄存器R0,R1存储变量。

2.程序B的实验结果截图如下:

实验分析:

本实验使用ADD、SUB、LSL、LSR、AND、ORR等指令,完成基本数学/逻辑运算。

实验二ARM汇编指令实验2

一、实验目的

通过实验掌握使用LDM/STM、B和BL等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR的认识。

二、实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/_P。

三、实验内容

1.熟悉开发环境的使用并完成一块存储区的拷贝;

2.完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。

四、实验原理

1.ARM程序状态存储器

在所有处理器模式下,都可以访问当前程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态。CPSR和SPSR的格式如下:3130

21)标号的使用

标号由一个符号后跟一个冒号组成,它表示程序中当前的指令或者数据地址。如果在程序中出现两个相同的标号,汇编器会产生一个警告,同时,只有第一个标号有效。

2)几个伪指令

(1)LDR

LDR伪指令讲一个32位常数或者一个地址值读取到寄存器中。当需要读取到寄存器中的数据超过了MOV或者MNV指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。在汇编编译器处理源程序时,如果该常数没有超过MOV或者MNV可以操作的范围,则LDR指令被这两条指令中的一条所替代;否则,该常数将被放在最近的一个文字池(LiteralPool)内,同时,本指令被一条基于PC的LDR指令代替。

语法格式

LDR,=

其中,e_pression为需要读取的32位常数。Register为目标寄存器。

LDRr1,=0_ff

LDRr0,=0_fff0000

(2)ADR

ADR指令将基于PC的地址值或者给予寄存器的地址值读取到寄存器中。在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指

令或者SUB指令来实现该伪指令的功能。如果标号超出范围或者标号在他那个一文件(和同一段)内没有定义,则会产生一个错误,该指令不使用文字池。

语法格式

ADR

其中,register为目标寄存器。Label为基于PC或者寄存器的地址表达式。

示例Label1:

MOVr0,25

ADRr2,label1

(3).ltorg

.ltorg伪操作用于在当前段(一般是.Te_t段)的当前地址(字对准地址)产生一个文字池。语法格式

.Ltorg

五、实验程序

NUMEQU20

AREAHU_IANG3,CODE,READONLY

ENTRY

STARTLDRR0,=SRC

LDRR1,=DST

MOVR2,NUM

MOVSP,0_400

BLKCOPYMOVSR3,R2,LSR3

BEQCOPYWORDS

STMFDSP!,{R4-R11}

OCTCOPYLDMIAR0!,{R4-R11}

STMIAR1!,{R4-R11}

SUBSR3,R3,1

BNEOCTCOPY

LDMFDSP!,{R4-R11}

COPYWORDSANDSR2,R2,7

BEQSTOP

WORDCOPYLDRR3,[R0],4

STRR3,[R1],4

SUBSR2,R2,1

BNEWORDCOPY

STOPBSTOP

SRCDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

DSTDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

六、实验结果及分析

程序的实验结果截图如下

实验分析:

程序将数据从源数据区snum复制到目标数据区dumn,数据的个数num假定为20,复制时以8个字为单位进行,对于最后不足8个字的数据,以字为单位进行复制。

实验三汇编与C语言的相互调用实验

一、实验目的

1.阅读EmbestS3CEV40启动代码,观察处理器启动过程。

2.学会使用EmbestIDE辅助信息窗口来分析判断调试过程和结果

3.学会在EmbestIDE环境中编写、编译与调试汇编和C语言相互调用的程序。

二、实验设备

1.硬件:PC机;

2.软件:EmbestIDE2004集成开发环境。Windows98/2000/NT/_P。

三、实验内容

使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。

四、实验原理

1.ARM过程调用ATPCS(ARM)

ATPCS是一系列规定应用程序之间相互调用的基本规则,包括:支持数据栈检查;

支持只读段位置无关(ROPI);支持可读/写段位置无关(RWPI);

支持ARM程序和Thumb程序的混合使用;处理浮点运算。

使用以上规定的ATPCS规则是,应用程序必须遵守如下:程序编写遵守ATPCS;

变量传递以中间寄存器和数据栈完成;汇编器使用-apcs开关选项。

关于其他ATPCS规则,用户可以参考ARM处理器相关书籍或登录ARM公司网站。程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间及数据栈来传递参数,其中,第1~4个参数使用R0~R3,多用4个参数数据栈进行传递。这样,接受参数的应用程序必须知道参数的个数。

但是,在应用程序被调用时,一般无从知道所传递参数的个数。用不同语言编写的应用程序在调用时可以自定义传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。常用方法是把第1个或最后1个参数作为参数个数(包括个数本身)传递给应用程序。ATPCS中寄存器的相应关系如表3.1所列。

当应用程序中包含了main()函数时,会引起对C运行时库的初始化。该初始化是通过函数__gccmain()实现的,即在main()函数入口处,编译器会首先调用__gccmain()函数,然后才是执行编写的代码。__gccmain()函数在GCC的标准库里实现。当应用程序中没有包含main()函数时,不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。

如果使用main()函数作为应用程序的主函数,那么可以在源代码中间加入一个空的__gccmain()函数(用C语言或汇编语言即可)

五、实验操作步骤

1.创建新的工程,工程名为e_plasm。2.按照参考程序,重新编写源代码文件,并分别保持为randtest.c、init.s、random.s和ldscript,并把它们加入工程中。

3.按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。4.调试文件,打开Memrory/Register/Watch/Variable/CallStack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用EmbestIDE进行应用程序的开发与调试。

六、实验参考程序

XXX.c参考源代码

XXX.s参考源代码

XXX.s参考源代码

运行结果:

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务