第9章 ARM汇编语言程序设计基础

合集下载

第9章 ARM汇编语言程序设计基础

第9章 ARM汇编语言程序设计基础
为程序中的常量、标号等定义一个等效的 字符名称,类似于 C 语言中的#define 。 EQU语法格式 : 名称 EQU 表达式 { ,类型 } ; 其中 EQU 可用 “ * ” 代替
当表达式为 32 位的常量时,可以指定表达式的数据 类型,可以有以下三种类型: CODE16 、 CODE32 和 DATA 。
MAP 和FILED 只定义数据结构,不实际分配存储单元。
汇编控制伪指令
用于控制汇编程序的执行流程。
常用的汇编控制伪指令包括以下几条: (1) IF、ELSE、ENDIF
语法格式:
IF 逻辑表达式 指令序列 1 ELSE 指令序列 2 ENDIF
(2) WHILE、WEND
(循环)
语法格式: WHILE 逻辑表达式 指令序列 WEND
用于对一个通用寄存器列表定义名称,使用
该伪指令定义的名称可在 ARM 指令 LDM/STM 中使用。
语法格式:名称 RLIST { 寄存器列表 }
在 LDM/STM 指令中,列表中的寄存器访问次序为根据寄 存器的编号由低到高,而与列表中的寄存器排列次序无关。
内存分配伪指令
为特定的数据分配存储单元,同时可完成已分配存储单 元的初始化。
(1)DCB 用于分配一段连续的字节单元并初始化 语法格式: 标号 DCB 表达式 str DCB “This is a test!”
(2) DCW(或DCWU)
用于分配一段连续半字节单元 并初始化 DCW: 半字对齐 DCWU:不严格半字对齐 语法格式: 标号 DCW (或 DCWU ) 表达式 Str DCW 1,2,3
2. 汇编语言程序中常用的符号
① 符号名不应与指令或伪指令同名; ② 符号在其作用范围内必须唯一; ③ 符号区分大小写,同名的大、小写符号被视为两个不同 的符号; ④ 自定义的符号名不能与系统保留字相同。

ARM汇编语言程序设计

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时,要特别小心。内联汇编中的设置很可能会 和编译器计算的表达式的结果冲突。
编译器使用一套规则的来设置寄存器的用法

02实验二 ARM汇编语言程序设计

02实验二 ARM汇编语言程序设计

实验二 ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编指令二、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。

2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。

三、汇编语言简介1.ARM汇编的一些简要的书写规范ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。

ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。

在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。

注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。

详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。

2. ARM汇编语言程序的基本结构在ARM汇编语言程序中,是以程序段为单位来组织代码。

段是相对独立的指令或数据序列,具有特定的名称。

段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。

一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。

可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。

◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。

◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。

链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。

源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。

3. 简单的小例子下面是一个代码段的小例子AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]……END在汇编程序中,用AREA指令定义一个段,并说明定义段的相关属性,本例中定义了一个名为Init的代码段,属性为只读。

ARM汇编语言程序设计基础

ARM汇编语言程序设计基础
name LIST{list of registers} } {
name CN expr name CP expr name DN/SN expr name FN expr
符号定义伪操作举例
GBLA arithmetic ;定义变量 定义变量 arithmitic SETA 0xEF ;赋值 赋值 ;arithmitic EQU 0xEF GBLL logical logical SETL {TRUE} ;{} GBLS SETS string “haha”
伪操作
符号定义( 符号定义(Symbol Definition) ) 伪操作 内存分配(数据定义)( )(Data Definition) 伪操 内存分配(数据定义)( ) 作 汇编控制( 汇编控制(Assembly Control) ) 伪操作 其他 (Miscellaneous) 伪操作 )
1、符号定义伪操作
name LIST{list of registers} } {
name CN expr name CP expr name DN/SN expr name FN expr
1、符号定义伪操作
伪操作 语法格式 作用
声明一个全局的算术“伪变量” 并将其初始化成 。 声明一个全局的算术“伪变量”,并将其初始化成0。 声明一个全局的逻辑变量,并将其初始化成 声明一个全局的逻辑变量,并将其初始化成{FALSE}。 。 声明一个全局的字符串变量,并将其初始化成空串“”。 声明一个全局的字符串变量,并将其初始化成空串“”。 “” 声明一个局部的算术变量,并将其初始化成 。 声明一个局部的算术变量,并将其初始化成0。 声明一个局部的逻辑变量,并将其初始化成 声明一个局部的逻辑变量,并将其初始化成{FALSE}。 。 声明一个局部的串变量,并将其初始化成空串“”。 声明一个局部的串变量,并将其初始化成空串“”。 “” 给一个全局或局部算术变量赋值。 给一个全局或局部算术变量赋值。 给一个全局或局部逻辑变量赋值。 给一个全局或局部逻辑变量赋值。 给一个全局或局部字符串变量赋值。 给一个全局或局部字符串变量赋值。 为一个通用寄存器列表定义名称。 为一个通用寄存器列表定义名称。 为一个协处理器的寄存器定义名称。 为一个协处理器的寄存器定义名称。 为一个协处理器定义名称。 为一个协处理器定义名称。 DN/SN为一个双精度 单精度的 为一个双精度/单精度的 寄存器定义名称。 为一个双精度 单精度的VFP寄存器定义名称。 寄存器定义名称 为一个FPA浮点寄存器定义名称。 浮点寄存器定义名称。 为一个 浮点寄存器定义名称

ARM汇编语言程序设计基础

ARM汇编语言程序设计基础

RealView实时库包含有RTX 实时内核、Flash 文件系统、TCP/IP
协议簇、RTL-CAN(控制域网络)等。RealView实时库的实时内 核RTX免版税使用,但源码需要付费。RealView实时库带有TCP/IP 网络协议簇,完整的嵌入式网络协议族。带有Flash文件系统,可 在内存和存储系统中产生、修改文件。带有CAN协议,实现通用 ARM MCU设备的CAN驱动。带有USB协议,适用于标准Windows 设备类。所带有的例子和模板可以帮助用户快速开始使用RL-ARM 组件,所有RL-ARM组件都免版税使用。在MDK中集成了对RTI.的 配置以及一些工具。
9.1.4 μVision IDE调试器

ARM宏汇编器(armasm)可以完成标准的宏处理。条件汇编可从同一 源文件得到不同的目标文件。符号引用列表文件包含可选的符号交叉引 用信息,以提供源文件的详细信息。 ARM链接器(armlink)产生的详细列表文件非常易于用户理解。它包 含内存配置、输入模块、内存映像、符号表和交叉引用信息。全局代码 列表文件包含由链接器产生的符号反汇编信息。静态堆栈分析帮助链接 器在链接时处理堆栈请求。 ARM库管理器(armar)对库文件进行模块管理,为链接器组合、引用 多个模块提供方便。μVision IDE也可生成库文件。变量和函数引用。可 从库中抽取所需的模块,模块中的代码段如果未在应用中被使用,则它 们不会被包含在最终的输出中。库为分布在初始源代码中的大量函数和 程序段提供了一种载体。

9.1.1 µVision4 IDE
μ Vision IDE是一个集项目管理器、源代码编辑器、调试器等于一体的
集成开发环境,是一个基于Windows操作系统的嵌入式软件开发平台, µVision4 IDE主要特性如下:

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汇编语言及C语言程序设计基础

ARM汇编语言及C语言程序设计基础

示例 CMP ADD ADD 示例 CMP BHI ADD END
R1,#3 ;比较R1和#3 HI R0,R0,R1 ;if R1>3 then R0=R0+R1 LS R0,R0,#3 ;if R1<3 then R0=R0+3
R1,#3 ;比较R1和#3 END ;if R1>3 then END R0,R0,#3 ; R0=R0+3
4.1.3 ARM汇编语言伪指令

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

表4-2 ARM汇编语言伪指令列表
伪指令 语法格式 ADR{cond} register, = expression ADRL{cond}register , = expression LDR{cond} register,= expression NOP 功能 它将基于PC相对偏移的地址值或 基于寄存器相对偏移的地址值读 取到寄存器中。 它将基于PC相对偏移的地址值或 基于寄存器相对偏移的地址值读 取到寄存器中。 将一个32位的常数或者一个地址 值读取到寄存器中,可以看作是 加载寄存器的内容。 NOP是空操作伪指令,在汇编时 将会被替代成ARM中的空操作
AREA BlkCpy,CODE,READONLY ;声明代码段 SWI_WriteC EQU &0 ;输出R0中的字符 SWI_Exit EQU &11 ;程序结束 ENTRY ;代码的入口 ADR R1,TABLE1 ;R1→TABLE1 ADR R2,TABLE2 ;R2→TABLE2 ADR R3,T1END ;R3→T1END LOOP1 LDR R0,[R1],#4 ;读取TABLE1的第一个字 STR R0,[R2],#4 ;拷贝到TABLE2 CMP R1,R3 ;结束? BLT LOOP1 ;若非,则再拷贝 ADR R1,TABLE2 ;R1→TABLE2 LOOP2 LDRB R0,[R1],#1 ;读取下一个字 CMP R0,#0 ;检查文本终点 SWINE SWI_WriteC ;若非终点,则打印 BNE LOOP2 ;并返回LOOP2 SWI SWI_Exit ;执行结束 TABLE1 = “This is the right string!”,&0a,&0d,0 T1END ALIGN ;保证字对准 TABLE2 = “This is the wrong string!”,0 END ;程序源代码结束

ARM汇编程序基本知识

ARM汇编程序基本知识

ARM汇编程序根本知识1.汇编程序的根本组成ARM汇编语言程序中,程序是以程序段为单位组织代码的。

段是相对独立的指令或者代码序列,拥有特定的名称。

段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。

段使用AREA伪操作来定义,并且说明相关属性,如代码段定义AREA Init, CODE, READONLY…数据段定义AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3……等一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。

在格式上,一个汇编程序需要至少有一个ENTRY〔关于ENTRY具体内容看伪操作符ENTRY〕,还需要在汇编源文件完毕处,写上END表示该源文件的完毕。

如一个根本的汇编源程序AREA Init, CODE, READONLY ;定义一个代码段ENTRY ;标记程序入口点Start LDR R0,0x3FF5000 ;标号Start可以要,也可以不要LDR R1,0XffSTR R1,[R0]LDR R0,=0x3FF5000LDR R1,0x01STR R1,[R0]……END ;END伪操作表示根源文件完毕当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译时,最终形成一个可执行的映像文件。

一个可执行映像文件通常由以下几局部组成一个或者多个代码段,代码段属性为只读〔只读数据也放在代码段?RO〕零个或者多个初始化数据的数据段,可读写〔存放初始化了的变量数据,RW〕零个或者多个不包含初始化数据的数据段,可读写〔所有未初始化的变量,也就是ZI〕器根据系统默认或者用户设定的规那么,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会一样。

2.汇编语句应该注意的地方汇编语句格式[LABEL] OPERATION, [OPERAND], [;MENT]LABEL必须在一行的开头写。

ARM9汇编语言

ARM9汇编语言
BGE$label1.loop1
$label1.loop2;$label.loop1为宏体的内部标号
BL$p1;参数1为一个子程序的名称
BGT$label.loop2
……
ADR$p2
……
MEND;宏定义结束
在程序中调用该宏:
examjumpsub,det;调用jump,宏的标号为exam
;参数1为sub,参数2为det
ADRR0,DATA1;读取DATA1的地址0x908
LDRR2,[R0];读取DATA1的数据
4.
IF、ELSE、ENDIF
GBLLTest
IF Test = TRUE
ELSE
ENDIF
WHILE、WEND
GBLACounter
CounterSETA3
WHILECounter < 10
;
CounterSETA Counter + 1
SPACE
分配一片连续的存储单元并初始化为0,表达式是要分配的字节数。
例如,DataSpaceSPACE100
MAP
MAP表达式{,基址寄存器},定义一个结构化的内存表的首地址。
例如,MAP 0x100,R0;R0存在时首地址为R0+0x100,R0不存在时首地址为0x100。
FIELD
定义结构化内存表中的数据域,与MAP结合使用。MAP伪操作和FIELD伪操作定义的内存表有3种。
操作数域可以是常量、变量、标号、寄存器、表达式,不同对象之间用逗号隔开。
注释域以“;”开头,汇编程序对“;”之后的部分不予汇编。
2
在ARM(Thumb)汇编程序设计中,使用GBLA、GBLL、GBLS伪操作声明全局变量,使用LCLA、LCLL、LCLS声明局部变量,并可以使用SETA、SETL、SETS对其进行初始化。

第九章习题答案_ARM程序设计

第九章习题答案_ARM程序设计

9.15 阅读程序,说明如下程序完成的功能。
llsearch CMP R0, #0 LDRNEB R2, [R0] CMPNE R1, R2 LDRNE R0, [R0, #4] BNE llsearch MOV PC, LR
该程序功能为: 若R0≠0,则将R0指向的字节数据读入R2;
若R0≠0且R1≠R2,则将R0+4指向的双字数据存入R0中; 循环,直至R0=R1退出子程序。
;存放累加和 ;存放加数 ;累加次数
#2 R1 #1
;调整累加次数
8/52
9.12 试把如下C函数改写成汇编语言函数。
(1) int SubXY(int x, int y) { return x-y; } (2) void SubXY(int x, int y, int z) { z = x-y; } ( 1) AREA SubXY ,CODE,READONLY EXPORT SubXY SUB R0,R0,R1 MOV PC,LR END ( 2) AREA SubXY ,CODE,READONLY EXPORT SubXY SUB R2,R0,R1 LDR R3,=z STR R2,[R3] MOV PC,LR END

9.2 汇编语言和C语言相比,各具有什么特点?
答:汇编语言是一种用文字助记符来表示机器指令的符号 语言,是最接近机器码的一种语言。汇编语言依赖于 机器硬件,不同CPU提供的汇编指令可能有很大的不 同,因此汇编源程序几乎不具有移植性;但汇编语言 程序主要优点是速度快、效率高,更能发挥机器硬件 的长处;
汇编语言源程序汇编汇编程序机器语言程序目标代码c语言源程序编译或解释编译程序35293试用汇编代码完成如下c语言代码完成的功能
微处理器系统结构与嵌 入式系统设计

ARM汇编语言编程详解

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栏中设定。

ARM汇编语言程序设计

ARM汇编语言程序设计

① 使用伪操作声明全局变量。 GBLA GBLL GBLS Test1 Test2 {TRUE} Test3 ;定义一个全局的1 SETA 0xaa
Test2 SETL
;将该变量赋值为0xaa
;定义一个全局的逻辑变量,变量名为Test2 ;将该变量赋值为真 ;定义一个全局的字符串变量,变量名为Test3
(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化
(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化 (4)DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化 (5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指 定的数据初始化 (6)DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的 数据初始化 (7)SPACE用于分配一片连续的存储单元 (8)MAP用于定义一个结构化的内存表首地址 (9)FIELD用于定义一个结构化的内存表的数据域

13
4.1 ARM汇编器支持的伪操作

4.1.3 数据定义(Data Definition)伪操作

数据定义伪操作一般用于为特定的数据分配存储单元, 同时可完成已分配存储单元的初始化。常见的数据定义 伪操作有如下几种。

(1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化
15
4.1 ARM汇编器支持的伪操作

4.1.3 数据定义(Data Definition)伪操作


2.DCW(DCWU) (1)语法格式
DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表 达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单 元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。

arm汇编基础

arm汇编基础

arm汇编基础这⾥需要提到的是ARM处理器的汇编语⾔编程的⼀些内容,在嵌⼊式ARM系统的程序设计中往往离不开ARM汇编语⾔编程。

正如⼤家所熟知的处理器初始化部分的代码通常都是⽤汇编来编写的,还有⼀些操作协处理器的代码,以及部分中断处理程序⼀样也是⽤汇编语⾔写成的。

在开始介绍ARM处理器汇编语⾔编程之前建议读者先阅读⼀些有关ARM指令集的资料,主要是指ARM指令集、Thumb指令集及ARM宏汇编部分。

有关ARM指令集和Thumb指令集这⾥就不做具体介绍,只从ARM汇编伪指令、模块化汇编语⾔程序设计、混合语⾔编程等⼏个⽅⾯对ARM处理器汇编语⾔做⼀些简单介绍。

ARM汇编伪指令介绍在ARM处理器汇编语⾔程序设计⾥,有⼀些特殊的指令助记符。

这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作。

伪指令在源程序中的作⽤是为完成汇编程序做各种准备⼯作的,这些伪指令仅在汇编过程中起作⽤,⼀旦汇编结束,伪指令的使命就完成了。

在ARM处理器的汇编程序中,⼤体有如下⼏种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其他伪指令。

伪操作符可以分为以下⼏类。

1)数据定义伪操作符数据定义伪操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要⽤于数据表定义、⽂字池定义、数据空间分配等。

常⽤的有DCB/DCQ/DCW分配⼀段字节/双字/字内存单元,并且将它们初始化。

2)符号定义伪操作符符号定义伪操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SETA等,⽤于定义ARM汇编程序的变量,对变量进⾏赋值,以及定义寄存器名称等。

其中⽤于全局变量声明的GBLA、GBLL、GBLS和局部变量声明的LCAL、LCLL、LCLS伪指令较为常⽤。

3)报告伪操作符报告伪操作符包括ASSERT、INFO、OPT等,主要⽤于汇编报告等。

9ARM汇编程序设计

9ARM汇编程序设计

武夷学院 电子工程系
符号定义(Symbol Definition )
用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。 用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。 用于对变量赋值的 SETA 、 SETL 、 SETS 。 为通用寄存器列表定义名称的 RLIST 。
GBLA CPU ;//定一个全局算术变量 GBLL BIG_ENDIAN__ ;定义一个全局逻辑变量 BIG_ENDIAN__ SETL {FALSE} ;给全局逻辑变量赋值 为FALSE
武夷学院 电子工程系
练习
1. 把实验一的程序定义成一个独立的代码段,单独 存在一文件中.用2410的BSP可以跳到该文件中执 行程序.
武夷学院 电子工程系
武夷学院 电子工程系
ARM伪指令的作用与功能
程序定位:程序代码存储的位置,数据存储的位置, 堆栈存储的位置等 定义变量、字符、存储区 一些说明语句:程序段,数据段,堆栈段,初始 化数据段等 有条件的应用程序段:条件循环,条件选择,宏 语句等
武夷学院 电子工程系
ARM汇编伪指令的种类
伪操作
由汇编程序执行,不生成具体代码
武夷学院 电子工程系
定义常数(定义 π , e ,一般常数) 定义特殊数据表格
编码,解码,其它信息等
代码转换(BCD码转成7段LED数码显示码) 简化函数计算等
除法,开方,指数,对数等
武夷学院 电子工程系
数据定义(Data Definition
LTORG:声明一个文字池(一个字)

用于加载32位的立即数(如,0x12345678)
GET 2410addr.s GET memcfg.s
武夷学院 电子工程系

第9章-ARM汇编语言程序设计基础

第9章-ARM汇编语言程序设计基础

2 数据变量定义伪指令(.)
数据变量定义伪指令用于定义汇编程序中的变量、对 变量赋值以及定义寄存器的别名等操作。常见的数据 变量定义伪指令有如下几种: (1)、 和 语法格式: ( 或 ) 全局变量名 、 和 伪指令用于定义全局变量,并将其初始化。 其中: ① 用于定义一个全局的数字变量,并初始化为 0 ; ② 用于定义一个全局的逻辑变量,并初始化F (假);
工具包的组成
1. 编译器 提供多种编译器,以支持和指令的编译。 2. 链接器 (链接器)可以将编译得到的一个或多个目标
文件和相关的一个或多个库文件进行链接,生 成一个可执行文件,也可以将多个目标文件部 分链接成一个目标文件,以供进一步的链接。
工具包的组成
3. (集成开发环境)包括工程管理器、代码生
第9章 汇编语言程序设计基础
(集成开发环境)
应用软件的开发工具根据功能的不同, 可以分为编辑软件、编译软件、汇编软 件、链接软件、调试软件、嵌入式实时 操作系统、函数库、评估板,仿真器以 及在线仿真器等。目前有多家公司可以 提供以上不同类型的开发工具,用户采 用处理器进行嵌入式系统开发时,选择 合适的开发工具可以加快开发进度,节 省开发成本。
工具包的组成
是公司推出的集成开发工具包,是专门用于相 关应用开发和调试的综合性软件。目前常用的 版本是1.2,在功能和易用性上比早期的都有 提高,是一款功能强大又易于使用的开发工具。 包含有编译器、链接器、 、调试器、指令集模 拟器、开发包和应用库等部分,可以用来开发、 编译、调试采用包括C、和汇编语言编写的程 序。
命令行开发工具的使用。 是 映像文件转换工具。 是库函数生成器。 用于把二进制映像文件下载到嵌入式设
备上的 存储器中。
汇编伪指令

第9章 ARM汇编语言程序设计基础

第9章 ARM汇编语言程序设计基础

11


(4) CODE16、CODE32 语法格式: CODE16 (或 CODE32 ) (5) ENTRY 语法格式: ENTRY
12
(6) END 语法格式: END (7) EXPORT(或GLOBAL) 语法格式: EXPORT 标号 (8) IMPORT 语法格式: IMPORT 标号 (9) GET(或INCLUDE) 语法格式: GET 文件名
13
复习要点
1.什么是冯·诺依曼(Von Neumann)结构和哈佛(Harvard)结构 冯·诺依曼结构的计算机由CPU和存储器构成,其程序和数据共用一个存储空间 ,程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置;采用单一的 地址及数据总线。 CPU通过程序计数器提供的地址信息,对存储器进行寻址,找到所需要的指令或 数据,然后对指令进行译码,最后执行指令规定的操作。即使单条指令也要耗费几个 甚至十几个机器周期,在高速运算时,在传输通道上会出现瓶颈效应。 哈佛结构的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器 和数据存储器是两个相互独立的存储器,每个存储器独立编址、独立访问。系统中具 有程序的数据总线与地址总线,数据的数据总线与地址总线。这种分离的程序总线和 数据总线可允许在一个机器周期内同时获取指令字(来自程序存储器)和操作数(来 自数据存储器),从而提高执行速度,提高数据的吞吐率。 2.小端字节顺序存储法和大端字节顺序存储法 小端字节顺序存储法:低字节数据存放在内存低地址处,高字节数据存放在内 存高地址处。 大端字节顺序存储法:高字节数据存放在低地址处,低字节数据存放在高地址 处。 3.写出程序寄存器中位的含义 4.汇编语言编程及写出程序运行后寄存器的值 5.A/D、中断、DMA、I/O端口、串口寄存器的配置 6.NOR FLASH、NAND FLASH、SDRAM与ARM的连接 7. NAND FLASH的读、写和擦除的控制时序及容量的计算 8. SDRAM容量的计算

ARM汇编语言程序设计基础课件

ARM汇编语言程序设计基础课件

在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
4.1.1 一个简单的ARM汇编程序例子
3
在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
4.2.1 顺序程序
顺序程序是一种最简单的程序结构,它按照语句编写的顺序从上往下执 行,直到最后退出程序。
❖ 例4-2:计算100-50,结果存放到R1寄存器中。
开始
初始化以下内容 R1 = 100 R2 = 50
R1 = R1 + R2
结束
在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
❖ 字符串只能用DCB定义。
num_b
0x48(‘ H’ ) 0x65(‘ e’ ) 0x6C(‘ l’ ) 0x6C(‘ l’ ) 0x6F(‘ o’ ) 0x20(‘ ’ ) 0x57(‘ W’ ) 0x6F(‘ o’ ) 0x72(‘ r’ ) 0x6C(‘ l’ ) 0x64(‘ d’ ) 0x21(‘ !’ )
在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
目录
❖4.1 ARM汇编语言的程序结构 ❖4.2 ARM汇编语言程序设计 ❖4.3 C与汇编混合编程 ❖ 本章小结
1
在整堂课的教学中,刘教师总是让学 生带着 问题来 学习, 而问题 的设置 具有一 定的梯 度,由 浅入深 ,所提 出的问 题也很 明确
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多任务(可以在单CPU上管理几个工作或任务); 实时控制 (可以控制任务在既定时间内完成); 任务间通信 (可以实现系统中的任务间通信); Internet 连接(通过以太网或串口(Modem)); 嵌入式Web 服务器(包括CGI 脚本); E-mail 公告(通过SMTP)。
9.1.4 μVision IDE调试器
μVision IDE调试器用于调试和测试应用程序,它提供了模拟调试
模式和目标硬件调试模式两种操作模式,可以在Options for Target→Debug对话框内进行选择。 1.模拟调试模式

μVision IDE模拟器的功能强大,能模拟整个MCU的行为,如高效指 令集仿真,中断仿真,片内外围设备仿真,ADC,DAC,EBI, Timers,UART,CAN,I2C,I/O和外部信号仿真等。模拟调试模式 可以在无目标系统硬件情况下,将μVision IDE调试器配置为软件模 拟形式,用来调试和测试所开发的软件。

ARM宏汇编器(armasm)可以完成标准的宏处理。条件汇编可从同一 源文件得到不同的目标文件。符号引用列表文件包含可选的符号交叉引 用信息,以提供源文件的详细信息。 ARM链接器(armlink)产生的详细列表文件非常易于用户理解。它包 含内存配置、输入模块、内存映像、符号表和交叉引用信息。全局代码 列表文件包含由链接器产生的符号反汇编信息。静态堆栈分析帮助链接 器在链接时处理堆栈请求。 ARM库管理器(armar)对库文件进行模块管理,为链接器组合、引用 多个模块提供方便。μVision IDE也可生成库文件。变量和函数引用。可 从库中抽取所需的模块,模块中的代码段如果未在应用中被使用,则它 们不会被包含在最终的输出中。库为分布在初始源代码中的大量函数和 程序段提供了一种载体。
输入希望新建工程的名字(如Test1)即可创建一个新的工程。
图9.1.3 “Create New Project”对话框

输入工程名后Test1,单击保存,即可弹出“Select Device for Target(器件选择)”对话框如图9.1.4所示,在图9.1.4所示对话 框中选择所需处理器,如S3C2410A。
9.1 MDK-ARM开发工具

MDK-ARM出众的价格优势和功能优势,已经成为ARM软件开发工具的 标准,被全球超过10万的嵌入式开发工程师验证和使用,目前,MDKARM在国内ARM开发工具市场已经达到90%的占有率。
MDK主要包含μVision IDE、RVCT、RTL实时库(RealView Real-Time Library)和ULINK USB - JTAG仿真器4个核心组成部分。下面分别对这 4个部分进行简要介绍。
9.1.1 µVision4 IDE

用于设置开发工具配置的对话框; 真正集成高速CPU及片上外设模拟器的源码级调试器;
高级GDI接口,可用于目标硬件的软件调试和ULINK2仿真器的连接;
用于下载应用程序到Flash ROM中的Flash编程器; 完善的开发工具手册、设备数据手册和用户向导。
由S3C2410硬 件选项配置可 知,该器件内 部Flash(ROM) 起始地址为0X0, Flash大小为 0X200000 Byte。 RAM起始地址 为0X30000000, 其大小为 0X4000000 Byte。 图9.1.5 S3C2410的硬件选项配置

3. 创建源文件及文件组 创建一个工程后,可以在该工程下添加用户文件和该器件编译、 运行所必须的源文件。通常,设计人员应采用文件组来组织工程 下的各个文件,将工程中同一模块或者同一类型的源文件放在同 一文件组中。例如,用户可以通过单击工具栏图标或者在Project Window→Files菜单项中选择文件组,在右击弹出的快捷菜单中选 择Add Files to Group...打开一个标准对话框,将已经准备好的文 件添加到工程文件组中。例如在S3C2410工程中添加文件及文件 组如图9.1.6所示。





工程中添加文件组有: Startup、Source、 Common、InFile、 ReadMe。 在Startup文件夹下添 加S3C2410的启动代码 S3C2410A.s 在Source文件夹下添 加工程main.c文件及用 户文件(.c或.h) 在Common文件夹下 添加S3C2410系统库函 数2410lib.c以及系统初 始化文件sys_init.c 在Inifile文件夹下添加 SDRAM.ini文件,该文 件将引导用户将代码下 载至SDRAM中运行,而 不是将程序直接下载至 Flash中。如果用户需要 将程序代码下载至Flash 中运行,则需要添加 Flash.ini文件才行。

JTAG时钟速度达到50MHz。支持运行Cortex-Mx设备的工作频率达到 200MHz。高速Flash下载器,速度达到600KB/s。
USB供电(无须电源)。 ULINKPro提供大量的分析功能,可以通过逻辑 分析仪进行数据分析跟踪,代码覆盖率的统计分析,性能分析器帮助分 析和优化代码。 MDK除了可以使用ULINK和ULINKPro之外,还可以使用很多第三方的硬 件仿真器进行目标硬件调试,例如:CoLinkEx、Signum Systems JTAGJet、JLink、ST-Link、Altera Blaster Cortex Debugger、Stellaris ICDI等。
9.1.2 RealView编译工具集

RealView编译工具集(RVCT)是ARM公司提供的编译工具链,包含 编译器(armcc)、汇编器(armasm)、链接器(armLink)和相关工 具(如库管理器armar、十六制文件产生器FromELF)。RVCT在业界被 认为是面向ARM技术的编译器中能够提供最佳性能的编译工具。RVCT 的开发致力于高性能和高代码密度,以降低产品成本。RealView编译器 与ADS 1.2比较,代码密度比ADS 1.2编译的代码尺寸小10%,代码性 能比ADS 1.2编译的代码性能高20%。RVCT编译器能生成优化的32位 ARM指令集,16位的Thumb指令集以及最新的Thumb-2指令集代码, 完全支持ISO标准C和C++。
图9.1.4 在“Select Device for Target”对话框中选择所需处理器


2. 目标硬件选项配置 MDK下可根据目标硬件的实际情况对工程进行配置。通过单击 目标工具栏图标或者单击菜单项Project→Options for Target,在 弹出的Target页面可指定目标硬件和所选择处理器片内组件的相 关参数。例如,S3C2410的硬件选项配置如图9.1.5所示。


9.1.3 RealView实时库
RealView实时库(RTL,Real-Time Library)是为解决基于ARM MCU的嵌入式系 统中实时及通信问题而设计的紧密耦合库集合,可以非常方便地应用于所有 ARM7、ARM9和Cortex-M3系列的处理器。RealView实时库可以解决嵌入式开 发中的常见的一些问题,例如:
2.目标硬件调试模式

在目标硬件调试模式下,使用硬件仿真调试器(如ULINK2、 ULINKPro等)与目标硬件连接,调试和测试所开发的软件。 ULINK2是ARM公司推出的与MDK-ARM配套使用的仿真器,是ULink 仿真器的升级版本。ULINK2支持标准Windows USB驱动(即插即 用),支持基于 ARM Cortex-M3的串行调试,支持程序运行期间的 存储器读写、终端仿真和串行调试输出,支持10-pin 连接线 (也支持 20-pin 连接线)。ULINK2主要功能包括有:USB通讯接口高速下载用 户代码,存储区域/寄存器查看,快速单步程序运行,多种程序断点, 片内Flash编程等。ULINK2外形如图9.1.1所示。
MDK的RealView编译工具集用于将C/ C+ + 源文件转换为可重定位的目 标模块,并生成μVision IDE调试器可用的调试信息。


ARM C/ C+ + 编译器(armcc)支持同一源文件中的ARM和Thumb混 合模式。采用代码尺寸优化技术,可产生最小尺寸的编译代码。采用性 能优化技术,在不增加时钟频率的情况下最大化处理器的性能。具有 “硬件支持”函数属性,为访问ARM硬件提供方便。支持内嵌汇编,可 用于快速DSP或其他信号处理算法。其函数内联特性,可加快被频繁调 用函数的执行速度。可自动通过CPU寄存器传递参数,甚至一些小的C结 构也可通过CPU寄存器传递和返回,加快了执行速度。程序段多数可重 入,既可从主程序中调用,也可在中断中调用。依从单精度、双精度数 的标准IEEE 754标准,可以用于高精度的浮点计算。


9.1.5 创建工程
1. 选择处理器 MDK安装完成之后可以直接从开始→程序→keil μVision4或者点击
桌面快捷方式图标打开软件如图9.1.2所示。
图9.1.2 打开的μVision4 IDE界面

单击Project-New Project...菜单项,μVision IDE将打开一个 “Create New Project”(创建一个新工程)对话框如图9.1.3所示,

9.1.1 µVision4 IDE
μ Vision IDE是一个集项目管理器、源代码编辑器、调试器等于一体的
集成开发环境,是一个基于Windows操作系统的嵌入式软件开发平台, µVision4 IDE主要特性如下:

功能强大的源代码编辑器;
可根据开发工具配置的设备数据库; 用于创建和维护工程的工程管理器; 集汇编、编译和链接过程于一体的编译工具;
第9章 ARM汇编语言程序设计基础
说明:由于本课程内容较多,各学校开课的课时不同,讲授的内 容也有不同,本课件本着尽可能的多的提供素材,以满足各位老 师不同的需要。 希望各位老师根据自己的讲授需要,对课件进行剪裁编排,以适 合自己的课程要求。
相关文档
最新文档