ARM汇编语言源程序格式
4 ARM汇编语言程序设计
伪操作
CODE16 CODE32 EQU AREA ENTRY END ALIGN
EXPORT/ GLOBAL
语法格式
CODE16
作用
告诉汇编编译器后面的指令序列为16位的Thumb指令 告诉汇编编译器后面的指令序列为32位的ARM指令。
为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称,类 似于C语言中的#define宏定义。
符号定义伪操作
给变量赋值——SETA、SETL及SETS
SETA、SETL及SETS伪操作用于给一个ARM程
序 中的变量赋值。 语法格式:
赋予变量的 值
variable SETA/SETL/SETS expr
应用实例: GBLA objectsize ;声明一个全局的算术变量 objectsize SETA 0xff ;为该变量赋值 注意:
ARM汇编语言程序设计
主讲人:刘燕
ARM汇编语言程序设计
ARM伪操作 ARM伪指令
ARM汇编语言语句格式
ARM汇编语言程序格式
ARM程序设计举例
ARM汇编语言程序设计
ARM汇编语言源程序中的语句由指令、伪 操作和宏指令组成。 伪操作不像机器指令那样在计算机运行 期间由机器执行,它是在汇编程序对源程序 汇编期间由汇编程序处理的。 宏是一段独立的程序代码,在程序中通 过宏指令调用该宏。当程序被汇编时,汇编 程序将对每个宏调用作展开,用宏定义体取 代源程序中的宏指令。
GBLA/GBLL/GBLS variable
符号定义伪操作
声明全局变量——GBLA、GBLL及GBLS
语法格式:
GBLA/GBLL/GBLS ห้องสมุดไป่ตู้ariable
8ARM汇编语言程序指示符与语句格式.
5.4.5.1 AREA
AREA指示符用于定义一个代码段或者数据段。
语法格式 AREA sectionname{,attr}{,attr}.... 其中: sectionname为所定义的代码段或者数据段的名称。 如果该名称是以数字开头的,则该名称必须用“|” 括起来,如|1_datasec|。还有一些代码段具有约 定的名称,如|.text|表示C语言编译器产生的代码 段或者是与C语言库相关的代码段。 Attr是该代码段(或者程序段)的属性。 在AREA指示符中,各属性间用逗号隔开。
11
2018/9/14
AREA的属性
下面列举主要的属性:
ALIGN=expression。默认的情况下,ELF的代码段 和数据段是4字节对齐的。
Expression可以取0~31的数值,相应的对齐 方式为(2expression)字节对齐。如expression=3 时为8字节对齐。
ASSOC=section。指定与本段相关的ELF段。任何 时候连接section段也必须包括sectionname段。 CODE 定义代码段。默认属性为READONLY。 COMDEF 定义一个通用的段。该段可以包含代码 或者数据。在个源文件中,同名的COMDEF段必 须相同。
15
2018/9/14
EQU(续)
type有下面3种取值: CODE16 CODE32 DATA 使用说明 EQU指示符的作用类似于C语言中的#define,用于 为一个常量定义字符名称。 示例 abcd EQU 2 ;定义abcd符号的值为2 abcd EQU label+16 ;定义abcd符号的值(label+16) addr1 EQU 0xlC, CODE32 ;定义addr1符号值为 ;绝对地址值0xlC,而且该处为ARM指令。
第4章ARM汇编语言程序设计
例 4.9
LCLA Test3 LCLL Test4
使用示例:
Test3 ;声明一个局部的数值变量,变量名为Test3 SETA 0xaa ;将该变量赋值为0xaa Test4 ;声明一个局部的逻辑变量,变量名为Test4 SETL {TRUE} ;将该变量赋值为真
4.2.2数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCDO DCI DCQ(DCQU) DCFS(DCFSU) DCFD(DCFDU) SPACE FIELD MAP LTORG
1.AREA
格 式:AREA 段名 属性1,属性2,……
功 能:AREA伪操作用于定义一个代码段、 数据段或特定属性的段。 其中,段名若以数值开头,则该段名需用 “|”括起来,如|1_test|,用C的编译器产生 的代码一般也用“|”括起来。属性字段表示 该代码段(或数据段)的相关属性,多个 属性用逗号分隔。
4.1汇编语言程序格式
• • • • 4.1.1汇编语言的基本概念 4.1.2汇编语言源程序的组成 4.1.3汇编语言程序中常用的符号 4.1.4汇编语言程序中的表达式和运算符
4.1.1汇编语言的基本概念
4.1.2汇编语言源程序的组成
1.汇编语言源程序的结构
AREA Init,CODE,READONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,#0xFF STR R1,[R0] LDR R0,=0x3FF5008 LDR R1,#0x01 STRR1,[R0] … END
4.1.3汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号表 示变量、常量和地址 符号由大小写字母、数字以及下划线组成。 符号区分大小写,同名的大、小写符号会被 编译器认为是两个不同的符号。 符号在其作用范围内必须唯一,即在其作用 范围内不可有同名的符号。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。
汇编语言源程序格式
2.1 汇编语言语句格式
同其他程序设计语言一样,汇编语言的翻译器 (汇编程序)对源程序有严格的格式要求。这样, 汇编程序才能确切翻译源程序,形成功能等价的 机器指令(目标代码),连接后能直接运行。汇 编语言程序格式就是汇编语言必须遵循的语法规 则。
汇编语言语句类型
汇编语言源程序由语句序列构成,汇编语言程序中的语句可以分为 指令语句、伪指令语句和宏指令语句三种。 (1) 指令语句:对应于CPU指令系统中的一条机器指令,由 CPU执行,能完成一定操作功能,能够翻译成机器代码的语句。 (2) 伪指令语句:无对应的机器指令,不由CPU执行,只为汇编 程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码 的语句。 (3) 宏指令语句:就是由若干条指令语句形成的语句,一条宏指 令语句的功能相当于若干条指令语句的功能,详见第5章。
汇编语言语句格式
汇编语言源程序中的每个语句可以由4项组成,格式如下: [名字:] 操作码 [操作数[,操作数]] [;注释] 其中,名字项是一个符号项。 操作码项是一个操作码的助记符,它可以是指令、伪指令或宏指令 名。 操作数项由一个或多个表达式组成,它提供为执行所要求的操作而 需要的信息。 注释项用来说明程序或语句的功能。“;”为识别注释项的开始。 带方括号的项是可选项,需要根据具体情况而定。 汇编语言源程序中的每条语句一般占一行,各项之间必须用空格或 制表符作为分隔符,操作数之间用逗号分隔。
【例2.3】AND AL,78H AND 0FH
等价于: AND AL,08H
【例2.4】设VALUE是字节型变量,分析下面这条语句执 行完AL寄存器的内容。
MOV AL,VALUE AND 01H
在汇编后,该语句的源操作数(VALUE AND 01H)可 能产生两个结果之一:当VALUE值的D0位为1时, VALUE和01与操作的结果为01H,则该语句变成MOV AL,01H;当VALUE值的D0位为0时,VALUE和01与操 作的结果为00H,则该语句变成MOV AL,00H。因此, 执行后AL寄存器的内容为01H或00H。
ARM汇编语言的语法知识
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-64K~64K; 当地址值是字对齐时,其取值范围为-256K~256K; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADRL伪指令在同一个代码段中 .
• ARM伪指令——大范围的地址读取
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-255~255字节; 当地址值是字对齐时,其取值范围为-1020~1020字节; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADR伪指令在同一个代码段中.
• ARM伪指令——中等范围的地址读取
;单元,并初始化为0
• ARM汇编语言伪指令----数据定义伪操作
MAP MAP用于定义一个结构化的内存表的首地址.此时,内存 表的位置计数器设置成该地址值.该伪操作可以用"^"代替.
MAP伪操作举例
LTORG伪操作通常放在无条件跳转指令之后,或者子程
序返回指令之后,这样处理器就不会错误地将数据池中的
数据当做指令来执行.
用LTORG伪指令定义数据缓冲池举例
Funel
;子程序
LDR R1, =0x8000;将0x8000加载到R1
MOV PC, LR
LTORG
;定义数据缓冲池,存放0x8000
Data SPACE 40 ;从当前位置开始分配40字节的内存
使用示例:
height DN width SN lower FN
6 ;将VFP双精度寄存器6名称定义为height 16 ;将VFP单精度寄存器16名称定义为width 6 ;将浮点寄存器6名称定义为lower
arm汇编语言格式
arm汇编语言格式
ARM汇编语言是一种底层的程序设计语言,用于编写针对ARM
架构的机器码指令。
ARM汇编语言的格式包括以下几个方面:
1. 注释,注释用于解释代码的作用和功能,以分号(;)开头。
注释对于代码的可读性和理解很重要。
2. 指令,指令是汇编语言的核心部分,用于执行特定的操作。
指令可以包含操作码(opcode)和操作数(operand)。
操作码指定
要执行的操作,操作数提供操作所需的数据。
3. 标号,标号用于标识代码的位置或跳转目标。
标号以英文字母、数字和下划线组成,以冒号(:)结尾。
4. 寄存器,ARM架构有一组通用寄存器,用于存储和处理数据。
寄存器以英文字母r开头,后跟一个数字,表示寄存器的编号。
例如,r0表示第一个通用寄存器,r1表示第二个通用寄存器,依此类推。
5. 操作数,操作数可以是立即数(immediate)、寄存器、内
存地址等。
立即数是直接出现在指令中的数值,寄存器是存储数据的容器,内存地址是存储器中数据的位置。
6. 伪指令,伪指令是用于辅助程序开发的指令,不会被转化为机器码。
伪指令以句点(.)开头,常用的伪指令有定义数据段、定义代码段、定义常量等。
7. 指令格式,ARM汇编语言的指令格式通常包括操作码、目的寄存器、源操作数和条件码。
具体的指令格式会根据不同的指令而有所不同。
总结起来,ARM汇编语言的格式包括注释、指令、标号、寄存器、操作数、伪指令和指令格式。
这些元素共同构成了ARM汇编语言的语法规则,通过合理的组合和使用,可以编写出有效的ARM汇编代码。
arm汇编指令格式
arm汇编指令格式ARM汇编指令格式ARM汇编语言是一种底层程序设计语言,用于直接操控ARM处理器的指令和寄存器。
ARM汇编指令格式是编写ARM汇编程序的基础,本文将一步一步详细解答与ARM汇编指令格式相关的问题。
第一部分:ARM汇编基础在深入理解ARM汇编指令格式之前,我们需要先了解一些基本概念。
ARM 处理器是英国公司ARM Holdings开发的一种低功耗、高性能的处理器体系架构,广泛应用于移动设备、嵌入式系统等领域。
ARM汇编语言是ARM 处理器的机器码的可读形式,用于编写底层程序。
在ARM汇编语言中,指令以二进制形式表示,通常以助记符的形式出现。
每条指令占用一个或多个字(通常一个字等于4个字节),按字节编址。
第二部分:指令格式详解ARM处理器的指令格式包括指令助记符、操作数和操作码等部分。
ARM 汇编指令格式的一般形式如下:[label:] mnemonic{cond}{S} Rd, Rn, Operand2其中,[label:]为可选项,表示标号,用于在程序中跳转或引用;mnemonic为指令的助记符,用于表示具体的操作;{cond}为可选项,表示条件代码,用于指定是否执行指令;{S}为可选项,表示是否更新条件代码;Rd表示目标操作数的寄存器;Rn表示源操作数的寄存器;Operand2为第二个操作数。
指令助记符(mnemonic)代表具体的指令功能,例如ADD表示加法、MOV表示数据传输等。
条件代码(cond)用于指定是否执行指令,常用的条件代码有EQ(等于)、NE(不等于)、GT(大于)等。
这样,我们可以根据需要选择是否在特定条件下执行指令。
更新条件代码(S)表示执行指令后是否更新条件代码寄存器。
如果设置了该标志位,则根据指令的结果设置条件代码寄存器。
目标操作数(Rd)是指令的结果存储的寄存器,源操作数(Rn)是参与指令计算的寄存器。
操作数(Operand2)是指令的第二个操作数,可以是立即数、寄存器的偏移值、寄存器的移位值等。
第二讲_ARM汇编语言程序设计
•在ARM汇编语言中,子程序调用是通过BL指令来完成的。 BL指令的语法格式如下: •BL subname •其中,subname是被调用的子程序的名称。
子程序的返回
在返回调用子程序时,转移链接指令保存到LR寄存器 (r14)中的值需要拷贝回程序寄存器PC(r15)。
跳转表思想
•在程序设计中,有时为使程序完成一定的 功能,需要调用一系列子程序中的一个,而 决定究竟调用哪一个由程序的计算值确定。 跳转表是解决该问题的有效方案。跳转表是 利用程序计数器PC在通用寄存器文件中的可 见性来实现的,如下例所示:
第二讲
ARM汇编语言程序设计
ARM汇编语言程序设计
ARM汇编中的文件格式 ARM汇编语言语句格式 ARM汇编语言程序格式 ARM汇编语言编程的重点 ARM汇编程序实例
一、ARM汇编中的文件格式
ARM 源程序文件(可简称为源文件)可以由任意一 种文本编辑器来编写程序代码,它一般为文本格式。在 ARM程序设计中,常用的源文件可简单分为以下几种:
• 这是ARM中典型的数据理指令,格式 如下所示:
ADD r0, r1, r2 ;r0 <= r1 + r2
立即数操作
• 在数据处理指令中,第二操作数除了 可以是寄存器,还可以是一个立即数,如 下所示: • ADD R3, r3,#1 ;r3 <= r3 + 1 • AND R8, r7,#0xff ;r8 <= r7[7:0] •需要特别注意的是:在32位指令编码中, 有效立即数是由一个8位的立即数循环右移 2n位得到。
• CODE32 • INTO_ARM • ADR R0,INTO_THUMB+1 • BX R0 • ….. • CODE16 • INTO_THUMB ……. • ADR R5,INTO_ARM • BX R5
第五讲-ARM汇编语言程序设计.ppt
LCLA num1 LCLS str3
num1 SETA str3 SETS
;
0x1234;
;
“Hello!”;
变量代换
如果在字符串变量的前面有一个$字符,在汇编时编 译器将用该字符串变量的内容代替该串变量。 例:
LCLS LCLS str1 str2
str1 str2 SETS “book” SETS “It is a $str1”
ARM 的指令系统
授课教师:蔡卫明 E-mail:caiwm@ 二O一一年八月 杭州汇文教育咨询有限公司
ARM源程序文件
文件类型 扩展名 .s .c
使用简单的 文本编辑器或 者其他的编程 开发环境进行 编辑.
汇编语言文件 C语言源文件
C++源文件
引入文件 头文件
.cpp
.INC .h
1 汇编语言源程序格式
1.1 汇编语言程序的结构
汇编源程序示例1(test0源程序)
汇编源程序示例2
汇编源程序示例3
ARM 的汇编语言程序一般由几个段组成,每 个段均由AREA伪操作定义。 段可以分为多种,如代码段、数据段、通用 段,每个段又有不同的属性,象代码段的默 认属性为 READONLY,数据段的默认属性为 READWRITE。 本程序定义了两个段,
伪指令
没有相对应的操作码或者机器码,通常称为伪 指令,它们所完成的操作称为伪操作。 作用是为完成汇编程序作各种准备工作的,由 汇编程序在源程序的汇编期间进行处理,仅在 汇编过程中起作用。 符号定义伪指令 数据定义伪指令 汇编控制伪指令
第3章ARM汇编语言程序设计精品PPT课件
ARM汇编语言程序设计
ARM汇编的语句格式
汇编语言都具有一些相同的基本特征。 ① 一条指令一行。 ② 使用标号(label)给内存单元提供名称,从第1列
开始书写。 ③ 指令必须从第2列或能区分标号的地方开始书写。 ④ 注释跟在指定的注释字符后面(ARM使用的是
“;”),一直书写到行尾。 ARM汇编语言基本的的语句格式如下:
③ 符号在其作用范围内必须唯一。 ④ 自定义的符号名不能与系统的保留字相同。 ⑤ 符号名不应与指令或伪指令同名。
ARM汇编语言程序设计
ARM汇编语言伪操作
伪操作(Directive)是ARM汇编语言程序里的一些 特殊的指令助记符,其作用主要是为完成汇编程序 做各种准备工作,对源程序运行汇编程序处理,而 不是在计算机运行期间由处理器执行。不同的编译 程序所使用的伪操作有所不同,本书中仅列举在 ARM公司推出的开发工具ADS/SDT中常用的部分伪操 作,如表3-1所示,如有更进一步需要,请查阅编 译工具的技术文档。
ARM汇编语言程序设计
ARM汇编语言伪指令
ARM汇编语言程序设计
ADR伪指令—小范围的地址读取
在汇编编译器编译源程序时,ADR伪指令被编译器替换 成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实 现,则产生错误,编译失败。ADR伪指令中的地址是基 于PC或寄存器的,当ADR伪指令中的地址是基于PC时, 该地址与ADR伪指令必须在同一个代码段中。
示例:
LDR r1,=0xff ; 将0xff读取到r1中
; 编译后得到MOV r1,0xff
示例:
LDR r1, =ADDR ; 将外部地址ADDR读取到R1中
ARM汇编语言程序设计
ARM 指令系统
4.1.1 符号定义伪指令
常见的符号定义伪指令有如下几种:
— 用于定义全局变量的GBLA、GBLL和GBLS。 — 用于定义局部变量的LCLA、LCLL和LCLS。 — 用于对变量赋值的SETA、SETL、SETS。 — 为通用寄存器列表定义名称的RLIST。
1、 GBLA、GBLL和GBLS
表达式的值为当前数据域在内存表 中所占的字节数。
FIELD伪指令常与MAP伪指令配合使用来定义结
构 化 的 内 存 表 。 MAP 伪 指 令 定 义 内 存 表 的 首 地 址 , FIELD伪指令定义内存表中的各个数据域,并可以为 每个数据域指定一个标号供其他的指令引用。
注意 MAP和FIELD伪指令仅用于定义数据结
DCD(DCDU)用于分配一片连续的字存储单元并 用指定的数据初始化。
SPACE 用于分配一片连续的存储单元
MAP 用于定义一个结构化的内存表首地址
FIELD 用于定义一个结构化的内存表的数据域
1、 DCB(DCB也可用“=”代替)
语法格式: 标号 DCB 表达式
DCB伪指令用于分配一片连续的字节 存储单元并用伪指令中指定的表达式初 始化。其中,表达式可以为0~255的数 字或字符串。
HandleReserved # 4
HandleIRQ
#4
HandleFIQ
#4
ARM 指令系统
4.1.3 汇编控制伪指令
汇编控制伪指令用于控 制汇编程序的执行流程
常用的汇编控制伪指令包括 : — IF、ELSE、ENDIF — WHILE、WEND — MACRO、MEND — MEXIT
1 IF、ELSE、ENDIF (等价于[ | ] )
ARM汇编语言程序设计
DCB
语法格式: {标号} DCB 体现式
体现式取值范围:-128~255旳数字或字符串。 DCB:“=”
Nullstring DCB “Null string”,0 ;构造一种以0结尾旳字符串
DCW(或DCWU)
语法格式: {标号} DCW(或DCWU) 体现式
DCW:半字对齐 DCWU:不严格半字对齐。 体现式取值范围:-32768~65535
SPACE objectsize
;全局旳数字变量objectsize ,为0 ;将该变量赋值为0xff ;引用该变量
statusB
GBLL statusB ;全局旳逻辑变量statusB ,为{False} SETL {TRUE} ;将该变量赋值为真
全局:作用范围为包括该变量旳源程序
LCLA、LCLL和LCLS
;包括源文件file1.s ;包括源文件file2.s ;包括源文件file3.s
伪指令
ADR ADRL LDR NOP
ADR-小范围旳地址读取伪指令
语法格式 ADR{cond} register, expr cond:可选旳指令执行条件 register:目旳寄存器 expr:基于PC或寄存器旳地址体现式,取值范围: 地址非字对齐,-255~255 地址字对齐,-1020~1020
{寄存器列表}
Context RLIST {r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context ,可在ARM指令 LDM/STM中经过该名称访问寄存器列表。排列顺序无 关
数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD
ARM汇编语言编程详解
ARM汇编语言编程详解硅谷芯微嵌入式学院技术贡献网址:4.1 汇编语言使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。
每一种汇编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。
在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。
先介绍一个例子来说明ARM汇编程序的格式。
例1 计算20+8,结果放入R0寄存器。
AREA Buf, DATA, READWRITE ;声明数据段Buf Count DCB 20 ;定义一个字节单元Count AREA Example, CODE, READONLY ;声明代码段ExampleENTRY ;标识程序入口CODE32 ;声明32位ARM指令STARTLDRB R0, Count ;R0 = Count =20MOV R1, #8 ;R1 = 8ADD R0, R0, R1 ;R0 = R0 + R1B STARTEND例1中定义了两个段:数据段Buf和代码段Example 。
数据段中定义了字节单元Count,其中Count用来保存一个被加数;代码段中包含了所有源程序代码,程序中首先读取Count字节单元的内容,然后与立即数8相加,计算结果保存到R0中。
由例1可见,ARM汇编语言的源程序是分段的,由若干个段组成一个源程序。
源程序的一般格式为:AREA name1, attr ;声明特定的段标号语句1 ;语句...语句nAREA name2, attr标号语句n+1...语句n+mEND ;结束符每一个段都有一个名字,并且段名是唯一的。
每个段以符号AREA作为段的开始,以碰到下一个符号AREA 作为该段的结束。
段都有自己的属性,如是代码段(CODE)还是数据段(DATA),是只读(READONLY )还是可读写(READWRITE)?这些属性可以在attr栏中设定。
第10讲_第5章ARM汇编语言程序指示符与语句格式 101页
本讲主要参考文献
ARM公司英文资料: 公司英文资料: 公司英文资料
ADS_AssemblerGuide_B.pdf DDI0100E_ARM_ARM.pdf
中文图书
《ARM体系结构与编程》,清华大学出版社 《嵌入式系统基础教程》,机械工业出版社
2008年10月23日
2008年10月23日
南京大学计算机系
22
逻辑表达式
逻辑表达式由逻辑常量、逻辑操作符、关系操 作符以及括号组成。取值范围为{FALSE}和 {TRUE}。
2008年10月23日
南京大学计算机系
23
地址标号
当符号代表地址时称为标号(Label)。 以数字开头的标号其作用范围是当前段(没有 使用ROUT指示符时),这种标号又称为局部 标号(Local Label)。
2008年10月23日 南京大学计算机系 13
符号命名和书写规则( 符号命名和书写规则(续)
⑥符号在其作用范围内必须唯一。 ⑦当程序中的符号与指令助记符或者指示符同名时, 用双竖线将符号括起来。如||buffe_a||,这时双竖线 并不是符号的组成部分。 ⑧在ARM汇编语言程序中,所有符号必须在一行的最 左边位置开始书写,即所谓的顶格书写,不允许包 含空格或者制表符。 ⑨符号的字符序列中不能大小写字母相混杂。
2008年10月23日 南京大学计算机系 17
逻辑值常量
布尔常量TRUE和FALSE在表达式中写为: {TRUE},{FALSE}。
2008年10月23日
南京大学计算机系
18
表达式
ARM汇编语言中的表达式由符号、数值、单 目操作符、双目操作符以及括号组成。运算的 优先级次序与标准C一样。
4.1 汇编语言源程序格式
4.1 汇编语言源程序格式4.1.1 汇编语言程序的结构在详细介绍ARM汇编语言之前,先给出一个汇编源程序示例,使读者对ARM 汇编语言程序的结构有一个大概的了解。
CODE32 ;32位的ARM指令段AREA codesec, CODE, READONLY ;代码段,名称为codesec,属性为只读main PROC ;函数mainSTMFD sp!,{lr} ;保存必要的寄存器和返回地址到数据栈ADR r0,strhello ;取标签strhello代表的地址值BL _ printf ;调用C运行时库的_printf函数打印;“Hello world!”字符串BL welcomefun ;调用子函数welcomfunLDMFD sp!,{pc} ;恢复寄存器值strhello ;strhello代表本地字符串的地址DCB "Hello world!\n\0" ;定义一段字节空间ENDP ;函数main结束welcomefun ;子函数welcomfunSTMFD sp!,{lr} ;保存必要的寄存器和返回地址到数据栈ADR r0,adrstrarm ;取adrstrarm的地址放到寄存器r0中LDR r0,[r0,#0] ;将strarm的值放到r0中BL _ printf ;调用C运行时库的_printf函数打印;“Welcom to ARM world!”字符串LDMFD sp!,{pc} ;恢复寄存器值adrstrarm ;adrstrarm标签DCD strarm ;保存strarm的地址AREA constdatasec, DATA, READONLY,ALIGN=0 ;数据段,名称为constdatasec,;属性为只读strarmDCB "Welcome to ARM world!\n\0" ;存放“WelcometoARM world!”;字符串EXPORT main ;导出main函数供外部调用;引入3个C运行时库函数和ARM库IMPORT _mainIMPORT __mainIMPORT _printfIMPORT ||Lib$$Request$$armlib||, WEAKEND ;程序结束将上面代码保存为hello.s,Windows系统下在终端输入命令行:armcc -g hello.s -o hello.axf将hello.s编译成映像文件hello.axf。
ARM汇编语言程序格式
ARM汇编语⾔程序格式可执⾏映象⽂件的格式: *.axm *.bin *.elf *.hex代码段⽰例:汇编语⾔源程序的基本结构:AREA Init,CODE,READONLYENTRYStartLDR R0,=0x3FF50000LDR R1,0xFFSTR R1,[R0]LDR R0,=0x3FF5008LDR R1,0x01STR R1,[R0]ENDArm 体系结构3种执⾏流程:1 顺序执⾏2 跳转执⾏3 异常中断执⾏Arm ⼦程序调⽤使⽤命令BL ⼦程序名称⼦程序调⽤⽰例:AREA Init ,CODE ,READONLYENTRYStartLDR R0 ,=0x3FF5000LDR R1 ,0xFFSTR R1 ,[R0]其中:如果⼀⾏中有多个汇编指令,指令之间使⽤分号(;)分开。
在⼀条指令占多⾏,要使⽤续⾏符号(\).在C/C++程序中内嵌汇编指令注意事项:必须⼩⼼使⽤物理寄存器,如R0~R3,SP,LR 和CPSR 中的N,Z,C,V 标志位.因为计算汇编代码中的C 表达式时,可能会使⽤这些物理寄存器,并会修改N,Z,C,V标志位。
__asm{MOV R0,xADD y,R0,x/y //计算x/y 时R0 会被修改}在计算x/y 时R0 会被修改,从⽽影响R0+x/y 的结果.⽤⼀个C 程序的变量代替R0就可以解决这个问题:__asm{MOV var,xADD y,var,x/y}内嵌汇编器探测到隐含的寄存器冲突就会报错.不要使⽤寄存器代替变量.尽管有时寄存器明显对应某个变量,但也不能直接使⽤寄存器代替变量.int bad_f(int x) //x 存放在R0 中{__asm{ADD R0,R0,#1 //发⽣寄存器冲突,实际上x 的值没有变化}return(x);尽管根据编译器的编译规则似乎可以确定R0 对应x,但这样的代码会使内嵌汇编器认为发⽣了寄存器冲突.⽤其他寄存器代替R0 存放参数x,使得该函数将x 原封不动地返回.这段代码的正确写法如下:int bad_f(intx){__asm{ADD x,x,#1}return(x)}从汇编程序中访问C程序变量在C程序中声明的全局变量可以被汇编程序通过地址间接访问。
arm的书写格式
arm的书写格式
在编写ARM汇编语言源程序时,需要遵循一定的规范,以保持代码的可读性和准确性。
以下是关于ARM汇编语言书写格式的一些要点:
1. 标号(symbol):标号必须在一行的顶格书写。
在ARM汇编程序中,
标号一般由字母、数字和下划线组成,不能以数字开头。
2. 指令(instruction):所有的指令均不能顶格书写,指令前面应该有空格,一般用tab键。
ARM汇编器对指令的大小写敏感,因此书写指令时,
大小写要一致。
3. 注释(comment):注释内容由“;”开始一直到此行结束,注释可以
顶格写。
4. 变量和常量(variable and constant):定义变量、常量时,其标识符
必须在一行的顶格书写。
5. 分行(line break):如果单行指令太长,可以使用字符“\”实现分行,“\”后边不能有任何字符。
6. 空行(empty line):为了增加源程序的可读性,在完成不同功能的代码段之间可以适当插入一些空行。
遵循这些格式规范,可以确保你的ARM汇编语言源程序正确、清晰地表达你的意图,并能够被编译器正确地解析和执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM汇编语言源程序格式ARM汇编语言源程序格式2010-11-16 13:52来源:MCU嵌入式领域常用ARM源程序文件类型汇编语言程序的结构1汇编语言程序的结构2汇编语言程序的结构3汇编语言程序的结构4 ARM的汇编语言程序一般由几个段组成,每个段均由AREA伪操作定义。
段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,如代码段的默认属性为READONLY,数据段的默认属性为READWRITE。
本程序定义了两个段,第一个段为代码段codesec,它在存储器中存放用于程序执行的代码以及main函数的本地字符串;第二个段为数据段constdatasec,存放了全局的字符串,由于本程序没有对数据进行写操作,该数据段定义属性为READONLY。
汇编语言的行构成1格式:[标签]指令/伪操作/伪指令操作数[;语句的注释]所有的标签必须在一行的开头顶格写,前面不能留空格,后面也不能跟C 语言中的标签一样加上":";ARM汇编器对标识符的大小写敏感,书写标号及指令时字母的大小写要一致;注释使用";"符号,注释的内容从";"开始到该行的结尾结束汇编语言的行构成2标签标签是一个符号,可以代表指令的地址、变量、数据的地址和常量。
一般以字母开头,由字母、数字、下划线组成。
当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个ROUT伪操作之前。
指令/伪操作指令/伪操作是指令的助记符或者定义符,它告诉ARM的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能。
汇编语言的标号1标号代表地址。
标号分为段内标号和段外标号。
段内标号的地址值在汇编时确定,段外编号的地址值在链接时确定。
在程序段中,标号代表其所在位置与段首地址的偏移量。
根据程序计数器(PC)和偏移量计算地址即程序相对寻址。
在映像中定义的标号代表标号到映像首地址的偏移量。
映像的首地址通常被赋予一个寄存器,根据该寄存器值与偏移量计算地址即寄存器相对寻址。
例如:loop SUBS r0,r0,#1;每次循环使r0=r0-1 BNE loop;跳转到loop标号去执行汇编语言的标号2在宏中也可以使用局部符号。
局部标号是0~99的十进位数开始,可以重复定义。
局部标号引用格式:%{F|B}{A|T}N{routname}%:局部标号引用操作。
F:编译器只向前搜索。
B:编译器只向后搜索。
A:编译器搜索宏的所有嵌套层次。
T:编译器搜索宏的当前层。
例如:01 SUBS r0,r0,#1;每次循环使r0=r0-1 BNE%B01;跳转到01标号去执行汇编语言的常量常量:其值在程序运行过程中不能被改变的量。
(1)数字常量:数字常量有3种表示方式:十进制数,如1、2、123十六进制数,如0x123,0xabc n进制数,形式为n_XXX,n的范围是2到9,XXX是具体数字(2)字符常量:由单引号及中间的字符组成,包括C语言中的转义字符,如'a','\n'(3)字符串常量:由一对双引号及中间的字符串表示,中间也可以使用C语言中的转义字符,比如:"abcdef[message]xa\r\n"(4)逻辑常量:{TRUE},{FALSE},注意带大括号汇编程序的变量代换1这里所说的变量,是相对于汇编程序的"变量",是用于汇编程序进行处理的,但一旦编译到程序中,则不会改变,成为常量。
在字符串变量的前面有一个$字符,在汇编时编译器将用该字符串变量的内容代替该串变量。
在数字变量前面有一个代换操作符"$",编译器会将该数字变量的值转换为十六进制的字符串,并用该十六进制的字符串代换"$"后的数字变量。
需要将"$"字符加入到字符串中,可以用"$$"代替,此时编译器将不再进行变量代换,而是把"$$"看作一个"$"。
在两个"|"之间的"$"并不进行变量的代换,但如果"|"在双引号内,则将进行变量代换。
使用"."来表示字符串中变量名的结束。
汇编程序的变量代换2字符串"aaa str1$str1.l1$l1,a1$c"中的3个变量将在编译时被替换。
程序运行后看到下面结果:aaa str1:bbb l1:T,a1:0000004 Fccc伪指令在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。
在ARM的汇编程序中,有如下几种伪指令:符号定义伪指令数据定义伪指令汇编控制伪指令信息报告伪指令宏指令以及其他伪指令符号定义伪指令作用:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
符号定义有如下几种伪指令:用于定义局部变量的LCLA、LCLL和LCLS。
用于定义全局变量的GBLA、GBLL和GBLS。
用于对变量赋值的SETA、SETL和SETS。
为通用寄存器列表定义名称的RLIST。
符号定义伪指令1-1(1)LCLA、LCLL和LCLS格式:LCLA/LCLL/LCLS局部变量名说明:LCLA、LCLL和LCLS伪指令用于定义一个汇编程序中的局部变量并初始化。
其中:LCLA定义一个局部的数字变量,初始化为0。
LCLL定义一个局部的逻辑变量,初始化为F。
LCLS定义一个局部的字符串变量,初始化为空串。
这3条伪指令用于声明局部变量,在其局部作用范围内变量名必须惟一,例如在宏内。
符号定义伪指令1-2符号定义伪指令2-1 2)GBLA、GBLL和GBLS格式:GBLA/GBLL/GBLS变量名说明:GBLA、GBLL和GBLS伪操作定义一个汇编程序中的全局变量并初始化。
其中:GBLA定义一个全局数字变量,并初始化为0。
GBLL定义一个全局逻辑变量,并初始化为F。
GBLS定义一个全局字符串变量,并初始化为空串。
这3条伪指令用于定义全局变量,因此在整个程序范围内变量名必须惟一。
符号定义伪指令2-2例如:GBLA num1;定义一个全局的数字变;量,变量名为num1 num1 SETA 0xabcd;将该变量赋值为0xabcd GBLL l2;定义一个全局的逻辑变;量,变量名为l2 l2 SETL{FALSE};将该变量赋值为假GBLS str3;定义一个全局的字符串变;量,变量名为str3 str3 SETS"Hello!";将该变量赋值为"Hello!"符号定义伪指令3-1(3)SETA、SETL和SETS格式:变量名SETA/SETL/SETS表达式说明:SETA:给一个数字变量赋值。
SETL:给一个逻辑变量赋值。
SETS:给一个字符串变量赋值。
格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。
符号定义伪指令3-2例如:LCLA num1;定义一个局部的数字;变量,变量名为num1 num1 SETA 0x1234;将该变量赋值;为0x1234 LCLS str3;定义一个局部的字符串变;量,变量名为str3 str3 SETS"Hello!";将该变量赋值为;"Hello!"符号定义伪指令4 4)RLIST格式:名称RLIST{寄存器列表}说明:RLIST可用于对一个通用寄存器列表定义名称,该名称可在ARM指令LDM/STM中使用。
在LDM/STM指令中,列表中的寄存器为根据寄存器的编号由低到高访问次序,与列表中的寄存器排列次序无关。
例如:pblock RLIST{R0-R3,R7,R5,R9};将寄存器列表名称定义为pblock,可在ARM指令;LDM/STM中通过该名称访问寄存器列表数据定义伪指令作用:为数据分配存储单元,同时初始化。
有如下几种:DCB字节分配DCW/DCWU半字(2字节)分配DCD/DCDU字(4字节)分配DCQ/DCQU 8个字节分配DCFS/DCFSU单精度浮点数分配DCFD/DCFDU双精度浮点数分配SPACE分配一块连续的存储单元FIELD定义一个结构化的内存表的数据域MAP定义一个结构化的内存表首地址数据定义伪指令1(1)DCB格式:标号DCB表达式说明:分配一块字节单元并用伪指令中指定的表达式进行初始化。
表达式可以为使用双引号的字符串或0~255的数字。
DCB可用"="代替。
例如:Array1 DCB 1,2,3,4,5;数组str1 DCB"Your are welcome!";构造字符串并分配空间数据定义伪指令2(2)DCW/DCWU格式:标号DCW/DCWU表达式说明:DCW分配一段半字存储单元并用表达式值初始化,它定义的存储空间是半字对齐的。
DCWU功能与DCW类似,只是分配的字存储单元不严格半字对齐。
例如:Arrayw1 DCW 0xa,-0xb,0xc,-0xd;构造固定数组并分配半字存储单元数据定义伪指令3(3)DCD/DCDU格式:标号DCD/DCDU表达式说明:DCD伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。
DCD也可用"&"代替。
DCDU功能与DCD类似,只是分配的存储单元不严格字对齐。
例如:Arrayd1 DCD 1334,234,345435;构造固定数组并分配字为单元的存储单元Label DCD str1;该字单元存放str1的地址数据定义伪指令4(4)DCQ/DCQU格式:标号DCQ/DCQU表达式说明:DCQ用于分配一块以8个字节为单位的存储区域并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。
DCQU功能与DCQ类似,只是分配的存储单元不严格字对齐。
例如:Arrayd1 DCQ 234234,98765541;构造固定数组并分配字为单元的存储空间。
;注意:DCQ不能给字符串分配空间数据定义伪指令5(5)DCFD/DCFDU格式:标号DCFD/DCFDU表达式说明:DCFD用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。
每个双精度的浮点数占据两个字单元。
DCFDU功能与DCFD类似,只是分配的存储单元不严格字对齐。
例如:Arrayf1 DCFD 6E2 Arrayf2 DCFD 1.23,1.45数据定义伪指令6(6)DCFS/DCFSU格式:标号DCFS/DCFSU表达式说明:DCFS用于为单精度的浮点数分配一片连续的字存储单元并用表达式初始化,它定义的存储空间是字对齐的。