1 / 75

大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut.edu.cn 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. 本章将详细介绍进行汇编语言程序设计时所用的 ARM/Thumb 汇编语言伪指令、由 ARM 公司推出的开发工具所支持的伪操作以及 GNU ARM 开发工具所支持的伪操作。. 第 6 章 ARM 汇编伪指令与伪操作. 内容提要. 6 . 1 汇编语言伪指令 6 . 2 ARM 汇编语言伪操作

lynde
Download Presentation

大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARM嵌入式系统结构与编程 • 大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: qiutie@dlut.edu.cn 参考教材:《ARM嵌入式系统结构与编程》 清华大学出版社2009年3月出版

  2. 本章将详细介绍进行汇编语言程序设计时所用的ARM/Thumb汇编语言伪指令、由ARM公司推出的开发工具所支持的伪操作以及GNU ARM开发工具所支持的伪操作。 第6章 ARM汇编伪指令与伪操作

  3. 内容提要 6.1 汇编语言伪指令 6.2 ARM汇编语言伪操作 6.3 ARM汇编伪操作 6.4 GNU ARM汇编伪操作

  4. 6.1 汇编语言伪指令 • 伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。

  5. ARM汇编语言伪指令 • 1.大范围地址读取伪指令LDR • LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。 • LDR{cond} register , = expression

  6. 如果加载的常数符合MOV或MVN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。如果加载的常数符合MOV或MVN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。 • 如果加载的常数不符合MOV或MVN指令立即数的要求,汇编器将常量放入内存文字池,并使用一条程序相对偏移的LDR指令从内存文字池读出常量。

  7. 伪指令语句: • LDR R0, =0x0AA00;R0<—0x0AA00 • 汇编后: • MOV R0, #43520

  8. 2.中等范围地址读取伪指令ADRL • 它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 • ADRL{cond} register , = expression

  9. 汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。 • 如果不能用两条指令实现ADRL伪指令的功能,则编译器报告错误,编译失败。

  10. 以下指令存放在0x8000起始的地址单元,分析汇编后的结果。以下指令存放在0x8000起始的地址单元,分析汇编后的结果。 • .global _start • .text • _start: • MOV R0, #0x0F • ADRL R0, _start • .end • 解:汇编后的结果为: • 0x00008000 MOV R0, #0x0F • 0x00008004 SUB R0, PC, #12 • 0x00008008 NOP (MOV R0,R0)

  11. 3.小范围地址读取伪指令ADR • 它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址是字节对齐时,取值范围为-255~+255 • ADR{cond} register , = expression

  12. 下列指令存放在0x8000起始的地址单元,分析汇编后的结果。下列指令存放在0x8000起始的地址单元,分析汇编后的结果。 • .global _start • .text • _start: • MOV R0, #0x0F • ADR R0, _start • .end • 解:汇编后的结果为: • 0x00008000 MOV R0, #0x0F • 0x00008004 SUB R0, PC, #12

  13. 4.空操作伪指令NOP • NOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作 .

  14. Thumb汇编语言伪指令 • 1.大范围地址读取伪指令LDR • LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。其语法格式如下: • LDR register , = expression

  15. 2.小范围地址读取伪指令ADR • ADR为小范围地址读取伪指令,它将基于PC相对偏移的地址值读取到寄存器中。偏移量必须是正数并小于1KB。 • ADR register , = expression 相当于PC寄存器或其它寄存器的长转移。

  16. 汇编器在处理源程序时,ADR伪指令一条具有ADR等同功能的thumb指令(通常用ADD或SUB指令)替代。汇编器在处理源程序时,ADR伪指令一条具有ADR等同功能的thumb指令(通常用ADD或SUB指令)替代。 • 如果不能用一条指令实现ADR伪指令的功能,则编译器报告错误,编译失败。

  17. 3.空操作伪指令NOP • NOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作(也就是什么也没做)指令,例如可能为:“MOV R0,R0” • NOP • 空操作伪指令可用于延时操作。

  18. 伪指令在汇编编程时应用较多,具本应用请参考教材《ARM嵌入式系统结构与编程》第6章6.1节实例分析伪指令在汇编编程时应用较多,具本应用请参考教材《ARM嵌入式系统结构与编程》第6章6.1节实例分析

  19. 6.2 ARM汇编语言伪操作 • 伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。 • 伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。

  20. 目前常用的编译环境有2种: • 1.       ADS/SDT、RealView MDK等ARM公司推出的开发工具 • 2.   GNU ARM开发工具

  21. 1.       ADS/SDT、RealView MDK等ARM公司推出的开发工具 • ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种ARM 开发工具的能力。 • 以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。

  22. ARM 将Keil 公司收购之后,正式推出了针对ARM 微控制器的开发工具RealView Microcont roller Development Kit ( 简称Real View MDK 或者MDK) ,它将ARM 开发工具RealView Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM 微控制器开发工具。

  23. 2.   GNU ARM开发工具 • GNU是“GNU‘s Not Unix”的递归缩写。在1983年9月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。 • GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器gcc和连接器ld组成。

  24. 6.3 ARM汇编伪操作 • ARM公司推出的开发工具所支持的汇编伪操作包括符号定义伪操作、数据定义伪操作、汇编信息报告控制伪操作、汇编代码控制伪操作、文件包含伪操作、指令集类型标识伪操作以及其他功能伪操作。

  25. 符号定义伪操作 • 局部变量定义LCLA、LCLL及LCLS • 语法格式 • LCLA variable • LCLL variable • LCLS variable • 其中: • variable 所说明的局部变量名称。

  26. 全局变量定义GCLA、GCLL及GCLS • 语法格式 • GCLA variable • GCLL variable • GCLS variable • 其中: • variable 所说明的全局变量名称。

  27. 变量赋值伪操作SETA、SETL及SETS • 语法格式 • variable_a SETA expr_a • variable_l SETL expr_l • variable_s SETS expr_s

  28. 给通用寄存器列表定义名称RLIST • 语法格式 • name RLIST {registers_list} • 其中: • name 寄存器列表的名称; • registers_list 通用寄存器列表。

  29. VFP寄存器名称定义DN、SN • name DN expr • name SN expr • 其中: • name VFP寄存器的名称; • expr 要定义的VFP寄存器编号:双精度寄存器编号范围为0~15,单精度寄存器编号范围为0~31。

  30. FPA浮点寄存器定义名称FN • 语法格式 • name FN expr • 其中: • name FPA浮点寄存器的名称; • expr 要定义的FPA浮点寄存器编号:编号范围为0~7。

  31. 协处理器名称定义CP • 语法格式 • name CP expr • 其中: • name 定义的协处理器的名称; • expr 要定义名称的协处理器编号:编号范围为0~15。

  32. 协处理器寄存器名称定义CN • 语法格式 • name CN expr • 其中: • name 定义的协处理器的寄存器名称; • expr 要定义名称的协处理器的寄存器编号:编号范围为0~15。

  33. 数据定义伪操作 • 数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化 。

  34. 分配字节存储单元DCB • 语法格式 • {label} DCB expr{, expr }… • 其中: • label 可选的程序标号; • expr 是-128~255之间的数字或字符串。

  35. 分配半字存储单元DCW及DCWU • 语法格式 • {label} DCW expr{, expr }… • {label} DCWU expr{, expr }… • 其中: • label 可选的程序标号; • expr 是-32768~65535之间的数字表达式。

  36. 分配字存储单元DCD及DCDU • 语法格式 • {label} DCD expr{, expr }… • {label} DCDU expr{, expr }… • 其中: • label 可选的程序标号; • expr 表达式。

  37. 分配单精度浮点数存储单元DCFS及DCFSU • 语法格式 • {label} DCFS fpliteral{, fpliteral }… • {label} DCFSU fpliteral{, fpliteral }… • 其中: • label 可选的程序标号; • fpliteral 单精度浮点表达式,取值范围:1.17549435e-38~3.4028234e+38。

  38. 分配双精度浮点数存储单元DCFD及DCFDU • {label} DCFD fpliteral{, fpliteral }… • {label} DCFDU fpliteral{, fpliteral }… • 其中: • label 可选的程序标号; • fpliteral 双精度浮点表达式,取值范围:2.22507385850720138e-308~1.7976931348623157e+308。

  39. 分配双字存储单元DCQ及DCQU • 语法格式 • {label} DCQ {-}expr{, {-}expr }… • {label} DCQU {-}expr{, {-}expr }… • 其中: • label 可选的程序标号; • expr 用于初始化内存的数字或表达式,其数值必须是整数。e

  40. 声明数据缓冲池LTORG • 在使用LDR伪指令时,要在适当的位置加入LTROG声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器会在程序末尾自动声明。 • 语法格式 • LTROG

  41. 分配存储空间SPACE • 语法格式 • {label} SPACE expr • 其中: • label 可选的程序标号; • expr 分配的字节数。

  42. 定义结构化内存表首地址MAP • 语法格式 • MAP expr{,base_register} • 其中: • 结构化内存表的首地址为expr与base_register之和。

  43. 定义结构化内存表数据域FIELD • 语法格式 • {label} FIELD expr • 其中: • label 可选的程序标号,当指定这一选项时,label的值为当前内存表的位置计数器的值; • expr FIELD指定的域所占内存单元字节数。

  44. 取相对地址初始化内存单元DCDO • 语法格式: • {lable} DCDO expr{,expr}... • lable 可选取的标号; • expr 数字表达式或为程序标号,内存分配的字数是由expr的个数决定的。

  45. 分配代码存储单元DCI • 语法格式: • {lable} DCI expr • lable 可选取的标号,是内存块起始地址的标号; • expr 数字表达式(整数)或为程序标号。

  46. 汇编代码控制伪操作 • 汇编器在对程序代码进行编译时,会根据汇编控制伪操作的定义情况对程序进行编译,常用的有条件编译、重复汇编和宏定义

  47. IF条件编译伪操作 • 语法格式: • IF logical_expression • 程序代码段A • {ELSE • 程序代码段B • } • ENDIF

  48. WHILE条件编译伪操作 • 语法格式: • WHILE logical_expression • 程序代码段 • WEND

  49. MACRO宏定义伪操作 • 语法格式: • MACRO • {$label} macroname {$parameter{,$ parameter}…} • 程序代码段 • MEND

  50. 汇编信息报告控制伪操作 • 信息报告伪操作用于程序汇编指示,主要是在程序调试阶段使用。这类伪操作分为错误信息报告伪操作、诊断信息报告伪操作、列表选项设置伪操作、插入文件标题伪操作

More Related