第9章 ARM汇编语言程序设计基础
- 格式:ppt
- 大小:1016.00 KB
- 文档页数:73
实验二 ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编指令二、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。
2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。
三、汇编语言简介1.ARM汇编的一些简要的书写规范ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。
ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。
在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。
注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。
详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。
2. ARM汇编语言程序的基本结构在ARM汇编语言程序中,是以程序段为单位来组织代码。
段是相对独立的指令或数据序列,具有特定的名称。
段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。
可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。
◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。
◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。
源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。
3. 简单的小例子下面是一个代码段的小例子AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]……END在汇编程序中,用AREA指令定义一个段,并说明定义段的相关属性,本例中定义了一个名为Init的代码段,属性为只读。
arm汇编指令格式ARM汇编指令格式ARM汇编语言是一种底层程序设计语言,用于直接操控ARM处理器的指令和寄存器。
ARM汇编指令格式是编写ARM汇编程序的基础,本文将一步一步详细解答与ARM汇编指令格式相关的问题。
第一部分:ARM汇编基础在深入理解ARM汇编指令格式之前,我们需要先了解一些基本概念。
ARM 处理器是英国公司ARM Holdings开发的一种低功耗、高性能的处理器体系架构,广泛应用于移动设备、嵌入式系统等领域。
ARM汇编语言是ARM 处理器的机器码的可读形式,用于编写底层程序。
在ARM汇编语言中,指令以二进制形式表示,通常以助记符的形式出现。
每条指令占用一个或多个字(通常一个字等于4个字节),按字节编址。
第二部分:指令格式详解ARM处理器的指令格式包括指令助记符、操作数和操作码等部分。
ARM 汇编指令格式的一般形式如下:[label:] mnemonic{cond}{S} Rd, Rn, Operand2其中,[label:]为可选项,表示标号,用于在程序中跳转或引用;mnemonic为指令的助记符,用于表示具体的操作;{cond}为可选项,表示条件代码,用于指定是否执行指令;{S}为可选项,表示是否更新条件代码;Rd表示目标操作数的寄存器;Rn表示源操作数的寄存器;Operand2为第二个操作数。
指令助记符(mnemonic)代表具体的指令功能,例如ADD表示加法、MOV表示数据传输等。
条件代码(cond)用于指定是否执行指令,常用的条件代码有EQ(等于)、NE(不等于)、GT(大于)等。
这样,我们可以根据需要选择是否在特定条件下执行指令。
更新条件代码(S)表示执行指令后是否更新条件代码寄存器。
如果设置了该标志位,则根据指令的结果设置条件代码寄存器。
目标操作数(Rd)是指令的结果存储的寄存器,源操作数(Rn)是参与指令计算的寄存器。
操作数(Operand2)是指令的第二个操作数,可以是立即数、寄存器的偏移值、寄存器的移位值等。
ARM汇编程序根本知识1.汇编程序的根本组成ARM汇编语言程序中,程序是以程序段为单位组织代码的。
段是相对独立的指令或者代码序列,拥有特定的名称。
段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。
段使用AREA伪操作来定义,并且说明相关属性,如代码段定义AREA Init, CODE, READONLY…数据段定义AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3……等一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。
在格式上,一个汇编程序需要至少有一个ENTRY〔关于ENTRY具体内容看伪操作符ENTRY〕,还需要在汇编源文件完毕处,写上END表示该源文件的完毕。
如一个根本的汇编源程序AREA Init, CODE, READONLY ;定义一个代码段ENTRY ;标记程序入口点Start LDR R0,0x3FF5000 ;标号Start可以要,也可以不要LDR R1,0XffSTR R1,[R0]LDR R0,=0x3FF5000LDR R1,0x01STR R1,[R0]……END ;END伪操作表示根源文件完毕当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译时,最终形成一个可执行的映像文件。
一个可执行映像文件通常由以下几局部组成一个或者多个代码段,代码段属性为只读〔只读数据也放在代码段?RO〕零个或者多个初始化数据的数据段,可读写〔存放初始化了的变量数据,RW〕零个或者多个不包含初始化数据的数据段,可读写〔所有未初始化的变量,也就是ZI〕器根据系统默认或者用户设定的规那么,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会一样。
2.汇编语句应该注意的地方汇编语句格式[LABEL] OPERATION, [OPERAND], [;MENT]LABEL必须在一行的开头写。
ARM汇编语言编程详解硅谷芯微嵌入式学院技术贡献网址:4.1 汇编语言使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。
每一种汇编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。
在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。
先介绍一个例子来说明ARM汇编程序的格式。
例1 计算20+8,结果放入R0寄存器。
AREA Buf, DATA, READWRITE ;声明数据段Buf Count DCB 20 ;定义一个字节单元Count AREA Example, CODE, READONLY ;声明代码段ExampleENTRY ;标识程序入口CODE32 ;声明32位ARM指令STARTLDRB R0, Count ;R0 = Count =20MOV R1, #8 ;R1 = 8ADD R0, R0, R1 ;R0 = R0 + R1B STARTEND例1中定义了两个段:数据段Buf和代码段Example 。
数据段中定义了字节单元Count,其中Count用来保存一个被加数;代码段中包含了所有源程序代码,程序中首先读取Count字节单元的内容,然后与立即数8相加,计算结果保存到R0中。
由例1可见,ARM汇编语言的源程序是分段的,由若干个段组成一个源程序。
源程序的一般格式为:AREA name1, attr ;声明特定的段标号语句1 ;语句...语句nAREA name2, attr标号语句n+1...语句n+mEND ;结束符每一个段都有一个名字,并且段名是唯一的。
每个段以符号AREA作为段的开始,以碰到下一个符号AREA 作为该段的结束。
段都有自己的属性,如是代码段(CODE)还是数据段(DATA),是只读(READONLY )还是可读写(READWRITE)?这些属性可以在attr栏中设定。
arm汇编基础这⾥需要提到的是ARM处理器的汇编语⾔编程的⼀些内容,在嵌⼊式ARM系统的程序设计中往往离不开ARM汇编语⾔编程。
正如⼤家所熟知的处理器初始化部分的代码通常都是⽤汇编来编写的,还有⼀些操作协处理器的代码,以及部分中断处理程序⼀样也是⽤汇编语⾔写成的。
在开始介绍ARM处理器汇编语⾔编程之前建议读者先阅读⼀些有关ARM指令集的资料,主要是指ARM指令集、Thumb指令集及ARM宏汇编部分。
有关ARM指令集和Thumb指令集这⾥就不做具体介绍,只从ARM汇编伪指令、模块化汇编语⾔程序设计、混合语⾔编程等⼏个⽅⾯对ARM处理器汇编语⾔做⼀些简单介绍。
ARM汇编伪指令介绍在ARM处理器汇编语⾔程序设计⾥,有⼀些特殊的指令助记符。
这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作⽤是为完成汇编程序做各种准备⼯作的,这些伪指令仅在汇编过程中起作⽤,⼀旦汇编结束,伪指令的使命就完成了。
在ARM处理器的汇编程序中,⼤体有如下⼏种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其他伪指令。
伪操作符可以分为以下⼏类。
1)数据定义伪操作符数据定义伪操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要⽤于数据表定义、⽂字池定义、数据空间分配等。
常⽤的有DCB/DCQ/DCW分配⼀段字节/双字/字内存单元,并且将它们初始化。
2)符号定义伪操作符符号定义伪操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SETA等,⽤于定义ARM汇编程序的变量,对变量进⾏赋值,以及定义寄存器名称等。
其中⽤于全局变量声明的GBLA、GBLL、GBLS和局部变量声明的LCAL、LCLL、LCLS伪指令较为常⽤。
3)报告伪操作符报告伪操作符包括ASSERT、INFO、OPT等,主要⽤于汇编报告等。