第3章 ARM汇编语言程序设计
ARM汇编程序设计

ADRL
目标寄存器
标寄存器,表达式
表达式
• ARM伪指令——中等范围的地址读取
地址表达式expr的取指范围:
当地址值不是字对齐时,其取指范围为±64K
当地址值是字对齐时,其取指范围为±256K
当地址值是16字节对齐时,其取指范围将更大
ADRL
目标寄存器
标寄存器,表达式
表达式
• ARM伪指令——中等范围的地址读取
DISP_TAB
DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8
• ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或
基于寄存器相对偏移的地址值读取到寄存器中, 比ADR伪指令可以读取更大范围的地址 。在汇编 编译器编译源程序时,ADRL伪指令被编译器替换 成两条合适的指令。若不能用两条指令实现,则 产生错误,编译失败。
GET GET GET
example,CODE,READONLY
file1.s C:\project\file2.s C:\Program files\file3.s ;包含源文件file1.s ;包含源文件file2.s ;包含源文件file3.s
汇编控制伪操作
汇编控制(Assembly Control)伪操作用于控制汇编程
应用示例(源程序):
... ADRL R0,Delay
编译后的反汇编代码:
...
0x20 ADD
0x24 ADD ...
r0,pc,#40
r0,r0,#0 r0,r14
...
Delay MOV R0,r14
0x68 MOV ...
...
使用伪指令将程序标 号Delay的地址存入R0
ARM汇编语言程序设计

是由物理寄存器r1来存放r0所代表的值。
Chavezwang@
计算机学院嵌入式实验室
19
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编中虚拟寄存器举例
int main(void) #include <stdio.h> void test_inline_register(void) { int i; int r5,r6,r7; __asm { MOV i,#0 loop: MOV r5,#0 MOV r6,#0 MOV r7,#0 ADD i,i,#1 CMP i,#3 BNE loop } }
北京理工大学珠海学院
嵌入式系统设计及应用开发
何时使用内联汇编和嵌入型汇编
程序中使用饱和算术运算(Saturating arithmetic),如SSAT16 和 USAT16指令。
程序中需要对协处理器进行操作。 在C或C++程序中完成对程序状态寄存器的操作
注:使用内联汇编编写的程序代码效率也比较高
③ 不能在程序中使用“.”或{PC}得到当前指令地址值。
④ 在16进制常量前加“0x”。
⑤ 建议不要对堆栈进行操作。
Chavezwang@
计算机学院嵌入式实验室
16
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编的限制2
⑥ 编译器可能会使用r12和r13寄存器存放编译的中间结果, 在计算表达式值可能会将寄存器r0~r3、r12及r14用于子程 序调用。另外在内联汇编中设置程序状态寄存器CPSR中的 标志位NZCV时,要特别小心。内联汇编中的设置很可能会 和编译器计算的表达式的结果冲突。
编译器使用一套规则的来设置寄存器的用法
《汇编语言程序设计 —基于ARM体系结构 (第4版)》教学课件—03ARM指令系统

图3-1程序设计语言的层次结构
为了提高程序设计的效率,人们提出了汇编语言的概念。将机器码用指令助记符表示,这样就比机器语言方便得多。不过,在使用汇编语言后,虽然编程的效率和程序的可读性都有所提高,但汇编语言同机器语言非常接近,它的书写风格在很大程度上取决于特定计算机的机器指令,所以它仍然是一种面向机器的语言。 为了更好地进行程序设计,提高程序设计的效率,人们又提出了高级语言程序设计的概念。如C、JAVA等,这类高级语言对问题的描述十分接近人们的习惯,并且还具有较强的通用性。这就给程序员带来极大的方便。当然这类高级语言在执行前必须转换为汇编语言或其它中间语言,最终转换为机器语言。通常有两
3.2 ARM汇编语言
3.2.1指令和指令格式3.2.2指令的可选后缀3.2.3指令的条件执行3.2.4 ARM指令分类
3.2.1指令和指令格式
1.指令和指令系统 指令是指示计算机进行某种操作的命令 指令的集合称为指令系统。指令系统的功能强弱在很大程度上决定了这类计算机智能 的高低,它集中地反映了微处理器的硬件功能和属性。2.指令的表示方法从形式上看,ARM指令在机器中的表示格式是用32位的二进制数表示。计算机根据二 进制代码去完成所需的操作,如ARM中有一条指令为:ADDEQS R0,R1,#8;其二进制代码形式为:
3.1 指令基础
3.1.1程序设计语言的层次结构3.1.2指令周期和时序3.1.3程序的执行过程
3.1.1程序设计语言的层次结构
计算机程序设计语言的层次结构如图3-1所示,分为机器语言级、汇编语言级、高级语言级,机器语言是与计算机硬件最为密切的一种语言,它由微程序解释机器指令统。这一级也是硬件级,是软件系统和硬件系统之间的纽带。
例如:在8MHz的ARM微处理器中,一个 S 周期是125ns,而一个 N 周期 是 250ns。应当注意到这些时序不是 ARM 的属性,而是内存系统 的属性。例如,一个 8MHz的ARM微处理器可以与一个给出125ns 的 N 周期的 RAM 系统相连接。处理器的速率是 8MHz 只是简单 的意味着如果你使任何类型的周期,在长度上小于 125ns 则它不 保证能够工作。图3-2显示一种ARM存储器周期时序。
ARM汇编语言程序设计

ARM汇编语言程序设计1.ARM汇编语言概述2.ARM寄存器3.ARM指令ARM指令包括数据处理指令、传输指令、分支指令和其他特殊指令。
(1)数据处理指令:包括算术运算、逻辑运算、移位和旋转、比较和测试等。
(2)传输指令:用于数据的加载和存储,包括复制、分配和堆栈操作等。
(3)分支指令:用于控制程序流,包括无条件跳转、条件跳转和中断处理等。
4.ARM程序设计(1)初始化:程序开始时需要进行系统和寄存器的初始化。
可以将堆栈指针初始化,设置另外的寄存器和内存变量等。
(2)输入输出:程序可能需要从外部设备读取数据或向外部设备写入数据。
可以使用传输指令实现数据的输入和输出。
(3)运算处理:根据程序的需求,进行各种运算处理。
可以使用数据处理指令实现数据的加减乘除、逻辑运算等。
(4)循环和条件控制:根据需要,使用分支指令控制程序的流程。
可以使用无条件跳转、条件跳转和循环指令实现程序的循环和条件控制。
(5)结束:在程序执行完毕后,可以进行清理工作,例如释放内存、关闭设备等。
5.ARM程序设计实例下面是一个简单的ARM汇编程序示例,实现从数组中找到最大值并输出:.global _start.section .dataarray: .word 1, 3, 5, 2, 4max: .word 0.section .text_start:loop:next:在上述示例中,程序首先将数组的地址和最大值的地址加载到寄存器中。
然后使用循环和条件控制指令依次比较数组元素,找到最大值并将其存储在max变量中。
最后将最大值输出,并结束程序。
第3章ARM汇编语言程序设计

2.局部变量定义伪操作LCLA、LCLL和LCLS
(1)语法格式 LCLA、LCLL和LCLS伪指令用于定义一个 ARM程序中的局部变量并将其初始化。 语法格式如下: <lclx> <variable> (2)使用说明 (3)示例
3.变量赋值伪操作SETA、SETL和SETS
(1)语法格式 伪指令SETA、SETL和SETS用于给一个已 经定义的全局变量或局部变量赋值。 语法格式如下: Variable <setx> expr (2)使用说明 (3)示例
(2)用于定义局部变量的LCLA、LCLL和 LCLS。
(3)用于对变量赋值的SETA、SETL和 SETS。
(4)为通用寄存器列表定义名称的RLIST。
1.全局变量定义伪操作GBLA、GBLL和GBLS
(1)语法格式 GBLA、GBLL和GBLS伪操作用于定义一个 ARM程序中的全局变量并将其初始化。 语法格式如下: <gblx> <variable> (2)使用说明 (3)示例
4.通用寄存器列表定义伪操作RLIST
(1)语法格式 RLIST伪操作可用于对一个通用寄存器列 表定义名称,使用该伪操作定义的名称可在 ARM指令LDM/STM中使用。 语法格式如下: Name RLIST {list-of-registers} (2)使用说明 (3)示例
3.2.3 数据定义(Data Definition)伪操作
{label} DCFS{U} fpliteral{,fpliteral}
(2)使用说明 (3)示例
5.DCFD(或DCFDU)
(1)语法格式 DCFD(或DCFDU)伪指令用于为双精度
的浮点数分配一片连续的字存储单元并用伪指 令中指定的表达式初始化。
3ARM指令及汇编程序设计共31页文档

常量
数字常量
十进制 12,5,876,0 十六进制 0xFF,0x1 N进制 n-XXX,2-010111
字符常量
布尔常量
段定义
AREA Hello,CODE,READONLY ENTRY START MOV R7,#10
MOV R6,#5 ADD R6,R6,R7 B END
(9)FILED 语法格式:标号 FIELD 表达式
4 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程, 常用的汇编控制伪指令包括以下几条: (1) IF、ELSE、ENDIF 语法格式: IF 逻辑表达式
指令序列 1
ELSE
指令序列 2
ENDIF
汇编控制伪指令(Cont.)
<>内的项是必须的
{}内的项是可选的
opcode 指令助记符,如LDR,STR等
cond 执行条件,如EQ,NE等
S 是否影响CPSR寄存器的值
Rd
目标寄存器
Rn
第一个操作数的寄存器
operand2 第二个操作数
第二个操作数
#immed_8r
常数表达式,必须是一个8位常数的偶数次循环移位 合法常量:0x3FC、0、0xF0000000、200、0xF0000001 非法常量:0x1FE、511、0xFFFF、0x1010、0xF0000010
数据常量定义伪指令
数据常量定义伪指令EQU用于为程序中的常量、 标号等定义一个等效的字符名称,类似于 C 语言 中的#define 。 EQU语法格式 : 名称 EQU 表达式 { ,类型 } ;其中 EQU 可用 “ * ” 代替。 名称为 EQU 伪指令定义的字符名称,当表达 式为 32 位的常量时,可以指定表达式的数据类 型,可以有以下三种类型: CODE16 、 CODE32 和 DATA 。
第三章 ARM中的C语言和汇编混合编程
ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节 对齐的。异常中断的处理程序可以使用被中断程序的数据 栈,这时用户要保证中断的程序数据栈足够大。下面是一 个数据栈的实例及相关的名称。 数据栈指针:指向最后一个写入栈的数据的内存地址。 数据栈的基地址:是指数据栈的最高地址。 已占用的数据栈:是指数据栈的基地址和数据栈栈指针之 间的区域。 未占用的数据栈:是指数据栈指针和数据栈界限之间的区 域。 数据栈中的数据帧:是指在数据栈中,为子程序分配的用 来保存寄存器和局部变量的区域。
在ARM C语言程序中使用关键词_asm来标识一段汇编指 令程序,基本格式为: _asm { instruction [;instruction] … [instruction] } 在以上的语法中需要指出的是:如果一行中有多个汇编指 令,指令间用分号“;”隔开;如果一条指令占多行,要 使用续行符号“\”;在汇编指令段中可以使用C语言的注释 语句。
3.2 内嵌汇编
使用内嵌汇编可以在C程序中实现C语言不能够完 成的一些操作,同时程序的代码效率也能够比较 高。在内嵌汇编指令包括大部分的ARM指令和 Thumb指令。但是不能够直接引用C语言的变量 定义,数据交换必须通过ATPCS进行。嵌入式汇 编在形式上往往表现为独立定义的函数体。
3.2.1 内嵌汇编的语法格式
对应不同的数据类型要采用不同的LDR/STR指令。 对于unsigned char类型,使用LDRB/STRB访问。 对于unsigned short类型,使用LDRH/STRH访问。 对于unsigned int 类型,使用LDR/STR访问。 对于char类型,使用LDRSB/STRSB访问。 对于short类型,使用LDRSH/STRSH访问。 对于小于8个字的结构型变量,可以通过一条 “LDM/STM”指令来读/写整个变量。 对于结构型变量的数据成员,可以使用相应的 “LDR/STR”指令来访问,这时必须知道该数据成员相对 于结构型变量开始地址的偏移。
arm汇编语言程序设计步骤
arm汇编语言程序设计步骤以ARM汇编语言程序设计步骤为标题,本文将详细介绍ARM汇编语言程序设计的步骤和相关知识。
一、ARM汇编语言简介ARM汇编语言是一种低级程序设计语言,用于编写针对ARM架构的机器码指令。
它是一种直接操作硬件的语言,具有高效性和灵活性。
二、ARM汇编语言程序设计步骤1. 确定程序目标和需求:在开始编写ARM汇编程序之前,首先要明确程序的目标和需求。
这包括确定程序的功能、输入和输出,以及所需的数据结构和算法。
2. 了解ARM架构:ARM架构具有多种版本和变体,每个版本都有不同的特性和指令集。
在编写ARM汇编程序之前,应该熟悉所用的ARM架构的特性和指令集。
3. 编写伪指令和数据段:ARM汇编语言中,伪指令用于定义常量、变量和数据段。
在编写程序之前,需要使用伪指令定义所需的数据段,并为程序分配必要的内存空间。
4. 编写指令段:指令段是ARM汇编程序的核心部分,包含实际执行的指令。
在编写指令段时,需要使用合适的指令来实现程序的功能。
指令可以包括算术运算、逻辑运算、分支跳转等。
5. 调试和测试:编写完ARM汇编程序后,需要进行调试和测试以确保程序的正确性和稳定性。
可以使用调试工具和模拟器来调试程序,并通过输入不同的测试数据进行测试。
6. 优化性能:在完成调试和测试后,可以对程序进行性能优化。
ARM汇编语言具有很高的性能优化空间,可以通过优化算法、减少指令数和利用硬件特性等方式来提升程序的执行效率。
7. 文档编写和维护:编写完ARM汇编程序后,应该撰写相应的文档来记录程序的功能、设计和使用方法。
文档应该清晰明了,方便其他人理解和使用。
三、ARM汇编语言编程技巧1. 熟悉寄存器:ARM架构包含多个通用寄存器和特殊寄存器,熟悉不同寄存器的用途和特性对于编写高效的ARM汇编程序非常重要。
2. 使用合适的指令:ARM汇编语言提供了丰富的指令集,选择合适的指令可以提高程序的效率。
需要根据程序需求和算法特点选择合适的指令。
arm汇编语言程序设计
arm汇编语言程序设计ARM汇编语言程序设计一、引言ARM汇编语言是一种低级语言,用于编写底层程序,如操作系统、嵌入式系统等。
它具有高效、灵活、可移植等特点,被广泛应用于各种嵌入式设备中。
本文将介绍ARM汇编语言程序设计的基本概念、语法规则以及常用指令,以帮助读者快速入门和理解该领域的知识。
二、基本概念1. 寄存器:ARM处理器具有16个通用寄存器,分别用R0~R15表示。
这些寄存器用于存储数据、地址和中间结果,并且在程序执行过程中可以被读取和写入。
2. 指令:ARM汇编语言的指令包括数据处理指令、分支指令、加载存储指令等。
这些指令用于执行各种操作,如算术运算、逻辑运算、条件判断等。
3. 标志位:ARM处理器的标志位用于记录执行过程中的状态信息,如进位标志、溢出标志等。
这些标志位对于程序的正确执行非常重要。
三、语法规则1. 指令格式:ARM汇编指令由操作码和操作数组成,其中操作码表示指令的类型,操作数表示指令的操作对象。
指令格式一般为“操作码操作数1, 操作数2, ...”。
2. 注释:注释以分号开头,用于对指令进行解释和说明。
注释对于程序的可读性和维护性非常重要,应当充分利用。
3. 标签:标签用于标识程序中的某个位置或标记某个指令,以便在其他地方进行引用。
标签一般以英文字母开头,后面可以跟随数字或下划线等字符。
4. 伪指令:伪指令是一种特殊指令,用于约定程序的起始地址、存储空间的分配等。
伪指令一般以句点开头,如“.data”表示数据段,“.text”表示代码段。
四、常用指令1. 数据处理指令:数据处理指令用于进行算术运算、逻辑运算等操作。
例如,“ADD”指令用于将两个操作数相加,并将结果存放在目标寄存器中。
2. 分支指令:分支指令用于实现程序的跳转和循环等控制流程。
例如,“B”指令用于无条件跳转到指定标签处执行。
3. 加载存储指令:加载存储指令用于实现数据的读取和写入。
例如,“LDR”指令用于将指定地址处的数据加载到寄存器中。
arm汇编语言程序设计步骤
arm汇编语言程序设计步骤ARM汇编语言程序设计步骤一、概述ARM汇编语言是一种基于ARM架构的低级语言,用于编写底层程序和驱动程序。
在进行ARM汇编语言程序设计时,我们需要按照以下步骤进行。
二、确定需求在开始编写ARM汇编语言程序之前,我们需要明确程序的需求和目标。
这包括确定程序要实现的功能、输入和输出的格式、程序的性能要求等。
三、了解ARM架构在编写ARM汇编语言程序之前,我们需要了解ARM架构的特点和指令集。
ARM架构是一种精简指令集计算机(RISC)架构,具有高效的指令执行和低能耗的特点。
四、选择开发工具在进行ARM汇编语言程序设计时,我们需要选择合适的开发工具。
常用的开发工具包括ARM汇编器、调试器和模拟器。
这些工具可以帮助我们编译、调试和运行ARM汇编语言程序。
五、编写程序在编写ARM汇编语言程序时,我们需要按照以下步骤进行:1. 定义数据段:首先,我们需要定义程序的数据段。
数据段用于存储程序中使用的变量和常量。
在ARM汇编语言中,我们可以使用伪指令来定义数据段。
2. 定义代码段:然后,我们需要定义程序的代码段。
代码段包含程序的指令和算法。
在ARM汇编语言中,我们可以使用伪指令和指令来定义代码段。
3. 编写算法:在编写ARM汇编语言程序时,我们需要根据需求编写相应的算法。
算法是程序的核心部分,用于实现程序的功能和逻辑。
4. 调用系统服务:在ARM汇编语言中,我们可以通过调用系统服务来实现一些常用的功能,如输入输出、内存管理等。
调用系统服务需要使用特定的指令和参数。
5. 进行优化:在编写ARM汇编语言程序时,我们可以进行一些优化操作,以提高程序的性能和效率。
优化操作包括减少指令数量、减少内存访问次数、合并循环等。
六、编译和调试在完成ARM汇编语言程序的编写后,我们需要进行编译和调试。
编译是将汇编语言程序转换为机器码的过程,可以使用ARM汇编器进行编译。
调试是对程序进行测试和调试的过程,可以使用调试器和模拟器进行调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.全局变量定义伪操作GBLA、GBLL和GBLS
(1)语法格式 GBLA、GBLL和GBLS伪操作用于定义一个 ARM程序中的全局变量并将其初始化。 语法格式如下: <gblx> <variable> (2)使用说明 (3)示例
2.局部变量定义伪操作LCLA、LCLL和LCLS
(1)语法格式 LCLA、LCLL和LCLS伪指令用于定义一个 ARM程序中的局部变量并将其初始化。 语法格式如下: <lclx> <variable> (2)使用说明 (3)示例
1.DCB
(1)语法格式 DCB伪操作用于分配一片连续的字节存储 单元并用伪指令中指定的表达式初始化。其中, 表达式可以为数字或字符串。DCB也可用“=” 代替。 语法格式如下。 {label} DCB expr{,expr} (2)使用说明 (3)示例
2.DCW(DCWU)
(1)语法格式 DCW(或DCWU)伪操作用于分配一片连续 的半字存储单元并用伪指令中指定的表达式初 始化。 语法格式如下。 {label} DCW expr{,expr}… (2)使用说明 (3)示例
表3-1
Thumb寄存器的使用 寄 存 器 R0~R7 R8~R12 R13 R14 访 问 完全访问 只能通过MOV、ADD及CMP访问 限制访问 限制访问
R15
CPSR SPSR
限制访问
间接访问 不能访问
3.1.2 ARM/Thumb交互工作基础
Thumb以其较高的代码密度和在窄存储器 上的性能,使得它在很多系统中得到广泛应用。
(1)代码编译 (2)C语言的互交实例 (3)Thumb状态下的功能指针
3.2 ARM汇编器支持的伪操作
3.2.1 伪操作概述
在ARM汇编语言程序中,有一些特殊指令 助记符,这些助记符与指令系统的助记符不同, 没有相对应的操作码,通常称这些特殊指令助 记符为伪操作标识符(directive) ,它们所 完成的操作称为伪操作。伪操作在源程序中的 作用是为了完成汇编程序做各种准备工作的, 这些伪操作仅在汇编过程中起作用,一旦汇编 结束,伪操作的使命就完成。
3.DCD(DCWU)
(1)语法格式 DCD(或DCDU)伪操作用于分配一片连续 的字存储单元并用伪指令中指定的表达式初始 化。 语法格式如下。 {label} DCD{U} expr{,expr} (2)使用说明 (3)示例
4.DCFS(或DCFSU)
(1)语法格式 DCFS(或DCFSU)伪指令用于为单精度的 浮点数分配一片连续的字存储单元并用伪指令 中指定的表达式初始化。 语法格式如下。
(6)EXPORT(或GLOBAL)用于声明符号 可以被其他文件引用。 (7)EXPORTAS用于向目标文件引入符号。 (8)IMPORT用于通知编译器当前符号不 在本文件中。
(9)EXTERN用于通知编译器要使用的标 号在其他的源文件中定义,但要在当前源文件 中引用。 (10)GET(或INCLUDE)用于将一个文件 包含到当前源文件。 (11)INCBIN用于将一个文件包含到当前 源文件。
8.MAP
(1)语法格式 MAP伪操作用于定义一个结构化的内存表 的首地址。 语法格式如下。 MAP expr{,base-register} (2)使用说明 (3)示例
9.FILED
(1)语法格式 FIELD伪操作用于定义一个结构化内存表 中的数据域。 语法格式如下。
{label} FIELD expr
本章主要内容: ● ARM/Thumb混合编程 ● ARM汇编器支持的伪操作 ● ARM汇编器支持的伪指令 ● ARM汇编器的使用 ● 汇编语言与C/C++的混合编程
3.1 ARM/Thumb混合编程
3.1.1 Thumb指令的特点及实现
Thumb指令集把32位ARM指令集的一个子 集编码为一个16位的指令集。 代码密度高是Thumb指令集的一个主要优 势。
3.END
(1)语法格式 END伪操作用于通知编译器已经到了源程 序的结尾。 语法格式如下。 END (2)使用说明 (3)示例
4.ENTRY
(1)语法格式 ENTRY伪操作用于指定汇编程序的入口点。 在一个完整的汇编程序中至少要有一个ENTRY (也可以有多个,当有多个ENTRY时,程序的 真正入口点由链接器指定),但在一个源文件 里最多只能有一个ENTRY(可以没有)。 语法格式如下。 ENTRY (2)使用说明 (3)示例
嵌入式系统技术与设计
第3章 ARM汇编语言程序设计
3.1
ARM/Thumb混合编程 ARM汇编器支持的伪操作
ARM汇编器支持的伪指令 汇编语言与C/C++的混合编程
3.2
3.3
3.4
在第2章中阐述的体系结构及指令集理论 的基础上,本章主要介绍利用ARM汇编语言进 行编程。ARM编译器可以支持汇编语言、C/C++、 汇编语言与C/C++的混合编程等,本章将介绍 相关的编程方法。
在ARM的汇编程序中,伪操作主要有符号 定义伪操作、数据定义伪操作、汇编控制伪操 作及其杂项伪操作等。
3.2.2 符号定义伪操作
符号定义伪操作用于定义ARM汇编程序中 的变量、对变量赋值及定义寄存器的别名等操 作。常见的符号定义伪操作有如下几种。 (1)用于定义全局变量的GBLA、GBLL和 GBLS。 (2)用于定义局部变量的LCLA、LCLL和 LCLS。 (3)用于对变量赋值的SETA、SETL和 SETS。 (4)为通用寄存器列表定义名称的RLIST。
IF logical-expressing … {ELSE …} ENDIF
2.WHILE、WEND
(1)语法格式 WHILE、WEND伪操作能根据条件的成立与 否决定是否循环执行某个指令序列。 语法格式如下:
WHILE code WEND logical-expression
logical-expression:用于决定指令执 行流程的逻辑表达式。 (2)使用说明 (3)示例
(3)ARMv5架构下的状态切换 在ARMv5体系结构的指令集中,增加了下 面两条指令用于ARM代码和Thumb代码之间的互 交。 ① BLX address ② BLX register
2.使用C和C++语言实现互交
对于不同的C和C++源程序,可能有些程序 中包含ARM指令,有些程序中包含Thumb指令, 这些程序可以相互调用,只是在编译这些程序 时指定--apcs/interwork选项。当使用了-apcs/interwork选项,编译器会自动进行一 些相应处理;连接器在检测到程序中存在互交 工作时,会生成一些用于程序状态切换的代码。
{label} DCFS{U} fpliteral{,fpliteral}
(2)使用说明 (3)示例
5.DCFD(或DCFDU)
(1)语法格式 DCFD(或DCFDU)伪指令用于为双精度 的浮点数分配一片连续的字存储单元并用伪指 令中指定的表达式初始化。 语法格式如下。 {label} DCFD{U} fpliteral{,fpliteral} (2)使用说明 (3)示例
6.DCQ(或DCQU)
(1)语法格式 DCQ(或DCQU)伪指令用于分配一片以8 个字节为单位的连续存储区域并用伪指令中指 定的表达式初始化。 语法格式如下。
{label} DCQ{U} {-}literal{,{-}literal}
(2)使用说明 (3)示例
7.SPACE
(1)语法格式 SPACE伪指令用于分配一片连续的存储区 域并初始化为0。 (2)使用说明 (3)示例
(2)使用说明 (3)示例
4.MEXIT
(1)语法格式 MEXIT用于从宏定义中跳转出去。 语法格式如下: MEXIT (2)示例
5.关于伪操作的嵌套
下面的伪操作在使用时可以嵌套,嵌套的 深度不能超过256。 (1)MACRO宏定义。 (2)WHILE…END循环。 (3)IF…ELSE…ENDIF条件语句。 (4)INCLUDE指定头文件。
3.2.3 数据定义(Data Definቤተ መጻሕፍቲ ባይዱtion)伪操作
数据定义伪操作一般用于为特定的数据分 配存储单元,同时可完成已分配存储单元的初 始化。常见的数据定义伪操作有如下几种。
(1)DCB用于分配一片连续的字节存储单 元并用指定的数据初始化。 (2)DCW(DCWU)用于分配一片连续的半 字存储单元并用指定的数据初始化。 (3)DCD(DCDU)用于分配一片连续的字 存储单元并用指定的数据初始化。 (4)DCFD(DCFDU)用于为双精度的浮 点数分配一片连续的字存储单元并用指定的数 据初始化。
(2)使用说明 (3)示例
3.2.4 汇编控制伪操作
汇编控制伪操作用于控制汇编程序的执行 流程,常用的汇编控制伪操作包括以下几条。 (1)IF、ELSE、ENDIF。 (2)WHILE、WEND。 (3)MACRO、MEND。 (4)MEXIT。
1.IF、ELSE、ENDIF
(1)语法格式 IF、ELSE、ENDIF伪操作能根据条件的成 立与否决定是否执行某个指令序列。 语法格式如下:
3.1.3 ARM/Thumb交互子程序
编写ARM/Thumb互交代码时,需要注意 下面两点。 (1)对于C/C++子程序而言,只要在编译 时指定--apcs/interwork选项,汇编器会生 成合适的返回代码,使得程序返回到和调用程 序相同的状态。 (2)在汇编语言子程序中,用户必须自 己编写相应的返回代码,使得程序返回到和调 用程序相同的状态。
1.使用汇编语言实现互交
对于汇编程序来说,可以有两种方法来实 现程序状态的切换。第一种方法是利用连接器 提供的交互子程序Veneer来实现程序状态的切 换,这时用户可以使用指令BL来调用子程序; 第二种方法是用户自己编写状态切换的程序, 本节主要介绍第二种方法。