《嵌入式系统》
实验报告
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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务