嵌入实验报告.docx

上传人:b****8 文档编号:12857505 上传时间:2023-06-08 格式:DOCX 页数:32 大小:1.31MB
下载 相关 举报
嵌入实验报告.docx_第1页
第1页 / 共32页
嵌入实验报告.docx_第2页
第2页 / 共32页
嵌入实验报告.docx_第3页
第3页 / 共32页
嵌入实验报告.docx_第4页
第4页 / 共32页
嵌入实验报告.docx_第5页
第5页 / 共32页
嵌入实验报告.docx_第6页
第6页 / 共32页
嵌入实验报告.docx_第7页
第7页 / 共32页
嵌入实验报告.docx_第8页
第8页 / 共32页
嵌入实验报告.docx_第9页
第9页 / 共32页
嵌入实验报告.docx_第10页
第10页 / 共32页
嵌入实验报告.docx_第11页
第11页 / 共32页
嵌入实验报告.docx_第12页
第12页 / 共32页
嵌入实验报告.docx_第13页
第13页 / 共32页
嵌入实验报告.docx_第14页
第14页 / 共32页
嵌入实验报告.docx_第15页
第15页 / 共32页
嵌入实验报告.docx_第16页
第16页 / 共32页
嵌入实验报告.docx_第17页
第17页 / 共32页
嵌入实验报告.docx_第18页
第18页 / 共32页
嵌入实验报告.docx_第19页
第19页 / 共32页
嵌入实验报告.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入实验报告.docx

《嵌入实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入实验报告.docx(32页珍藏版)》请在冰点文库上搜索。

嵌入实验报告.docx

嵌入实验报告

 

《嵌入式系统》

实验报告

 

姓名:

苏美龙

学号:

10401700403

班级:

电气工程1002班

 

湖南工业大学

电气与信息工程学院

 

2013年4月

实验一ARM汇编指令实验1

一、实验目的

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

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

二.实验设备

1.硬件:

PC机;

2.软件:

EmbestIDE2004集成开发环境。

Windows98/2000/NT/XP。

三.实验内容

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体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

3.GNU基础知识

EmbestIDE集成了GNU汇编器as、编译器gcc和链接器ld。

因此,编写程序要符合CNU的语法和规则。

关于as.gcc和ld的具体使用,请参照EmbestIDE所带的电子文档ProgRef.chm。

五实验程序

1.实验A参考程序

.equx,45/*定义变量x,并赋值为45*/

.equy,64/*定义变量y,并赋值为64*/

.equstack_top,0x1000/*定义栈顶0x1000*/

.global_start

.text

_start:

/*程序代码开始标志*/

MOVsp,#stack_top

MOVr0,#x/*x的值放入R0*/

STRr0,[sp]/*R0的值保存到堆栈*/

MOVr0,#y/*y的值放入R0*/

LDRr1,[sp]/*取堆栈中的数到R1*/

ADDr0,r0,r1

STRr0,[sp]

stop:

Bstop/*程序结束,进入死循环*/

.end

2.实验B参考程序

.equx,45/*定义变量x,并赋值为45*/

.equy,64/*定义变量y,并赋值为64*/

.equz,87/*定义变量z,并赋值为87*/

.equstack_top,0x1000/*定义栈顶0x1000*/

.global_start

.text

_start:

/*程序代码开始标志*/

MOVr0,#x/*x的值放入R0*/

MOVr0,r0,lsl#8/*R0的值乘以2的8次方*/

MOVr1,#y/*y的值放入R1*/

ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/

MOVsp,#0x1000

STRr2,[sp]

MOVr0,#z/*z的值放入R0*/

ANDr0,r0,#0xFF/*取R0的低八位*/

MOVr1,#y/*y的值放入R1*/

ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/

LDRr0,[sp]/*y的值放入R1*/

MOVr1,#0x01

ORRr0,r0,r1

MOVr1,R2/*y的值放入R1*/

ADDr2,r0,r1,lsr#1/*R1的值除以2加上r0的值放入R2*/

stop:

Bstop/*程序结束,进入死循环*/

.end

六.实验结果及分析

答:

实验A实现了两个数据的加法运算功能;实验B实现了基本数学运算及逻辑运算功能,详细分析如下所示:

实验A流程框图:

实验A运行结果:

 

实验A调试结果:

实验A存储器分析结果:

实验B运行结果:

实验B调试结果:

实验B存储器分析结果:

实验二ARM汇编指令实验2

一、实验目的

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

二、实验设备

1.硬件:

PC机;

2.软件:

EmbestIDE2004集成开发环境。

Windows98/2000/NT/XP。

三、实验内容

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

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

四、实验原理

1.ARM程序状态存储器

在所有处理器模式下,都可以访问当前程序状态寄存器CPSR。

CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。

每种异常模式都有一个程序状态保存寄存器SPSR。

当异常出现时,SPSR用于保存CPSR的状态。

CPSR和SPSR的格式如下:

313029282726876543210

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指令被这两条指令中的一条所替代;否则,该常数将被放在最近的一个文字池(LiteralPool)内,同时,本指令被一条基于PC的LDR指令代替。

语法格式

LDR,=

其中,expression为需要读取的32位常数。

Register为目标寄存器。

示例

LDRr1,=0xff

LDRr0,=0xfff0000

(2)ADR

ADR指令将基于PC的地址值或者给予寄存器的地址值读取到寄存器中。

在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。

通常,编译器用一条ADD指令或者SUB指令来实现该伪指令的功能。

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

语法格式

ADR

其中,register为目标寄存器。

Label为基于PC或者寄存器的地址表达式。

示例

Label1:

MOVr0,#25

ADRr2,label1

(3).ltorg

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

语法格式

.ltorg

五、实验参考程序

1实验A参考程序

.global_start

.text

.equnum,20/*Setnumberofwordstobecopied*/

_start:

LDRr0,=src/*r0=pointertosourceblock*/

LDRr1,=dst/*r1=pointertodestinationblock*/

MOVr2,#num/*r2=numberofwordstocopy*/

MOVsp,#0x400/*setupstackpointer(r13)*/

blockcopy:

MOVSr3,r2,LSR#3/*numberofeightwordmultiples*/

BEQcopywords/*lessthaneightwordstomove?

*/

STMFDsp!

{r4-r11}/*savesomeworkingregisters*/

octcopy:

LDMIAr0!

{r4-r11}/*load8wordsfromthesource*/

STMIAr1!

{r4-r11}/*andputthematthedestination*/

SUBSr3,r3,#1/*decrementthecounter*/

BNEoctcopy/*...copymore*/

LDMFDsp!

{r4-r11}/*don'tneedthesenow-restoreoriginals*/

copywords:

ANDSr2,r2,#7/*numberofoddwordstocopy*/

BEQstop/*Nowordslefttocopy?

*/

wordcopy:

LDRr3,[r0],#4/*awordfromthesource*/

STRr3,[r1],#4/*storeawordtothedestination*/

SUBSr2,r2,#1/*decrementthecounter*/

BNEwordcopy/*...copymore*/

stop:

Bstop

.ltorg

src:

.long1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

dst:

.long0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.end

2.实验B参考程序

.global_start

.text

.equnum,2/*Numberofentriesinjumptable*/

_start:

MOVr0,#0/*setupthethreeparameters*/

MOVr1,#3

MOVr2,#2

BLarithfunc/*callthefunction*/

stop:

Bstop

arithfunc:

/*labelthefunction*/

CMPr0,#num/*Treatfunctioncodeasunsignedinteger*/

BHSDoAdd/*Ifcodeis>=2thendooperation0.*/

ADRr3,JumpTable/*Loadaddressofjumptable*/

LDRpc,[r3,r0,LSL#2]/*Jumptotheappropriateroutine*/

JumpTable:

.longDoAdd

.longDoSub

DoAdd:

ADDr0,r1,r2/*Operation0,>1*/

MOVpc,lr/*Return*/

DoSub:

SUBr0,r1,r2/*Operation1*/

MOVpc,lr/*Return*/

.end/*marktheendofthisfile*/

六、实验结果及分析。

答:

该实验A实现的功能是把数据从源数据区复制到目的数据区,并以8个字为单位进行复制,对于不足8个字的数据,以字为单位进行复制。

详细分析如下所示:

实验A运行结果:

实验A调试结果:

 

实验A存储器分析结果:

 

 

实验B运行结果:

 

 

实验B调试结果:

 

 

实验B存储器分析结果:

 

 

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

一、实验目的

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

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

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

二、实验设备

1.硬件:

PC机;

2.软件:

EmbestIDE2004集成开发环境。

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.1ATPCS规则中寄存器列表

ARM

寄存器

ATPCS

别名

ATPCS寄存器说明

ARM

寄存器

ATPCS

别名

ATPCS寄存器说明

R0~R3

a1~a4

参数/结果/scratch寄存器1~4

R10

v7、sl

ARM状态局部变量寄存器7,数据栈限制指针寄存器

R4

v1

局部变量寄存器1

R11

v8

ARM状态局部变量寄存器8

R5

v2

局部变量寄存器2

R12

ip

子程序内部调用的临时(scratch)寄存器

R6

v3

局部变量寄存器3

R13

sp

数据栈指针寄存器

R7

v4、wr

局部变量寄存器4

Thumb状态工作寄存器

R14

lr

链接寄存器

R8

v5

ARM状态局部变量寄存器5

R15

PC

程序计数器

R9

v6、sb

ARM状态局部变量寄存6

RWPI的静态基址寄存器

 

 

 

2.main()与__gccmain()函数

当应用程序中包含了main()函数时,会引起对C运行时库的初始化。

该初始化是通过函数__gccmain()实现的,即在main()函数入口处,编译器会首先调用__gccmain()函数,然后才是执行编写的代码。

__gccmain()函数在GCC的标准库里实现。

当应用程序中没有包含main()函数时,不会引起对C运行时库的初始化。

这时,C运行时库的很多功能在应用程序中是不能使用的。

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

五、验参考程序

1.randtest.c参考源代码

/*Randomnumbergeneratordemoprogram

Callsassemblerfunction'randomnumber'definedinrandom.s*/

//#include

/*thisfunctionprototypeisneededbecause'randomnumber'isexternal*/

externunsignedintrandomnumber(void);

intmain()

{

inti;

intnTemp;

unsignedintrandom[10];

for(i=0;i<10;i++)

{

nTemp=randomnumber();

random[i]=nTemp;

}

return(0);

}

2.init.s参考源代码

#*******************************************************

#*NAME:

44BINIT.S*

#*Version:

10.April.2000*

#*Description:

*

#*Cstartupcodes*

#*Configurememory,InitializeISR,stacks*

#*InitializeC-variables*

#*Fillzerosintozero-initializedC-variables*

#*******************************************************

#程序入口,arm汇编

#.arm

.global_start

.text

_start:

#---Setupinterrupt/exceptionvectors

BReset_Handler

Undefined_Handler:

BUndefined_Handler

SWI_Handler:

BSWI_Handler

Prefetch_Handler:

BPrefetch_Handler

Abort_Handler:

BAbort_Handler

NOP/*Reservedvector*/

IRQ_Handler:

BIRQ_Handler

FIQ_Handler:

BFIQ_Handler

Reset_Handler:

LDRsp,=0x00002000

#------------------------------------------------------------------------------

#-BranchonCcodeMainfunction(withinterworking)

#----------------------------------------------------

#-BranchmustbeperformedbyaninterworkingcallaseitheranARMorThumb

#-mainCfunctionmustbesupported.Thismakesthecodenotposition-

#-independant.ABranchwithlinkwouldgenerateerrors

#------------------------------------------------------------------------------

.externmain

ldrr0,=main

movlr,pc

bxr0

#------------------------------------------------------------------------------

#-Loopforever

#---------------

#-Endofapplication.Normally,neveroccur.

#-CouldjumponSoftwareReset(B0x0).

#------------------------------------------------------------------------------

End:

bEnd

.global__gccmain

__gccmain:

movpc,lr

.end

3.random.s参考源代码

#

#Thisusesa33-bitfeedbackshiftregistertogenerateapseudo-randomly

#orderedsequenceofnumberswhichrepeatsinacycleoflength2^33-1

#NOTE:

randomseedshouldnotbesetto0,otherwiseazerowillbegenerated

#continuously(notparticularlyrandom!

).

#ThisisagoodapplicationofdirectARMassembler,becausethe33-bit

#shiftregistercanbeimplementedusingRRX(whichusesreg+carry).

#AnANSICversionwouldbelessefficientasthecompilerwouldnotuseRRX.

#AREA|Random$$code|,CODE,READONLY

.GLOBALrandomnumber

randomnumber:

#onexit:

#a1=low32-bitsofpseudo-randomnumber

#a2=highbit(ifyouwanttoknowit)

LDRip,seedpointer

LDMIAip,{a1,a2}

TSTa2,a2,LSR#1/*tobitintocarry*/

MOVSa3,a1,RRX/*33-bitrotateright

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

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2