第6章 ARM汇编伪指令与伪操作.ppt_第1页
第6章 ARM汇编伪指令与伪操作.ppt_第2页
第6章 ARM汇编伪指令与伪操作.ppt_第3页
第6章 ARM汇编伪指令与伪操作.ppt_第4页
第6章 ARM汇编伪指令与伪操作.ppt_第5页
已阅读5页,还剩73页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 ARM汇编伪指令与伪操作,内容提要,6.1 汇编语言伪指令 6.2 ARM汇编语言伪操作 6.3 ARM汇编伪操作,6.1 汇编语言伪指令,伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它们没有相对应的操作码,也不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。 伪指令在源程序中的作用是为完成汇编程序做各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。,ARM汇编语言伪指令,1大范围地址读取伪指令LDR LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容

2、。 LDRcond register , = expression,如果加载的常数符合MOV或MVN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。 如果加载的常数不符合MOV或MVN指令立即数的要求,汇编器将常量放入内存文字池,并使用一条程序相对偏移的LDR指令从内存文字池读出常量。 LDR用于加载芯片外围功能部件的寄存器地址(32位立即数),实现各种控制操作。从PC到数据缓冲区的偏移量必须小于4K,与ARM指令的LDR相比,伪指令的LDR的参数有“=”符号。,伪指令语句: LDRR0,=0 x0AA00;R00 x0AA00 汇编后: MOV R0,#43520,例如: LDR

3、R0,=0 x12345678;加载32位立即数 LDR R0,=DATA_BUF+60 ; 加载DATA_BUF+60 LTORG ;声明文字池,2中等范围地址读取伪指令ADRL 它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 字节对齐-64K64K,字对齐取值范围-256K256K ADRLcond register , = expression,汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。 如果不能用两条指令实现ADRL伪指令的功能,则编译器报告错误,编译失败。,以下指令存放在0 x8000起始的地

4、址单元,分析汇编后的结果。 .global _start .text _start: MOVR0,#0 x0F ADRL R0,_start .end 解:汇编后的结果为: 0 x00008000MOV R0, #0 x0F 0 x00008004SUB R0, PC, #12 0 x00008008NOP (MOV R0,R0),例如: ADRL R0,DATA_BUF ADRL R1,DATA_BUF+80 DATA_BUF SPACE 100 ;定义100字节缓冲区,3小范围地址读取伪指令ADR 它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址是非字对齐时,

5、取值范围为-255+255,字对齐时取值范围-10201020 ADRcond register , = expression 在汇编表示ADR这条伪指令会被编译器替换成一条合适的指令如ADD,SUB,如果不能被替换则产生错误,编译失败。,下列指令存放在0 x8000起始的地址单元,分析汇编后的结果。 .global _start .text _start: MOVR0,#0 x0F ADRR0,_start .end 解:汇编后的结果为: 0 x00008000MOV R0, #0 x0F 0 x00008004SUB R0, PC, #12,例如: LOOP MOV R1,#0 xF0 A

6、DR R2,LOOP ;将LOOP的地址放入R2 ADR R3,LOOP+4,4空操作伪指令NOP NOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作 ,只占用一个机器时间,可以翻译为MOV R0,R0,6.2ARM汇编语言伪操作,伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。 伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。,目前常用的编译环境有2种: 1. ADS/SDT、RealView MDK等ARM公司推出的开发工具 2. GNU

7、ARM开发工具,1. ADS/SDT、RealView MDK等ARM公司推出的开发工具 ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种ARM 开发工具的能力。 以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。,ARM 将Keil 公司收购之后,正式推出了针对ARM 微控制器的开发工具RealView Microcontroller Development Kit ( 简称Real View MDK 或者MDK) ,它将ARM 开发工具RealView

8、 Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM 微控制器开发工具。,2. GNU ARM开发工具 GNU是“GNUs Not Unix”的递归缩写。在1983年9月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。 GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器gcc和连接器ld组成。,6.3 ARM汇编伪操作,ARM公司推出的开发工具所支

9、持的汇编伪操作包括符号定义伪操作、数据定义伪操作、汇编信息报告控制伪操作、汇编代码控制伪操作、文件包含伪操作、指令集类型标识伪操作以及其他功能伪操作。,6.3.1 符号定义伪操作,作用:用于定义ARM汇编程序中的变量,对变量赋值以及定义寄存器的别名等。 局部变量定义LCLA、LCLL及LCLS 全局变量定义GBLA、GBLL及GBLS 变量赋值的SETA 、 SETL 和SETS 为通用寄存器列表定义名称的RLIST。 为什么要定义使用变量? 1.增强可读性便于交流和记忆 2.充分利用编译器的资源 ,提高工作效率 3.方便修改 4.不必关心存储空间,局部变量定义:LCLA、 LCLL和LCLS

10、 语法格式 LCLA variable ;定义一个局部的数字变量,初始化为0 LCLL variable ;定义一个局部的逻辑变量,初始化为F LCLS variable ;定义一个局部的字符串变量,初始化为空 其中:variable所说明的局部变量名称。在其局部作用范围内,变量名必须唯一,例如在宏内。,全局变量定义GBLA、GBLL及GBLS;伪操作定义一个汇编程序的全局变量并初始化。 语法格式 GBLA variable ;定义一个全局的数字变量,初始化为0 GBLL variable ;定义一个全局逻辑变量,初始化为F GBLS variable ;定义一个全局字符串变量,初始化为空 其

11、中: variable所说明的全局变量名称。在整个程序中变量名必须唯一。,变量赋值伪操作SETA、SETL及SETS 语法格式 variable_aSETAexpr_a variable_lSETL expr_l variable_sSETS expr_s 格式中的变量名必须为已经定义过的全局或者局部变量,EXPR_*为将要赋值给变量的值。,变量定义赋值举例,举例: GBLA TEMPER ;先声明一个算术全局变量 TEMPER SETA 0 x0F2003B*2 ;对这个全局变另赋值 LCLL STATUS ;声明一个局部逻辑变量 STATUS SETL TRUE ;为该逻辑变量赋值 GBL

12、S STRING ;声明一个全局字符串变量 STRING SETS “CONNECTION IS RIGHT” ;为该字符串变量赋值,给通用寄存器列表定义名称RLIST,语法格式 nameRLISTregisters_list 其中: name寄存器列表的名称; registers_list通用寄存器列表。 说明:RLIST可用于对一个通用寄存器列表定义名称,该名称可在ARM指令LDM/STM中使用。 在LDM/STM指令中,列表中的寄存器为根据寄存器的编号由低到高访问次序,与列表中的寄存器排列次序无关。,举例: PBLOCK RLIST R0-R3,R7,R5,R9 LDM R4!,PBLO

13、CK ;将寄存器列表名称定义为PBLOCK,可在ARM指令LDM/STM中通过该名称访问寄存器列表。,VFP寄存器名称定义DN、SN nameDN expr nameSN expr 其中: nameVFP寄存器的名称; expr要定义的VFP寄存器编号:双精度寄存器编号范围为015,单精度寄存器编号范围为031。,FPA浮点寄存器定义名称FN 语法格式 nameFN expr 其中: nameFPA浮点寄存器的名称; expr要定义的FPA浮点寄存器编号:编号范围为07。,协处理器名称定义CP 语法格式 nameCP expr 其中: name定义的协处理器的名称; expr要定义名称的协处理

14、器编号:编号范围为015。,协处理器寄存器名称定义CN 语法格式 nameCN expr 其中: name定义的协处理器的寄存器名称; expr要定义名称的协处理器的寄存器编号:编号范围为015。,6.3.2 数据定义伪操作,数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化 。 有如下几种: DCB 字节分配 DCW/DCWU 半子(2字节)分配 DCD/DCDU 字(4字节)分配 DCQ/DCQU 8个字节分配 DCFS/DCFSU 单精度浮点数分配 DCFD/DCFDU 双精度浮点数分配 SPACE 分配一块连续的存储单元 FIELD 定义一个结构化的内存表

15、的数据域 MAP 定义一个结构化的地址表首地址 LTORG 声明一个数据缓冲区,1.分配字节存储单元DCB,语法格式 labelDCBexpr, expr DCB可用“=”代替 其中: label可选的程序标号; expr是-128255之间的数字或字符串。 例如: Array1 DCB 1,2,3,4,5 ;数组 str1 DCB “you are welcome!” ;构造字符串并分配空间,2.分配半字存储单元DCW及DCWU,语法格式 labelDCWexpr, expr labelDCWUexpr, expr 其中: label可选的程序标号; Expr 是-3276865535之间的

16、数字表达式(半字)。 DCW要求存储空间是半字对齐,DCWU不要求 Arrayw1 DCW 0 xa,-0 xb ;构造固定数组并分配半字存储单元,3.分配字存储单元DCD及DCDU,语法格式 labelDCDexpr, expr labelDCDUexpr, expr DCD可用“ expr表达式。 DCD要求存储空间是字对齐,DCDU不要求 Arrayd1 DCW 1334,234 构造固定数组并分配字为单元的存储单元 Lable DCD str1 ;该字单元存放str1的地址,4.分配单精度浮点数存储单元DCFS及DCFSU,语法格式 labelDCFSfpliteral, fplite

17、ral labelDCFSUfpliteral, fpliteral 其中: label可选的程序标号; fpliteral单精度浮点表达式,取值范围:1.17549435e-383.4028234e+38。 单精度浮点数使用一个字的单元,5.分配双精度浮点数存储单元DCFD及DCFDU,labelDCFDfpliteral, fpliteral labelDCFDUfpliteral, fpliteral 其中: label可选的程序标号; fpliteral双精度浮点表达式,取值范围:2.22507385850720138e-3081.7976931348623157e+308。 每个双精

18、度的浮点数占两个字单元。,6.分配双字存储单元DCQ及DCQU(8字节),语法格式 labelDCQ-expr, -expr labelDCQU-expr, -expr 其中: label可选的程序标号; expr用于初始化内存的数字或表达式,其数值必须是整数。 Arrayd1 DCQ 234234,98765543 ;构造固定数组并分配字为单元的存储单元 ;注意DCQ不能给字符串分配空间,7.声明数据缓冲池LTORG,在使用LDR伪指令时,要在适当的位置加入LTROG声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器

19、会在程序末尾自动声明。 语法格式 LTROG 说明: 数据缓冲区必须完全和程序代码区分开,可以放在跳转指令之后或者子程序返回指令之后,编译程序会自动决定数据缓冲区的长度。,举例: LDR R0,=0XAABBCCDD EOR R1,R1,R0 B sub LTROG ;该处的数据缓冲池用来存储0XAABBCCDD,8.分配存储空间SPACE,语法格式 labelSPACEexpr 其中: label可选的程序标号; expr分配的字节数。 说明:SPACE用于分配一片连续的存储区域并初始化为0,SPACE可用“%”代替。 例如: freespace SPACE 1000 ;分配1000字节的存

20、储空间,9.定义结构化内存表首地址MAP,语法格式 MAPexpr,base_register 其中: “”可用来替换MAP。Expr可以为程序中的标号或数学表达式, base_register基址寄存器为可选项,当基址寄存器不存在时,表达式的值即为内存表的首地址,当基址寄存器存在时,内存表的首地址为表达式的值域机制寄存器的和 MAP可以和FIELD为操作配合使用来定义结构化的内存表。 MAP 0 x130,R2; 内存表首地址为0 x130+R2,10.定义结构化内存表数据域FIELD,语法格式 labelFIELDexpr 其中: label可选的程序标号,当指定这一选项时,label的值

21、为当前内存表的位置计数器的值; exprFIELD指定的域所占内存单元字节数。 ”#”可用来替代FIELD FIELD常与MAP配合使用来定义结构化的内存表:FIELD伪指令定义内存表种的各个数据域,MAP则定义内存表的首地址,并为每个数据域制定一个标号以供其他的指令索引。 需要注意的时MAP和FIELD伪指令仅用于定义数据结构,并不分配存储单元,举例: MAP 0 xF10000 ;定义结构化内存表首地址为0 xF10000 Count FIELD 4 ;定义Count的长度为4字节,位置为0 xF10000+0 X FIELD 4 ;定义X的长度为4字节,位置为0 xF10000+4 Y

22、FIELD 4 ;定义X的长度为4字节,位置为0 xF10000+8 注意,此处之定义了一个数据结构并未分配存储单元,想要分配需要配合SPACE等指令,11.取相对地址初始化内存单元DCDO,语法格式: lable DCDO expr,expr. 作用:分配一段字内存单元(字对齐),并将子单元的内容初始化为expr给予静态基址寄存器R9内容的偏移量。 lable可选取的标号; expr数字表达式或为程序标号,内存分配的字数是由expr的个数决定的。,12.分配代码存储单元DCI,语法格式: lable DCIexpr 作用:用于分配一段内存单元,并用伪操作中的表达式expr所指定的值进行初始化

23、。 lable可选取的标号,是内存块起始地址的标号; expr数字表达式(整数)或为程序标号。,6.3.3 汇编代码控制伪操作,汇编器在对程序代码进行编译时,会根据汇编控制伪操作的定义情况对程序进行编译,常用的有条件编译、重复汇编和宏定义,IF条件编译伪操作 语法格式: IFlogical_expression 程序代码段A ELSE 程序代码段B ENDIF,举例 IF UART0=ON BL UART0_init ELSE BL UART1_init ENDIF,WHILE条件编译伪操作 语法格式: WHILElogical_expression 程序代码段 WEND,举例: counte

24、r SETA 100 WHILE counter0 counter SETA counter-1 WEND,MACRO宏定义伪操作 语法格式: MACRO $labelmacroname$parameter,$ parameter 程序代码段 MEND,举例:测试跳转指令 MACRO $label TestAndBranch $dest,$reg,$cc $label CMP $reg,#0 B $CC $dest MEND,6.3.4 汇编信息报告控制伪操作,信息报告伪操作用于程序汇编指示,主要是在程序调试阶段使用。这类伪操作分为错误信息报告伪操作、诊断信息报告伪操作、列表选项设置伪操作、插

25、入文件标题伪操作,错误信息报告ASSERT 语法格式: ASSERT logical_expression 其中: logical_expression用于表示编译条件的逻辑表达式。 ASSERT用来表示程序的编译必须满足一定条件,如果逻辑表达式不满足,编译器会报错。 例如: ASSERT ver7 ;保证内核版本ver7,诊断信息报告INFO INFO numeric_expression, string_expression 其中: numeric_expression数字表达式。如果numeric_expression为0,则在第二遍扫描时,伪操作打印string_expression的

26、内容;如果numeric_expression的值不为0,则在汇编处理中,第一遍扫描时,伪操作打印string-expression的内容,并终止汇编。,列表选项设置OPT OPT为编译列表选项设置伪操作,用于在源程序中设置汇编列表选项。 语法格式: OPT n 其中: n 是OPT 指令设置选项编号。教材中表6-5列出了有效的选项编号及其含义。,插入文件标题伪操作TTL与SUBT 语法格式: TTL title SUBT subtitle 其中: title 为所插入的列表文件的标题; subtitle为所插入的列表文件的子标题。,6.3.5 指令集类型标识伪操作,指令集类型标识伪操作用来告

27、诉编译器所处理的是32位的ARM指令还是16的Thumb指令,实现这一操作的操作符有ARM、CODE32、THUMB、CODE16,指令集类型标识伪操作,例如: CODE32 ;32位ARM指令 AREA |.text|,CODE,READONLY LDR R0,=0 x8500 +1 BX R0 ;程序跳转,并将处理器切换到Thumb状态 CODE16 ;16位Thumb状态 ADD R3,R3,1 END ;源文件结束,段属性定义伪操作AREA 段属性定义伪操作AREA用于定义一个代码段或数据段,AREA 伪操作指示汇编器汇编新的代码段或数据段。段是不可分的已命名独立代码或数据块,它们由链

28、接器处理。 语法格式: AREA sectionname,attr,attr.,说明:AREA用于定义一个代码段、数据段或者特定属性段。如果段名以数字开头,那么该段名需要用“|”字符括起来如|7ss|,用C编译器产生的代码一般也用“|”括起来 属性部分表示该段代码段/数据段的相关属性,多个属性可以用“,”分隔。 常见属性如下: DATA:定义数据段 CODE:定义代码段 READONLY:本段为只读 READWRITE:本段为可读写 ALIGN=表达式,默认对齐方式为2,如表达式=3,则对齐方式为8字节对齐,表达式的取值范围为0-31 COMMON属性:定义一个通用段,这个段不包含用户代码和数

29、据。,对齐方式设置ALIGN 对齐方式设置ALIGN 伪操作通过用零或 NOP 指令进行填充来使当前位置与指定的边界对齐。 语法格式: ALIGN expr,offset,pad , padsize ,举例: CODE32 AREA |.data|,DATA,READWRITE,ALIGN=2 该段代码为32位ARM指令 引用了一个C的数据段,声明程序的入口点ENTRY ENTRY 伪操作声明程序的入口点。 语法格式: ENTRY 说明:在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定。,举例: AREA armex,CODE,READON

30、LY ENTRY ;程序入口地址 ;指令代码,源程序结尾标识END END 伪操作通知汇编程序它已到达源文件的末尾。 语法格式: END,6.3.6 文件包含伪操作,文件包含伪操作包括两类: 一类是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理; 另一类是也将一个源文件包含到当前源文件中,但被包含文件不进行汇编处理。,文件包含GET 或 INCLUDE 语法格式: GET filename INCLUDE filename 其中: filename 是要在汇编中包含的文件名称。汇编程序接受 UNIX 或 MS-DOS格式的路径名。类似于C语言中的#include GET C:TESTINCLUDE_INIT.S,文件原样包含INCBIN 语法格式: INCBIN filename 其中: filename 是要在汇编中包含的文件名称。 汇编程序接受 UNIX 或 MS-DOS格式的路径名。 INCBIN C:TESTINCLUDE_INIT.S 注意,与INCLUDE不同点在于不进行汇编,可以用来包含可执行文件、文字或者其他数据,文件的内容将按字节逐一添加到当前ELF节中。,6.3.7其他类型伪操作,对齐方式设置ALIGN 段属性定义伪操作AREA 源程序结尾标识E

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论