没有合适的资源?快使用搜索试试~ 我知道了~
首页第4章 ARM汇编语言程序设计《从实践中学ARM体系结构与接口技术》
作者:华清远见嵌入式学院。在第2、3章中阐述的体系结构及指令集理论的基础上,本章主要介绍利用ARM汇编语言进行编程。ARM 编译器可以支持汇编语言、C/C++、汇编语言与 C/C++的混合编程等,本章将介绍汇编、C 相关的编程方法。本章主要内容:ARM汇编器支持的伪操作;ARM汇编器支持的伪指令;ARM汇编器的使用;汇编语言与 C的混合编程
资源详情
资源评论
资源推荐
《从实践中学 ARM 体系结构与接口技术》
作者:华清远见
第 4 章 ARM 汇编语言程序设计
本章简介
在第 2、3 章中阐述的体系结构及指令集理论的基础上,本章主要介绍利用 ARM
汇编语言进行编程。ARM 编译器可以支持汇编语言、C/C++、汇编语言与 C/C++
的混合编程等,本章将介绍汇编、C 相关的编程方法。本章主要内容:
ARM 汇编器支持的伪操作
ARM 汇编器支持的伪指令
ARM 汇编器的使用
汇编语言与 C 的混合编程
专业始于专注 卓识源于远见
‐2‐
ARM 汇编器支持的伪操作
4.1.1 伪操作概述
在 ARM 汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对
应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive),它们所完成的操作称为伪操作。伪
操作在源程序中的作用是为了完成汇编程序做各种准备工作,这些伪操作仅在汇编过程中起作用,一旦汇
编结束,伪操作的使命就完成了。
在 ARM 的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作及其杂项
伪操作等。
4.1.2 符号定义伪操作
符号定义伪操作用于定义 ARM 汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的
符号定义伪操作有如下几种:
(1)用于定义全局变量的 GBLA、GBLL 和 GBLS。
(2)用于定义局部变量的 LCLA、LCLL 和 LCLS。
(3)用于对变量赋值的 SETA、SETL 和 SETS。
(4)为通用寄存器列表定义名称的 RLIST。
1.全局变量定义伪操作 GBLA、GBLL 和 GBLS
1)语法格式
GBLA、GBLL 和 GBLS 伪操作用于定义一个 ARM 程序中的全局变量并将其初始化。其中,
(1)GBLA 伪操作用于定义一个全局的数字变量并初始化为 0。
(2)GBLL 伪操作用于定义一个全局的逻辑变量并初始化为 F(假)。
(3)GBLS 伪操作用于定义一个全局的字符串变量并初始化为空。
由于以上 3 条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
语法格式如下。
<gblx> <variable>
参数说明如下。
<gblx>:取值为 GBLA、GBLL、GBLS 三者之一。
<variable>:定义的全局变量名,在其作用范围内必须唯一。全局变量的作用范围为包含该变量的
源程序。
2)使用说明
如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。
3)示例
(1)使用伪操作声明全局变量。
GBLA Test1 ;定义一个全局的数字变量,变量名为 Test1
Test1 SETA 0xaa ;将该变量赋值为 0xaa
GBLL Test2 ;定义一个全局的逻辑变量,变量名为 Test2
Test2 SETL {TRUE} ;将该变量赋值为真
GBLS Test3 ;定义一个全局的字符串变量,变量名为 Test3
Test3 SETS "Testing" ;将该变量赋值为“Testing”
(2)声明变量 objectsize 并设置其值为 0xff,为“SPACE”操作做准备。
GBLA objectsize
专业始于专注 卓识源于远见
‐3‐
Objectsize SETA oxff
SPACE objectsize
(3)下面的例子显示如何使用汇编命令设置变量的值,具体做法是使用“pd”选项。
Armasm pd "objectsize SETA oxff" o objectfile sourcefile
2.局部变量定义伪操作 LCLA、LCLL 和 LCLS
1)语法格式
LCLA、LCLL 和 LCLS 伪指令用于定义一个 ARM 程序中的局部变量并将其初始化。其中,
(1)LCLA 伪操作用于定义一个局部的数字变量并初始化为 0。
(2)LCLL 伪操作用于定义一个局部的逻辑变量并初始化为 F(假)。
(3)LCLS 伪操作用于定义一个局部的字符串变量并初始化为空。
以上 3 条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。
语法格式如下。
<lclx> <variable>
参数说明如下。
<lclx>:取值为 LCLA、LCLL、LCLS 三者之一。
<variable>:所定义的局部变量名,在其作用范围内必须唯一。局部变量作用范围为包含该局部变
量的宏。
2)使用说明
如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。
3)示例
(1)使用伪操作声明局部变量。
LCLA Test4 ;声明一个局部的数字变量,变量名为 Test4
Test3 SETA 0xaa ;将该变量赋值为 0xaa
LCLL Test5 ;声明一个局部的逻辑变量,变量名为 Test5
Test4 SETL {TRUE} ;将该变量赋值为真
LCLS Test6 ;定义一个局部的字符串变量,变量名为 Test6
Test6 SETS "Testing" ;将该变量赋值为“Testing”
(2)下面的例子定义一个宏,显示了局部变量的作用范围。
MACRO ;声明一个宏
$label message $a ;宏原型
LCLS err ;声明局部字符串变量
$label
INFO 0,"err":CC::STR:$a
MEND ;宏结束,局部变量不再起作用
3.变量赋值伪操作 SETA、SETL 和 SETS
1)语法格式
伪指令 SETA、SETL 和 SETS 用于给一个已经定义的全局变量或局部变量赋值。其中:
(1)SETA 伪操作用于给一个数学变量赋值。
(2)SETL 伪操作用于给一个逻辑变量赋值。
(3)SETS 伪操作用于给一个字符串变量赋值。
语法格式如下:
Variable <setx> expr
参数说明如下。
Variable:变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。
专业始于专注 卓识源于远见
‐4‐
<setx>:取值为 SETA、SETL、SETS 三者之一。
expr:数学、逻辑或字符串表达式,也就是将要赋予变量的值。
2)使用说明
在向变量赋值前必须先声明变量,也可以在汇编指令中预定义变量,如:
"Armasm --pd "objectsize SETA oxff" --o objectfile sourcefile"
3)示例
(1)为预先定义的变量赋值。
LCLA Test3 ;声明一个局部的数字变量,变量名为 Test3
Test3 SETA 0xaa ;将该变量赋值为 0xaa
LCLL Test4 ;声明一个局部的逻辑变量,变量名为 Test4
Test4 SETL {TRUE} ;将该变量赋值为真
LCLS Test6 ;定义一个局部的字符串变量,变量名为 Test6
Test6 SETS "Testing" ;将该变量赋值为“Testing”
(2)使用变量赋值伪操作,定义一些程序相关内容。
GBLA versionNumber
VersionNumber SETA 21
GBLL Debug
Debug SETL {TRUE}
GBLS versionString
VersionString SETS "version 1.0"
4.通用寄存器列表定义伪操作 RLIST
1)语法格式
RLIST 伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在 ARM 指令
LDM/STM 中使用。在 LDM/STM 指令中,列表中的寄存器访问顺序根据寄存器的编号由低到高,与列表
中的寄存器排列顺序无关。
语法格式如下。
Name RLIST {list-of-registers}
参数说明如下。
Name:寄存器列表的名称。
list-of-registers:通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可
以用“”指定寄存器范围。具体用法参见程序示例。
2)使用说明
在使用 ARM 汇编编译器编译源文件时,可以使用“checkreg”选项来指定汇编器进行寄存器检查。
如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。
3)示例
(1)将寄存器列表名称定义为 RegList,可在 ARM 指令 LDM/STM 中通过该名称访问寄存器列表。
RegList RLIST {R0-R5,R8,R10}
(2)使用“”在寄存器列表中指定寄存器范围。
Context RLIST {R0-R6,R8,R10-R12,R15}
4.1.3 数据定义(Data Definition)伪操作
数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的
数据定义伪操作有如下几种:
(1)DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
专业始于专注 卓识源于远见
‐5‐
(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。
(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。
(4)DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
(5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
(6)DCQ(DCQU)用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始化。
(7)SPACE 用于分配一片连续的存储单元。
(8)MAP 用于定义一个结构化的内存表首地址。
(9)FIELD 用于定义一个结构化的内存表的数据域。
1.DCB
1)语法格式
DCB 伪操作用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以
为数字或字符串。DCB 也可用“=”代替。
语法格式如下:
{label} DCB expr{,expr}
参数说明如下。
{label}:程序标号。
expr:可以是−128~255 之间的数字,也可以是字符串。
2)使用说明
在使用 DCB 伪操作时,其后常跟 ALIGN 伪操作以保证内存地址对齐。
3)示例
(1)分配一片连续的字节存储单元并初始化为指定字符串。
Str DCB "This is a test!"
(2)与 C 中的字符串不同,ARM 汇编中的字符串不以 null 结尾。下面的指令以 ARM 汇编形成一个 C
语言风格的字符串。
C_string DCB "C_string",0
2.DCW(或 DCWU)
1)语法格式
DCW(或 DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其
中,表达式可以为程序标号或数字表达式。
用 DCW 分配的字存储单元是半字对齐的,而用 DCWU 分配的字存储单元并不严格半字对齐。
语法格式如下:
{label} DCW expr{,expr}…
参数说明如下。
{label}:程序标号,可选。
expr:数字表达式,取值范围为−32 768~65 525。
2)使用说明
DCW 可以在分配的内存单元前加 1 字节以保证内存半字对齐。当程序对内存对齐方式要求不严格时
可以用 DCWU 伪操作。
3)示例
(1)分配一片连续的半字存储单元并初始化。
DataTest DCW 1,2,3
(2)在指定内存单元初始值时可以使用已定义的变量。
剩余39页未读,继续阅读
linuxemb
- 粉丝: 5
- 资源: 105
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3