




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章ARM汇编伪指令与伪操作本章将详细介绍进行汇编语言程序设计时所用的ARM/Thumb汇编语言伪指令、由ARM公司推出的开发工具所支持的伪操作以及GNUARM开发工具所支持的伪操作。
内容提要6.1汇编语言伪指令6.2ARM汇编语言伪操作6.3ARM汇编伪操作6.4GNUARM汇编伪操作6.1汇编语言伪指令伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。
6.1.1ARM汇编语言伪指令1.大范围地址读取伪指令LDRLDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。LDR{cond} register,=expression6.1.1ARM汇编语言伪指令如果加载的常数符合MOV或MVN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。如果加载的常数不符合MOV或MVN指令立即数的要求,汇编器将常量放入内存文字池,并使用一条程序相对偏移的LDR指令从内存文字池读出常量。
6.1.1ARM汇编语言伪指令例:伪指令语句: LDR R0, =0x0AA00;R0<—0x0AA00 LDRR1,=0xAABBCCDD汇编后分别为:
MOV R0, #43520(#0xAA00) LDRR1,[PC,offset_Lpool] ……Lpool DCD0xAABBCCDD6.1.1ARM汇编语言伪指令2.中等范围地址读取伪指令ADRL它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。
ADRL{cond} register,expression6.1.1ARM汇编语言伪指令汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用两条指令实现ADRL伪指令的功能,则编译器报告错误,编译失败。
6.1.1ARM汇编语言伪指令以下指令存放在0x8000起始的地址单元,分析汇编后的结果。start
MOV R0, #0x0F ADRL R0, start解:汇编后的结果为:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)6.1.1ARM汇编语言伪指令3.小范围地址读取伪指令ADR它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址是字节对齐时,取值范围为-255~+255
ADR{cond} register,expression汇编器在处理源程序时,ADR伪指令被一条具有ADR等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用一条指令实现ADR伪指令的功能,则编译器报告错误,编译失败。
6.1.1ARM汇编语言伪指令下列指令存放在0x8000起始的地址单元,分析汇编后的结果。.global_start.text_start:
MOV R0, #0x0F ADR R0, _start.end解:汇编后的结果为:0x00008000 MOVR0,#0x0F0x00008004 SUB R0,PC,#126.1.1ARM汇编语言伪指令ADR、ADRL、LDR的区别取值范围不同ADR:-255~+255/-1020~+1020ADRL:-64KB~+64KB/-256KB~+256KBLDR:LDR伪指令处的PC值到数据缓冲区的目标数据所在的地址之间的偏移量必须小于4KB。使用方法不同ADR、ADRL只能取同一段中标号的地址;LDR还可以取不同段中的标号地址或一个指定的立即数ADR、ADRL与LDR书写标号时语法有区别6.1.1ARM汇编语言伪指令4.空操作伪指令NOPNOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作.例如MOVR0,R0ADDR0,R0,#0SUBR0,R0,#06.2 ARM汇编语言伪操作伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。目前常用的编译环境有2种:1.
ADS/SDT、RealViewMDK等ARM公司推出的开发工具2.
GNUARM开发工具1.
ADS/SDT、RealViewMDK等ARM公司推出的开发工具ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在CodeWarriorIDE集成环境下配置各种ARM开发工具的能力。以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。ARM将Keil
公司收购之后,正式推出了针对ARM微控制器的开发工具RealView
MicrocontrollerDevelopmentKit(简称RealViewMDK或者MDK),它将ARM开发工具RealViewDevelopmentSuite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。2.
GNUARM开发工具GNU是“GNU‘sNotUnix”的递归缩写。在1983年9月27日由RichardStallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器gcc和连接器ld组成。6.3ARM汇编伪操作ARM公司推出的开发工具所支持的汇编伪操作包括符号定义伪操作、数据定义伪操作、汇编信息报告控制伪操作、汇编代码控制伪操作、文件包含伪操作、指令集类型标识伪操作以及其他功能伪操作。6.3.1符号定义伪操作
符号定义伪操作用于在ARM汇编程序中定义变量、给寄存器定义别名和对变量进行赋值等操作。1.局部变量定义LCLA、LCLL及LCLS语法格式:LCLA variableLCLL variableLCLS variable
功能:定义局部变量并初始化。其中:variable 所说明的局部变量名称。6.3.1符号定义伪操作2.全局变量定义GBLA、GBLL及GBLS语法格式GBLA variableGBLL variableGBLS variable
功能:定义全局变量并初始化。其中:variable 所说明的全局变量名称。在整个程序范围内必须唯一。6.3.1符号定义伪操作3.变量赋值伪操作SETA、SETL及SETS语法格式variable_a SETA expr_a
variable_l SETL expr_l
variable_s SETS expr_s
6.3.1符号定义伪操作例6-10定义全局变量并赋值 GBLAa_var GBLLl_var GBLSs_vara_var SETA0xFFl_var SETL{TRUE}s_var SETS“AABCD”变量如何在ARM语句中使用?MOVR0,#a_var6.3.1符号定义伪操作4.给通用寄存器列表定义名称RLIST语法格式name RLIST {registers_list}其中:name 寄存器列表的名称;registers_list
通用寄存器列表。例:Reglist RLIST{R0-R2,R5,R7,R10-R12}如何在ARM语句中使用? LDMFDR13!,Reglist6.3.2数据定义伪操作
数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化。6.3.2数据定义伪操作1.分配字节存储单元DCB语法格式
{label} DCB expr{,expr}…其中:label 可选的程序标号;expr
是-128~255之间的数字或字符串。例:Str_bufferDCB“ARM7andARM9”,0x0,0x16.3.2数据定义伪操作2.分配半字存储单元DCW及DCWU语法格式{label} DCW expr{,expr}…{label} DCWU expr{,expr}…其中:label 可选的程序标号;expr
是-32768~65535之间的数字表达式。例:data_buffer1 DCW0x1,0x2,0x3 data_buffer2 DCWU0x1,0x2,0x36.3.2数据定义伪操作3.分配字存储单元DCD及DCDU语法格式{label} DCD expr{,expr}…{label} DCDU expr{,expr}…其中:label 可选的程序标号;expr
表达式。例:data_buffer1 DCD0x1,0x2,0x3 data_buffer2 DCDU0x1,0x2,0x36.3.2数据定义伪操作8.分配存储空间SPACE语法格式
{label} SPACE expr其中:label 可选的程序标号;expr
分配的字节数。功能:分配一片连续的字节存储区域并将其初始化为0。6.3.3汇编代码控制伪操作汇编器在对程序代码进行编译时,会根据汇编控制伪操作的定义情况对程序进行编译,常用的有条件编译、重复汇编和宏定义
6.3.3汇编代码控制伪操作1.IF条件编译伪操作:根据条件来决定是否对一段程序代码进行编译语法格式:IF logical_expression
程序代码段A {ELSE
程序代码段B}ENDIF例:IF UART0=ON BLUART0_initELSE BLUART1_initENDIF6.3.3汇编代码控制伪操作2.WHILE条件编译伪操作语法格式:WHILElogical_expression
程序代码段WEND功能:重复编译程序代码段直到logical_expression不成立。例:counterSETA100WHILEcounter>0 ……counterSETAcounter-1WEND6.3.3汇编代码控制伪操作3.MACRO宏定义伪操作语法格式:MACRO{$label} macroname {$parameter{,$parameter}…}
程序代码段MEND其中:{$label}在宏指令被展开时,标号被替换成用户定义的符号
{$parameter…}为宏的参数列表,当宏被展开时被替换为相应的值。功能:将一段程序代码定义成一个宏。6.3.3汇编代码控制伪操作3.MACRO宏定义伪操作宏在调用时被替换展开,没有其他的附加操作。宏多用于所定义的程序代码量较小,而需要传送参数比较多的场合。相对子程序调用而言,能有效提高处理速度。如果变量在宏定义中被定义,则该变量只在该宏定义体中有效。6.3.3汇编代码控制伪操作3.MACRO宏定义伪操作例6-30(验证)在ARM和Thumb代码中,测试并跳转操作需要执行两条ARM指令。可以定义一个与下面类似的宏来实现相应的操作:MACRO $labelTestAndBranch$dest,$reg,$cc $labelCMP$reg,#0
B$cc$destMEND6.3.3汇编代码控制伪操作3.MACRO宏定义伪操作例6-30
(续)宏调用:testTestAndBranchNonZero,R0,NE ….NonZero替换后将变成:test CMPR0,#0 BNENonZero …NonZero…6.3.4汇编信息报告控制伪操作
信息报告伪操作用于程序汇编指示,主要是在程序调试阶段使用。这类伪操作分为错误信息报告伪操作、诊断信息报告伪操作、列表选项设置伪操作、插入文件标题伪操作
6.3.4汇编信息报告控制伪操作1、错误信息报告ASSERT
语法格式:ASSERTlogical_expression其中:logical_expression用于表示的条件的逻辑表达式。功能:用于保证源程序被汇编时满足相关的条件。如果汇编时逻辑表达式logical_expression不成立,ASSERT将报告错误信息。6.3.4汇编信息报告控制伪操作2、诊断信息报告INFOINFOnumeric_expression,string_expression其中:numeric_expression数字表达式。如果numeric_expression为0,则在第二遍扫描时,伪操作打印string_expression的内容;如果numeric_expression的值不为0,则在汇编处理中,第一遍扫描时,伪操作打印string-expression的内容,并终止汇编。6.3.4汇编信息报告控制伪操作3、列表选项设置OPT
OPT为编译列表选项设置伪操作,用于在源程序中设置汇编列表选项。语法格式:OPT n其中:n是OPT指令设置选项编号。教材中表6-5列出了有效的选项编号及其含义。6.3.4汇编信息报告控制伪操作4、插入文件标题伪操作TTL与SUBT语法格式:TTLtitleSUBTsubtitle其中:title为所插入的列表文件的标题;subtitle为所插入的列表文件的子标题。功能:TTL/SUBT在列表文件显示一个标题/子标题。如果要在列表文件的第一页显示标题/子标题,TTL/SUBT要放在源程序的第一行。6.3.5指令集类型标识伪操作
指令集类型标识伪操作用来告诉编译器所处理的是32位的ARM指令还是16位的Thumb指令,实现这一操作的操作符有ARM、CODE32、THUMB、CODE16
指令集类型标识伪操作
6.3.5指令集类型标识伪操作例: AREAARMThumb,CODE,READONLY ENTRY CODE32start ADRR0,into_thumb+1 BXR0 CODE16into_thumb MOVSR0,#10 ……6.3.6文件包含伪操作
文件包含伪操作包括两类:一类是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理;另一类是也将一个源文件包含到当前源文件中,但被包含文件不进行汇编处理。
6.3.6文件包含伪操作 1.文件包含GET或INCLUDE语法格式:GET filenameINCLUDE filename其中:filename是要在汇编中包含的文件名称。汇编程序接受UNIX或MS-DOS格式的路径名。功能:将一个源文件包含到当前源文件并进行汇编处理。例: AREAExample,CODE,READONLY GETinclude_s.s GETd:\test\include_s.s6.3.6文件包含伪操作 2、文件原样包含INCBIN
语法格式:INCBIN filename其中:filename是要在汇编中包含的文件名称。汇编程序接受UNIX或MS-DOS格式的路径名。功能:将一个文件包含到当前源文件中,该文件按原样包含,不进行汇编处理。通常用于将目标文件或数据文件包含到当前源文件中。例: …… INCBINa1.dat
INCBINa2.o6.3.7其他类型伪操作
对齐方式设置ALIGN段属性定义伪操作AREA
源程序结尾标识END
声明程序的入口点ENTRY
定义常量或标号名称EQU
声明全局标号EXPORT或GLOBAL
将符号导出到目标文件EXPORTAS
外部符号声明IMPORT和EXTERN保留局部符号KEEP
禁止使用浮点指令NOFP
指定段的相关性REQUIRE
堆栈八字节对齐REQUIRE8和PRESERVE8
局部变量范围定义ROUT6.3.7其他类型伪操作 1.对齐方式设置ALIGN
对齐方式设置ALIGN伪操作通过用零或NOP指令进行填充来使当前位置与指定的边界对齐。语法格式:ALIGN{expr{,offset{,pad{,padsize}}}}expr:用于指定对齐方式,值为2的n次幂,0≤n≤31;offset:表示偏移量,可以是任何数值表达式;pad:数值表达式,用于对齐时填充的内容;padsize:可以为1、2、4,用于指定pad的类型(字节/半字/ 字)6.3.7其他类型伪操作 1.对齐方式设置ALIGN
使用场景:ADR伪指令用于Thumb代码时只能加载字对齐的地址,但Thumb代码内的标签可能不是字对齐的,此时须使用ALIGN4来保证代码内地址为4字节对齐;使用ALIGN可确保ARM处理器高速缓存的使用效率。例如使用ALIGN16来确保在16字节边界上对齐函数入口点;LDRD和STRD双字数据传送必须是8字节对齐的,此时就在内存分配指令(如DCQ)前使用ALIGN8.6.3.7其他类型伪操作 2.段属性定义伪操作AREA
汇编程序采用分段设计,段属性定义伪操作AREA用于定义一个代码段或数据段,AREA伪操作指示汇编器汇编新的代码段或数据段。段是不可分的已命名独立代码或数据块,它们由链接器处理。语法格式:AREAsectionname{,attr}{,attr}...6.3.7其他类型伪操作 2.段属性定义伪操作AREAsectionname:段名。如果以数字开始必须包含在“|…|”内;attr:段属性,常用的选项如下:1)ALIGN=expr:规定段为2expr字节对齐,取值2~31;2)CODE:指定该段为代码段,此时READONLY为默认属性;3)DATA:定义数据段,默认属性为READWRITE;4)READONLY:指定该段只读;5)READWRITE:指定该段可读可写。6.3.7其他类型伪操作 2.段属性定义伪操作AREA注意事项:一组汇编代码必须有一个AREA指令;可以在多个AREA指令中使用相同的名称,名称相同的所有区域都放在相同的ELF段中。通常对代码和数据使用不同的ELF段。6.3.7其他类型伪操作 3、源程序结尾标识ENDEND伪操作通知汇编程序它已到达源文件的末尾。语法格式: END6.3.7其他类型伪操作 4、声明程序的入口点ENTRY
ENTRY伪操作声明程序的入口点。语法格式: ENTRY注意:必须为一个程序指定至少一个ENTRY点;一个源文件内不能使用多个ENTRY指令;并非每个源文件都必须包含ENTRY指令。例: AREAARMex,CODE,READONLY ENTRY MOVR0,#1 ……6.3.7其他类型伪操作 5、定义常量或标号名称EQU
功能:为数值常量、标号指定一个符号名称。语法格式:nameEQUexpr{,type}其中:name:是要为数值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语语法知识拓展:高一阶段
- 给岑老师的一封信650字13篇范文
- 六年级数学数对练习题
- 胜似亲人作文800字(7篇)
- 长途汽车运输合同
- 驾校教练车承包合同
- 公交公司拓展活动方案
- 七年级英语语法新解
- 太阳的宇宙周游记250字8篇
- 公众场合活动方案
- 2023年上海市普通高中学业水平合格性考试物理试题(含答案)
- 杭州市拱墅区2024-2025学年数学五下期末统考试题含答案
- 2024年四川省资阳市中考物理试题【含答案、解析】
- 肉鸭养殖项目可行性研究报告
- 室内混凝土地面拆除施工方案
- 《园林绿化工程施工方案》知识培训
- 武汉大学《遗传学A》2023-2024学年第二学期期末试卷
- 老年护理人文关怀
- 2024年广东省广州市中考物理试题(含答案)
- 2025年度新能源充电桩建设劳务分包合同模板
- 电表合表申请书
评论
0/150
提交评论