大学ARM嵌入式实验报告(2)

2019-03-03 20:40

实验二 ARM汇编指令实验2

一、实验目的

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

二、实验设备

1.硬件:PC机;

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

三、实验内容

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

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

四、实验原理

1.ARM程序状态存储器

在所有处理器模式下,都可以访问当前程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态。CPSR和SPSR的格式如下: 31 30 29 28 27 26 8 7 6 5 4 3 2 1 0 N Z C V Q DNM(RAZ) I F T M M M M M 2.本实验涉及到得as语法及规则 1)标号的使用

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

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

LDR, =

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

LDR r1,=0xff

LDR r0,=0xfff0000 (2) ADR

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

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

ADR

其中,register 为目标寄存器。Label为基于PC或者寄存器的地址表达式。 示例Label1: MOV r0,#25 ADR r2,label1 (3).ltorg

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

五、实验程序

NUM EQU 20

AREA HUXIANG3,CODE,READONLY ENTRY

START LDR R0,=SRC LDR R1,=DST MOV R2,#NUM MOV SP,#0X400

BLKCOPY MOVS R3,R2,LSR#3 BEQ COPYWORDS STMFD SP!,{R4-R11}

OCTCOPY LDMIA R0!,{R4-R11} STMIA R1!,{R4-R11} SUBS R3,R3,#1 BNE OCTCOPY

LDMFD SP!,{R4-R11}

COPYWORDS ANDS R2,R2,#7 BEQ STOP

WORDCOPY LDR R3,[R0],#4 STR R3,[R1],#4 SUBS R2,R2,#1 BNE WORDCOPY

STOP B STOP

SRC DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

DST DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

END

六、实验结果及分析

程序的实验结果截图如下

实验分析:

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

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

一、实验目的

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

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

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

二、实验设备

1.硬件:PC机;

2.软件:Embest IDE 2004集成开发环境。Windows98/2000/NT/XP。

三、实验内容

使用汇编完成一个随机数产生函数,通过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所列。

表3.1 ATPCS规则中寄存器列表 ARM 寄存器 R0~R3 R4 ATPCS 别名 a1~a4 v1 ATPCS寄存器说明 参数/结果/scratch寄存器1~4 局部变量寄存器1 ARM 寄存器 R10 R11 ATPCS 别名 v7、sl v8 ATPCS寄存器说明 ARM 状态局部变量寄存器7,数据栈限制指针寄存器 ARM状态局部变量寄存器8

子程序内部调用的临时(scratch)寄存器 数据栈指针寄存器 链接寄存器 程序计数器 R5 R6 R7 R8 R9 v2 v3 v4、wr v5 v6、sb 局部变量寄存器2 局部变量寄存器3 局部变量寄存器4 Thumb状态工作寄存器 ARM状态局部变量寄存器5 ARM状态局部变量寄存6 RWPI的静态基址寄存器 R12 R13 R14 R15 ip sp lr PC 2.main( )与__gccmain( )函数 当应用程序中包含了main( )函数时,会引起对C运行时库的初始化。该初始化是通过函数__gccmain( )实现的,即在main( )函数入口处,编译器会首先调用__gccmain( )函数,然后才是执行编写的代码。__gccmain( )函数在GCC的标准库里实现。当应用程序中没有包含main( )函数时,不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。

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

五、实验操作步骤

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

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

六、实验参考程序

1.randtest.c参考源代码


大学ARM嵌入式实验报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:宿舍寄语[1]

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: