ARM汇编伪指令与伪操作

上传人:豆浆 文档编号:50845431 上传时间:2018-08-11 格式:PPT 页数:78 大小:292KB
返回 下载 相关 举报
 ARM汇编伪指令与伪操作_第1页
第1页 / 共78页
 ARM汇编伪指令与伪操作_第2页
第2页 / 共78页
 ARM汇编伪指令与伪操作_第3页
第3页 / 共78页
 ARM汇编伪指令与伪操作_第4页
第4页 / 共78页
 ARM汇编伪指令与伪操作_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《 ARM汇编伪指令与伪操作》由会员分享,可在线阅读,更多相关《 ARM汇编伪指令与伪操作(78页珍藏版)》请在金锄头文库上搜索。

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

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

3、A00n汇编后:nMOV R0, #435207TM7n例如:LDR R0,=0x12345678;加载32位立即数LDR R0,=DATA_BUF+60; 加载DATA_BUF+60LTORG ;声明文字池8TM8n2中等范围地址读取伪指令ADRLn它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 字节对 齐-64K64K,字对齐取值范围-256K256KnADRLcond register , = expression9TM9n汇编器在处理源程序时,ADRL伪指令被两 条具有ADRL等同功能的ARM指令(通常用 ADD或SUB指令)替代。n如果不能用两条指令实现AD

4、RL伪指令的功能,则编译器报告错误,编译失败。 10TM10n以下指令存放在0x8000起始的地址单元,分析汇编后的结果。n.global _startn.textn_start:nMOVR0,#0x0FnADRL R0,_startn.endn解:汇编后的结果为:n0x00008000MOV R0, #0x0Fn0x00008004SUB R0, PC, #12n0x00008008NOP (MOV R0,R0)11TM11n例如:ADRL R0,DATA_BUFADRL R1,DATA_BUF+80DATA_BUF SPACE 100 ;定义100字节缓冲区12TM12n3小范围地址读取伪

5、指令ADRn它将基于PC相对偏移的地址值或基于寄存器相对偏 移的地址值读取到寄存器中。当地址是非字对齐时 ,取值范围为-255+255,字对齐时取值范围- 10201020nADRcond register , = expressionn在汇编表示ADR这条伪指令会被编译器替换成一条 合适的指令如ADD,SUB,如果不能被替换则产生错 误,编译失败。13TM13n下列指令存放在0x8000起始的地址单元,分析汇编后的结果。n.global _startn.textn_start:nMOVR0,#0x0FnADRR0,_startn.endn解:汇编后的结果为:n0x00008000MOV R0

6、, #0x0Fn0x00008004SUB R0, PC, #1214TM14n例如:LOOP MOV R1,#0xF0ADR R2,LOOP ;将LOOP的地址放入R2ADR R3,LOOP+415TM15n4空操作伪指令NOPnNOP是空操作伪指令,在汇编时将会被替代 成ARM中的空操作 ,只占用一个机器时间, 可以翻译为MOV R0,R016TM166.2 ARM汇编语言伪操作n伪操作(Directive)是ARM汇编语言程序里的 一些特殊的指令助记符,其作用主要是为完成 汇编程序做各种准备工作,对源程序运行汇编 程序处理,而不是在计算机运行期间由处理器执行。n伪操作只是汇编过程中起作用

7、,一旦汇编结束,伪操作也就随之消失。17TM17n目前常用的编译环境有2种:n1. ADS/SDT、RealView MDK等ARM公司推出的开发工具n2. GNU ARM开发工具18TM18n1. ADS/SDT、RealView MDK等ARM公司推出的开发工具nADS由ARM公司推出,使用了CodeWarrior公司的 编译器。针对ARM资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种ARM 开发工具的能力。n 以ARM为目标平台的工程创建向导,可以使用户 以此为基础,快速创建ARM和Thumb工程。 19TM19nARM 将Keil 公司收购之后,正式推出了针

8、对ARM 微控制器的开发工具RealView Microcontroller Development Kit ( 简称Real View MDK 或者 MDK) ,它将ARM 开发工具RealView Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是 一款非常强大的ARM 微控制器开发工具。 20TM20n2. GNU ARM开发工具nGNU是“GNUs Not Unix”的递归缩写。在1983年9 月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。 nGNU格式ARM汇编

9、语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的 基于ARM平台的编译工具有主要由GNU的汇编器 as,交叉汇编器gcc和连接器ld组成。21TM216.3 ARM汇编伪操作nARM公司推出的开发工具所支持的汇编伪操作包括符号定义伪操作、数据定义伪操作、 汇编信息报告控制伪操作、汇编代码控制伪操作、文件包含伪操作、指令集类型标识伪 操作以及其他功能伪操作。22TM226.3.1 符号定义伪操作 作用:用于定义ARM汇编程序中的变量,对变量赋值以及定义 寄存器的别名等。n局部变量定义LCLA、LCLL及LCLSn全局变量定义GBLA、GBLL及GBLSn变量赋值的S

10、ETA 、 SETL 和SETSn为通用寄存器列表定义名称的RLIST。为什么要定义使用变量?n1.增强可读性便于交流和记忆n2.充分利用编译器的资源 ,提高工作效率n3.方便修改 n4.不必关心存储空间23TM23局部变量定义:LCLA、 LCLL和LCLSn语法格式nLCLA variable ;定义一个局部的数字变量,初始化为0nLCLL variable ;定义一个局部的逻辑变量,初始化为FnLCLS variable ;定义一个局部的字符串变量,初始化为空其中:variable所说明的局部变量名称。在其局部作用范 围内,变量名必须唯一,例如在宏内。24TM24n全局变量定义GBLA、

11、GBLL及GBLS;伪操作定义一个汇 编程序的全局变量并初始化。语法格式nGBLA variable ;定义一个全局的数字变量,初始化为0nGBLL variable ;定义一个全局逻辑变量,初始化为FnGBLS variable ;定义一个全局字符串变量,初始化为空其中:nvariable 所说明的全局变量名称。在整个程序中变量名必 须唯一。25TM25n变量赋值伪操作SETA、SETL及SETSn语法格式nvariable_aSETAexpr_anvariable_lSETL expr_lnvariable_sSETS expr_sn格式中的变量名必须为已经定义过的全局或者局 部变量,EX

12、PR_*为将要赋值给变量的值。26TM26变量定义赋值举例n举例:GBLA TEMPER ;先声明一个算术全局变量TEMPER SETA 0x0F2003B*2 ;对这个全局变另赋值LCLL STATUS ;声明一个局部逻辑变量STATUS SETL TRUE ;为该逻辑变量赋值GBLS STRING ;声明一个全局字符串变量STRING SETS “CONNECTION IS RIGHT” ;为该字符串变量赋值27TM27给通用寄存器列表定义名称RLISTn语法格式nnameRLISTregisters_listn其中:nname寄存器列表的名称;nregisters_list 通用寄存器列

13、表。n说明:RLIST可用于对一个通用寄存器列表定义名称,该 名称可在ARM指令LDM/STM中使用。n在LDM/STM指令中,列表中的寄存器为根据寄存器的编 号由低到高访问次序,与列表中的寄存器排列次序无关。28TM28n举例:PBLOCK RLIST R0-R3,R7,R5,R9LDM R4!,PBLOCK;将寄存器列表名称定义为PBLOCK,可在 ARM指令LDM/STM中通过该名称访问寄存器列表。29TM29nVFP寄存器名称定义DN、SNnnameDN exprnnameSN exprn其中:nnameVFP寄存器的名称;nexpr要定义的VFP寄存器编号:双精度 寄存器编号范围为0

14、15,单精度寄存器编号范围 为031。30TM30nFPA浮点寄存器定义名称FNn语法格式nnameFN exprn其中:nnameFPA浮点寄存器的名称;nexpr要定义的FPA浮点寄存器编号:编 号范围为07。31TM31n协处理器名称定义CPn语法格式nnameCP exprn其中:nname定义的协处理器的名称;nexpr要定义名称的协处理器编号:编号 范围为015。32TM32n协处理器寄存器名称定义CNn语法格式nnameCN exprn其中:nname定义的协处理器的寄存器名称;nexpr要定义名称的协处理器的寄存器编 号:编号范围为015。33TM336.3.2 数据定义伪操作

15、 n数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分 配存储单元的初始化 。n有如下几种:DCB 字节分配DCW/DCWU 半子(2字节)分配DCD/DCDU 字(4字节)分配DCQ/DCQU 8个字节分配DCFS/DCFSU 单精度浮点数分配DCFD/DCFDU 双精度浮点数分配SPACE 分配一块连续的存储单元FIELD 定义一个结构化的内存表的数据域MAP 定义一个结构化的地址表首地址LTORG 声明一个数据缓冲区34TM341.分配字节存储单元DCBn语法格式 labelDCBexpr, expr nDCB可用“=”代替n其中:label可选的程序标号;expr是-128255之间的数字或字符串。n例如:Array1 DCB 1,2,3,4,5 ;数组str1 DCB “you are welcome!” ;构造字符串并分配空间35TM352.分配半字存储单元DCW及DCWU语法格式nlabelDCW expr, expr nlabelDCWUexpr, expr n其中:nlabel可选的程序标号;nExpr 是-3276865535之间的数字表达式(半字)。nDCW要求存储空间是半字对齐,DCWU不要求nArrayw1 DCW 0xa,-0xb ;构造固定数组并分配半字 存储单元36TM363.分配字存储单元DCD及DCDUn语法格

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号