第4章 ARM汇编语言特性与编程基础_第1页
第4章 ARM汇编语言特性与编程基础_第2页
第4章 ARM汇编语言特性与编程基础_第3页
第4章 ARM汇编语言特性与编程基础_第4页
第4章 ARM汇编语言特性与编程基础_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章ARM北.编语舌特性

与编程基础

'■本章重点:

■JI----------------------------

■⑴ARM汇编器提供的汇编语言特性,包括行格

式、预定义名和内建变量、伪指令、符号、指

示符、表达式和操作符等,以及它们的使用;

■⑵ARM汇编语言编程基础,包括调用子程序、

条件执行、装入常数和地址到寄存器、装入和

存储多个寄存器、多路分支等内容,以及对应

的程序代码。

2

补充知识:

ADSIDE(集成开发环境)

■1ADS工具包的组成

-2ADS开发工具集

■3ARM映像文件

3

补充知识:

ADSIDE(集成开发环境)

■ARM应用软件的开发工具根据功能的不同,可

以分为编辑软件、编译软件、汇编软件、链接

软件、调试软件、嵌入式实时操作系统、函数

库、评估板,JTAG仿真器以及在线仿真器等。

■选择合适的开发工具可以加快开发进度,节省

开发成本。

4

1ADS工具包的组成

■ADS是ARM公司推出的集成开发工具包,是专

门用于ARM相关应用开发和调试的综合性软件。

目前常用的版本是L2,在功能和易用性上比

早期的SDT都有提高,是一款功能强大又易于

使用的开发工具。

■ARMADS包含有CodeWarriorIDE、编译器、

链接器、调试器、指令集模拟器、ARM开发包

和应用库等部分,可以用ADS来开发、编译、

调试采用包括C、C++和ARM汇编语言编写的

程序。

5

ADS工具包的组成(一)

■1.CodeWarriorIDE

■CodeWarriorIDE(集成开发环境)包括工

程管理器、代码生成接口、语法敏感编辑器、

源文件和类浏览器、源代码版本控制系统接口

以及文本搜索引擎等。ADS仅在其PC机版本中

集成了该IDE。

■CodeWarriorIDE为管理和开发项目提供了简

单多样化的图形用户界面,用户可以使用ADS

的CodeWarriorIDE为ARM和Thumb处理器开

发用C、C++或者ARM汇编语言编写的程序代

码。

6

ADS工具包的组成(二)

■2.编译器

■ADS提供多种编译器,以支持ARM和Thumb指

令的编译。

■3.链接器

■Armlink(ARM链接器)可以将编译得到的一个

或多个目标文件和相关的一个或多个库文件进

行链接,生成一个可执行文件,也可以将多个

目标文件部分链接成一个目标文件,以供进一

步的链接。

7

&ADS工具包的组成(三)

■4.调试器(Debuggers)

■(1)调试器类型

-调试器部分包括两个调试器:

-ARM扩展调试器AXD(ARMextendedDebugger)

■ARM符号调试器armsd(ARMsymbolicdebugger)

■AXD基于WindowsXX/NT风格,具有一般意义

上调试器的所有功能,包括简单和复杂断点设

置、栈显示、寄存器和存储区显示、命令行接

口等。

-Arr^sd作为一个命令行工具辅助调试或者用在

其他操作系统平台上。

8

ADS工具包的组成(四)

■AXD调试器本身是一个软件,用户通过这个软

件可以对包含有调试信息的、正在运行的可执

行代码进行变量的查看、断点的设置、单步执

行等调试操作。在ARM体系中,它有Multi-ICE、

ARMulator和Angel等几种方式。AXD可以在

Windows和UNIX下进行程序的调试,它为用C、

C++和汇编语言的源代码提供了一个全面的

Windows和UNIX环境。

9

ADS工具包的组成(五)

■(2)调试方式

■在ARM体系中,可以选择Multi-ICE(Multi­

processorin-circuitemulator)ARMugtor或

Angel多种调试方式。ARMulator

■指令集模拟器(InstructionSet

Simulators)

■用户使用指令集模拟器无需任何硬件即可在

PC机上完成一部分调试工作。

10

ADS工具包的组成(六)

■5.ARM开发包和函数库

■ARM开发包由一些底层的例程和库组成,可

以帮助用户快速开发基于ARM的应用程序和

操作系统。

■ADS的ARM应用库完善并增强了SDT中的函

数库,同时还包括一些非常有用的源码例程。

■具体包括系统启动代码、串行口驱动程序、

时钟例程、中断处理程序等,

11

2ADS开发工具集

■2.1ADS命令行开发工具

■2.2GU1开发工具

■2.3ADS实用工具

12

2.1ADS命令行开发工具

■(l)armcc

■armcc是ARMC编译器。在命令控制台环境下,输

入命令:C:>armcc-help可以查看armcc的语法

格式以及最常用的一些操作选项。

■(2)armcpp

-armcpp是ARMC++编译器。它将ISOC++或

EC++编译成32位ARM指令代码。

■(3)tcc

-tcc是ThumbC编译器。该编译器通过了Plum

HallCValidationSuite为ANSI一致性的涮试。tcc

将ANSIC源代码编译成16位的Thumb指令代码。

13

■(4)tcpp

■tcpp是ThumbC++编译器。它将ISOC++和

EC++源码编译成16位Thumb指令代码。

■(5)armasm

■armasm是ARM和Thumb的汇编器,它对用ARM

汇编语言和Thumb汇编语言写的源代码进行汇编。

■(6)armlink

■armlink是ARM连接器。

■(7)armsd

■armsd是ARM和Thumb的符号调试器。

14

(A)ARM编译器

ADS提供四种编译器,下表给出了这4种编译器

的总结

编译器名称编译器类型源代码编译输出

armccC编译器C32位ARM代码

tccC编译器C16位Thumb代码

armcppC++编译器C或C++32位ARM代码

tcppC++编译器C或C++16位Thumb代码

15

(B)ARM汇编器

■ADS包含一个独立的ARM汇编器armasm

和一个内置在C/C++编译器中的内联汇

编器(inlineassembler)。这两个汇编

器能够处理基本相同的汇编代码。

16

(C)ARM连接器

■ARM连接器armlink可以有如下功能:

■将一组目标文件或库连接产生一个可执

行的ELF映像文件;

■将一组目标文件部分连接产生一个新的

目标文件,用于以后的连接;

■指定代码和数据在内存中的位置;

■为连接产生的文件产生调试和引用信息

17

连接操作的输出结果

■目标文件由输入段(inputsection)组成,输

入段可以是R0(只读,Read-Only)段、RW

(读写,Read/Write)段、ZI(零初始化,

Zero-Initialized)段。

■armlink可以利用这些属性把输入段分组归并为

更大的生成块,分别是输出段(output

section)、域(region)和映像(image)。

■输出段大致相当于的段

ELF(segment)o

18

连接器的输入和输出

■连接器的输入是:

-一个或多个ELF目标格式的目标文件,或(可选

的)一个或多个由armar工具产生的库。

■缺省情况下,连接器的输出是非可重定位映像,

代码从内存地址0x30000000开始,数据段紧

随其后。可以通过连接器选项或一个配置文件

来指定代码段和数据段存放在什么内存地址。

19

连接正确的输出

①一个ELF可执行格式的可执行映像。

②一个ELF目标格式的部分连接的目标文

件。

通过fromELF工具,一个ELF的可执行

映像也可以转化为其他的文件格式。

20

2.2GUI开发工具

■ADS的GUI开发工具主要包括两个独立的

工具:CodeWarriorIDE(CodeWarrior

集成开发环境)和AXD(ARMexecutor

Debugger)。

21

⑴CodeWarrior集成开发环境

■CodeWarrior集成开发环境为管理和开发工程项

目提供了简单一致的图形用户界面,可以加速并

简化嵌入式开发过程中的每个环节,缩短用户项

目周期。可以在CodeWarrior中为ARM睨置前

面介绍的各种命令行工具,实现对项目代码的编

译、汇编和连接。

■CodeWarrior以工程项目的方式组织源代码文件、

库文件和其他文件,让用户将这些文件及配置设

置放在一个工程项目中。每个工程项目可以创建

和管理多个生成选项的配置。

22

CodeWarriorIDE主要提供以下功能:

1.按照工程项目(Project)的方式来组

织源代码文件、库文件和其他文件。

2.设置各种生成选项(Buildoptions),

以生成不同配置的映像文件。

3.一个源代码编辑器。

4.一个文件浏览器。

5.在文本文件中进行字符串搜索和替换。

6.文本文件比较功能。

7.用户自定义界面

23

CodeWarrior中常用的两个术语

■目标系统(Targetsystem)

■目标系统是指应用程序运行的环境,可以是基

于ARM的硬件系统,也可以是ARM仿真运行环

境。比如,当应用程序运行在ARM评估板上时,

目标系统就是该评估板。

■生成目标(Buildtarget)

■生成目标是指生成特定目标文件的选项设置

(包括汇编选项、编译选项、连接选项以及连

接后的处理选项等)和所用的所有文件的集合。

通常一个生成目标对应一个目标映像文件。

24

CodeWarric^工程项目通常包

括3个生成目标:

-Debug:该生成目标对应的映像文件包含所

有调试信息。在开发过程中使用。

■Release:该生成目标对应的映像文件不包含

调试信息。用于生成实际发行的软件版本。

■DebugRel:该生成目标对应的映像文件包含

基本的调试信息。

25

7种可选的ADS工程项目模板

①ARMExecutablImage:ARM可执行映像文件模

板。用于由ARM指令的代码生成一个ELF格式的可

执行映像文件;

②ARMObjectLibrary:ARM目标文件库模板。用于由

ARM指令的代码生成一个armar格式的目标文件库;

③EmptyProject:空工程模板。用于创建一个不包含

任何库或源文件的工程;

④MakefileImporterWizard:Makefile导入向导模板。

用于将VisualC的nmake或GNUmake文件转入到

CodeWarriorIDE工程文件;

26

7种可选的ADS工程项目模板(续)

⑤ThumbARMExecutableImage:ARM/Thumb7昆

合使用的映像文件模板。用于由ARM指令和

Thumb指令的混和代码生成一个可执行的ELF

格式的映像文件;

⑥ThumbExecutableimage:Thumb可执行映像

文件模板。用于由Thumb指令创建一个可执行

的ELF格式的映像文件;

⑦ThumbObjectLibrary:Thumb目标文件库模板。

用于由Thumb指令的代码生成一个armar格疝

的目标文件库。

27

L7个ADS工程模板的截图

Nev

ProjectFile|Object|

ExecutableImageProjectname:

I-------------------------------------

哈ARMObjectLibrary

能EmptyProject

Location:

的MakefileImporterWizard

哈ThumbABMInterworkingImage|C:\DocumentsandSettings'Set;..]

的ThumbExecutableImage

-T*AddProje-------------------

的ThumbObjectLibrary

Project'

28

(2)AXD

■AXD(ARM扩展调试器,ARMextended

Debugger)是ADS的图形化调试工具。AXD是

一个功能强大的调试工具,提供了多种辅助调试

手段用来对用户程序进行调试,包括断点、观测

点和观测项等。

■其他两个调试器:armsd(ARM符号调试器,

ARMSymbolicDebugger)和ADW/ADU

(ApplicationDebuggerWindows/UNIX)也是

ADS的调试工具。前者在命令行工具里已简单介

绍,后者是ADS老版本的图形化调试工具。

29

调试目标和调试代理

■英文术语分另U是debugtarget和debugagent

■调试目标:被调试程序运行所在的目标设备或

仿真软件。

■调试代理:运行在调试目标上,接受并执行主

机上调试器发来的命令,例如,在目标程序中

设置断点、单步执行、读内存、写内存等。

30

ARM体系中的三种调试代理

■在ARM体系中主要有以下三种调试代理:

.ARMulator,打开AXD软件时默认打开的H

标是ARMidator。

■基于JTAG的调试代理Multi-ICE

■Angel调试监控程序

31

调试代理与调试器的关系

■调试代理与调试器的关系是前者执行后者请求

的操作。调试代理既不是被调试的程序,也不

是调试器本身。用户可以通过AXD使用调试代

理,对运行在调试目标上的包含调试信息的程

序进行变量查看、断点控制等操作。

32

23ADS实用工具

■ARM映像文件转换工具一fromelf

■ARM函数库管理工具一armar

33

(1)fromelf

■这是ARM映像文件转换工具。该命令将ELF

格式的文件作为输入文件,将该格式转换为各

种输出格式的文件,包括plainbinary(BIN格

式映像文件),Motorola32-bitS-record

format(Motorola公司32位S格式映像文件),

IntelHex32format(Intel公司32位格式映

像文件),和Verilog-likehexformat(Verilog

类型16进制文件)。fromelf命令也能够为输

入映像文件产生文本信息,例如代码和数据长

度。

34

(2)armar

■armar是ARM库管理工具。armar将一系列ELF格式

的目标文件集合在一起,组成一个库。这样的库可以

传递给连接器armlink以代替多个目标文件。不过,连

接一个库文件并不意味着库中的所有目标文件都被连

接。armlink连接目标文件和连接库有如下不同:

■作为输入的每个目标文件都无条件地被连接在输出文

件中,尽管如果armlink带-remove选项,耒用到的区

段会被剪裁掉。

-库文件中的成员仅当它被一个目标文件或其他已被包

含的库文件引用时才被包含在输出文件中。

35

3ARM映像文件

-什么是映像文件

■映像文件(image)是一个计算机上

的可执行文件,在执行之前被加载到

计算机的存储器中。通常,一个映像

文件中包含多个线程。

36

ELF目标文件

■ARM集成开发环境中的各种源文件(包

括汇编程序、C程序以及C++程序)经过

ARM编译器编译之后,生成ELF格式的目

标文件。

■ELF目标文件的文件名后缀是.0。

37

ARM映像文件.axf

■目标文件,o和相应的C/C++运行时库.a经

过ARM连接器连接后,生成.axf映像文

件。,axf映像文件也是ELF格式的,只是

包含特定格式的调试信息,可在开发板

上调试运行。

38

不含调试信息的映像文件

■映像文件调试结束之后,可以使用

fromelf工具将映像文件中的调试信息和

注释过滤掉,生成二进制的可加载映像

文件(通常带后缀,bin,也可以无后缀)。

可加载映像文件可写入嵌入式设备的

ROM中,在加电启动过程执行。

39

ARM映像文件的组成

■ARM处理器的映像文件是.axf文件或

者.bin文件。

■,axf文件和.bin文件的区别之处在于前者

包含有调试信息和注释信息,后者没有。

编译器输出的ARM映像文件以,axf文件为

主。通过fromelf工具,可以把AXF文件

转换成.bin文件。实际下载到系统板的映

像文件多数是・bin格式文件。

40

映像文件的加载视图和执行视图

■映像文件域在加载时被映射存放到系统存储区。

在执行映像时,往往需要移动一些域到执行地

址并且产生ZI输出段。例如,初始化的RW数

据也许要被迫从ROM区的加载地址拷贝到RAM

区的执行地址。

■加载视图:根据映像文件装载到存储器时的地

址描述每一个域和段,该视图是映像文件开始

执行前它的域和段的位置视图。

■执行视图:该视图根据映像文件在执行时每一

个域和段的地址描述映像的各个组成部分。

41

&加载视图与执行视图的比较

Image$$RW$$limit

Image$$ZI$$limit

Image$$ZI$$base

Image$$RW$$base

Image$$RO$$limit

Image$$RO$$base

42

图中带有$$"符号的含义

-JI-----------

■说明如下:

Image$$RO$$baseRO输出段运行时起始地址

Image$$RO$$limitR0输出段运行时存储区界限

Image$$RW$$baseRW输出段运行时起始地址

Image$$RW$$limitRW输出段运行时存储区界限

Image$$ZI$$baseZI输出段运行时起始地址

Image$$ZI$$limitZI输出段运行时存储区界限

43

三个段空间计算公式

R0段大小二

Image$$RO$$limit-Image$$RO$$base

RW段大小二

Image$$RW$$limitTmage$$RW$$base

ZI段大小二

Image$$ZI$$limit-Image$$ZI$$base

44

段大小计算小结,段大小的设置

■加载时,R0段+RW段=整个程序大小。

■运行时,R0段+RW段2整个程序大小

■注意:ZI段被包含在RW段中间。

■这些符号具体取值可以在ADS或者SDT中设置。

■-ro-base选项对应设置Image$$RO$$base,

■-rw-base选项对应设置Image$$RW$$base。

45

使用配置文件定义映像文件的地

址映像

-在生成映像文件时,ARM连接器需要

知道下列信息:

■分组信息决定如何将各个输入段组

织成相应的输出段和域。

■定位信息决定各个域在存储空间中

的起始地址。

46

ADS编译成功后输出的映像文件内

I部成分统计表举例

Imagecomponentsizes

CodeRODataRWDataZIDataDebug

32169601014020796ObjectTotals

8814416032235383174019552LibraryTotals

CodeRODataRWDataZIDataDebug

9136016992235384188040348GrandTotals

TotalROSize(Code+ROData)93059(90.88kB)

TotalRWSize(RWData+ZIData)3844115(3754.02kB)

TotalROMSize(Code+ROData+RW95294(93.06kB)

Data)

TranslationtoPlainbinaryformatsuccessful.

映像文件统计报告

■在ADS集成开发环境下,对工程文件进行编译

之后,会输出一个映像文件的统计报告。该报

告中会分别给出目标文件(.0)文件和库(.a)

文件中5种组成成分的占空间大小。这5种组成

成分是:代码、R0数据、RW数据、ZI数据和

Debug数据,如图6-7所示。此外,还会分别给

出总R0空间(代码+R0数据)、总RW空间

(RW数据+ZI数据)和总ROM空间(代码+R0

数据+RW数据)的大小。

48

4.1ARM汇编语言特性

■4.1.1行格式、预定义名和内建变量

■L行格式

■在ARM汇编语言模块中,源代码行的一般格

式是:

■{symbol}{instruction|directive|pseudoJnstruction}

{;comment}

■也就是:

-{符号}{指令|指示符|伪指令}{;注释}

49

*

■上述行格式中用大括号括起来的三部分是

可选的。如果一行中没有symbol,指令|指

示符I伪指令不能从第1列位置开始,指令|

指示符I伪指令前面必须放置空格或Tab(

制表符)字符。

50

□l__每一_条_指令的-助记符可以使用全部大写或全部小写字符

,但不能在同一条指令的助记符中大、小写混用。

■指示符必须大写。

■指令中每一个寄存器名能够全部大写或全部小写,但不

能大、小写混用。

■行格式中symbol通常是标号dabel),在指令或伪指

令前它总是标号,在某些指示符前它是表示变量或常量

的符号(symbol)。

■行格式中symbol必须从第一列开始,不能含任何如空格

或Tab的字符,详见本节符号命名规则部分。

51

2.预定义寄存器和协处理器名

!ARM汇编器对ARM的寄存器进行了预定义,所有

的寄存器和协处理器名都是大小写敏感的。

-⑴预定义寄存器名

-⑵预定义程序状态寄存器名

-⑶预定义浮点寄存器名

-(4)预定义协处理器名和协处理器寄存器名

52

预定义变量1

・预定义的寄存器如下I

■,R0~R15和r0~rl5;

■,al~a4(参数、结果或临时寄存器,与

r0~r3同义);

■,vl~v8(变量寄存器,与r4~rll同义);

■,sb和SB(静态基址寄存器,与r9同义);

■,sl和SL(堆栈限制寄存器,与rlO同义);

■,fp和FP(帧指针,与同义);

■,ip和IP(过程调用中间临时寄存器,与「12同

义);

预定义变量2

,sp和SP(堆栈指针,与门3同义);

,|r和LR(链接寄存器,与「14同义);

・pc和PC(程序计数器,与「15同义);

,cpsr和CPSR(程序状态寄存器);

,spsr和SPSR(程序状态寄存器);

・f0~f7和F0~F7(FPA寄存器);

・s0~s31和S0~S31(VFP单精度寄存器);

・d0~dl5和D0~D15(VFP双精度寄存器);

■p0-pl5(协处理器0~15);

-C0-C15(协处理器寄存器0~15)。

3.内建变量

■内建变量(builtinvariables)见表律1,

它们是由ARM汇编器定义过的。内建变

量不能用SETA、SETL或SETS指示符设置

,它们能被用在表达式或条件中,如:

■IF{ENDIAN}="big»

■IF{ARCHITECTURE}=、'4T〃

内置变量2

赤曷______________含义

{PC}或.当前指令的地址

何庆可或@存储区位置计数器的当前值

{TRUE}逻辑常量真

{FALSE}逻辑常量假

{OPT}当前设置列表选项值,OPT用来保存当前列表选项,改变选项值,恢复它的原始值

{CONFIG}如果汇编器汇编ARM代码,则值为32;如果汇编器汇编Thumb代码,则值为16

{ENDIAN}如果汇编器在大端模式下,则值为big;如果汇编器在小端模式下,则值为little

内置变量3

到!味J把哪帏井生渊AK1Vl代“时》则恒•为JZ;如果/L通砧制1nun1D1Lg,则值为lb,卜回乂

{CPU}选定的CPU名,缺省时为ARM7TDMI

{FPU}选定的FPU名,缺省时为SoftVFP

{ARCHITECTURE}选定的ARM体系结构的值;3,3M,4,4T和4TxM

{PCSTOREOFFSET}STRpc,或STMRb,[...PC]指令的地址和PC存储值之间的偏移量

{ARMASM_VERSION}ARM汇编器的版本号,为整数

或|ads$version|

4.1.2ARM伪指令与Thumb伪指令

■ARM汇编器支持ARM伪指令和Thumb伪指令,在

汇编时把它们翻译成适当的ARM或Thumb指令组

合。

■全部ARM和Thumb伪指令见表4-2。Thumb伪指

令在表中用(Thumb)标出。

■虽然表4-2中Thumb伪指令ADR、LDR和NOP与

ARM伪才旨令ADR、LDR和NOP格式完全相同,但

相同的伪指令出现在程序中Thumb代码区,汇编

器识别为Thumb伪指令;出现在ARM代码区汇编

器识别为ARM伪指令。

58

LADRARM伪指令

■ADR伪指令装入一个相对程序或相对寄

存器的地址到一个寄存器。

■⑴格式

■ADR{condition}register,expression

59

■⑵使用

■使用中,ADR总是被汇编成一条指令。汇编器试图产

生一条ADD或SUB指令,装入地址。如果不能用一条

指令构造出地址,则产生错误信息,汇编失败。

■如果expression是相对程序的,计算产生的地址必须

与ADR伪指令在同一个代码区域。

■⑶使用举例

■TestiMOVrl,#0

■ADRr2,Testi

;产生指令SUBr2,pc,#0xC

60

2.ADRLARM伪指令

■ADRL伪指令装入一个相对程序或相对寄

存器的地址到一个寄存器。与ADR伪指

令功能相似,但ADRL比ADR能装入更大

的地址范围,原因是ADRL产生两条数据

处理指令。

■⑴格式

ADRL{condition}register,expression

61

■(2)使用

■使用中,ADRL总是被汇编成2条指令。如果汇编器不

能以2条指令构造出地址,则产生错误信息,汇编失败

O

■如果expression是相对程序的,它必须计算产生一个与

ADRL伪指令在同一个代码区域的地址,否则在随后的

连接时,地址可能出了范围。

■⑶使用举例

■startMOVr0,#10

■ADRLr4,start+60000

■;产生指令ADDr4,pc,#0xe800

■;ADDr4,r4,#0x254

62

3.LDRARM伪指令

■LDR伪指令装入二个32位常数值或一个地址到

一个寄存器。

■⑴格式

■LDR{condition}register,=[expression|label-expression]

■⑵使用

■使用LDR伪指令有两个主要目的,一是当一个立即数

的值由于超了范围,不能用MOV和MVN指令装入到一

个寄存器时,用LDR伪指令产生一个文字池常数;二

是装入一个相对程序或外部的地址到一个寄存器。

■⑶使用举例

LDRrO,=Oxlff;装入Oxlff到rO

LDRrl,=label;装入山bel地址到门63

4.NOPARM伪指令

■对NOP伪指令,汇编器产生什么也不操作的

ARM指令:MOVrO,rOo

■⑴格式

■NOP

64

■5.ADRThumb伪指令

■ADR伪指令装入一个相对程序或相对寄存器的

地址到一个寄存器。

■⑴格式

■ADRregister,expression

■⑵使用

■使用中,在Thumb状态,ADR只能产生字对齐

的地址。要使用ALIGN指示符去确认expression

是字对齐的。

-若表达式是相对程序的,必须计算产生一个与

ADR伪指令在同一个代码区域的地址。65

■⑶使用举例

■ADRr3,testexml

■;产生指令ADDr3,pc,#nn

■;code

■ALIGN

■testexm1DCW1,2,3,4

66

■6.LDRThumb伪指令

■LDR伪指令装入一个32位常数值或一个地址到一个低寄

存器中。

■⑴格式

■LDRregister,=[expression|label-expression]

■(2)使用

■使用LDR伪指令有两个主要目的,一是当一个立即数的

值由于超出MOV指令的范围,不能装入一个寄存器时,

产生文字池常数;二是装入一个相对程序或外部的地址

到一个寄存器。

■⑶使用举例

■LDRrO,=OxOffe;装入OxOffe到rO

■LDRrl,=labeladdr;装入labegddr地址到rl

67

■7.MOVThumb伪指令

■MOV伪指令传送一个低寄存器的值到另一个低

寄存器(r0-r7)o而MOV指令不能传送一个低

寄存器的值到另一个低寄存器。

■(1)格式

■MOVRd,Rs

■⑵使用

■在使用中,汇编器将MOV伪指令变成带立即数

的ADD指令,指令中立即数的值为0。

■⑶使用举例

■MOVRd,Rs;产生指令ADDRd,Rs,#0

68

■8.NOPThumb伪指令

■对NOP伪指令,汇编器产生什么也不操

作的Thumb指令:MOVr8/8。

■⑴格式

■NOP

69

4.1.3符号(symbols)

与指示符(directives)

■使用符号能够代表变熹"地址和数值常数。符

号代表地址时,也称为标号。

■1.符号命名规则

■符号命名遵守以下规则:

-⑴在符号名中可以使用大写字母、小写字母、数字

字符或下划线字符。

-⑵除了局部标号外,不允许在符号名的第一个字符

位置使用数字字符。

-⑶符号名中对大、小写字母是敏感的。

-⑷在符号名中所有的字符是有意义的。

70

-⑸在它们的作用范围内,符号名必须是唯一的。

■⑹符号名必须不使用内建变量名、预定义寄存器名和

预定义协处理器名。

■⑺符号名应该不使用与指令助记符或指示符相同的名

字。

■⑻如果需要在符号名中使用更大范围的字符,使用如

下举例的格式为符号名划界线:

■|C$$code|

■其中两边的两条竖线不是符号的一部分,只用于为符

号名划界线,它们之间不允许使用竖线、分号和换行符

71

■2.变量(variables)

-变量有三种类型:

①•数值

②•逻辑

③・串

■变量的类型不能被改变,变量的值可以

被改变。

72

■3.汇编时串变量的替换

■可以使用串变量作为汇编语言的一整行或一行

的一部分。如果在某一位置使用的串变量带有

巧’作为前缀,则汇编器用串变量的值替换串变

量。巧,字符通知汇编器,在检查一行的语法前

替换源代码行的串。

■使用,'标记变量名结束,如果变量名后有跟随

的字符,替换后跟随在串变量的值后,

■4.标号(labels)

■⑴相对程序的标号

■⑵相对寄存器的标号

■⑶绝对地址

73

■5.局部标号(locallabels)

■局部标号使用0~99范围内的一个数,可以有选

择地在其后跟随一个表示当前范围的名字。

■局部标号用在指令中,指出分支的目标处。

■局部标号格式为:

■n{routname)

74

■6.常量

■常量由数值常量、串常量、布尔常量和字符常量组成。

■⑴数值常量

-数值常量在汇编语言中采用以下三种形式:

■•十进制数,例如234;

■•十六进制数,例如0x7b或0x7B;

■,n进制数,格式为n_xxx,n是2~9之间的一个基数,

xxx是这个基数下的残值,例如8_375,表示基数为8(

八进制数),数值为375。

-⑵串常量

■⑶布尔常量

■⑷字符常量

75

■使用举例:

■anumSETA3500;假定anum在以前声明过

■addrDCDOxOOff;十六进制数

■DCDOxOOFF;十六进制数

■DCD2_11000011;二进制数

■bnumSETA8_74007

■;假定bnum在以前声明过,八进制数

■LDRn,=6A5;字符

76

■7.指示符(directives)

-汇编器提供指示符用来支持:

-⑴定义数据结构和为数据分配空间;

-⑵文件分隔成逻辑上的一个或多个区域;

-⑶错误报告和汇编列表控制;

■⑷符号定义;

■⑸条件汇编和重复汇编,以及在一个文件中包含辅助

文件。

77

指示符1--符号定义指示符(1)

指示符■功能

声明和初始化一个全局算术变量,初始值为0

GBLL声明和初始化一个全局逻辑变量,初始值为{FALSE}

GBLS声明和初始化一个全局字符串变量,初始值为空

।r1△声明和初始化一个局部算术变量,初始值为0。局部算术变

量只能在宏中进行声明。

IC.声明和初始化一个局部逻辑变量,初始值为《FALSE>。局

部逻辑变量只能在宏中进行声明。

,riq声明和初始化一个局部字符串变量,初始值为空。局部字

符串变量只能在宏中进行声明。

SETA给一个局部或全局算术变量置值

SETL给一个局部或全局逻辑变量置值_

SETS给一个局部或全局字符串变量置值

78

4指示符1-一符号定义指示符(2)

RLIST给寄存器集命名

CN给一个协处理器寄存器命名

CP给一个特定协处理器命名,协处理器号为0~15

DN给一个双精度VFP寄存器命名

SN给一个单精度VFP寄存器命名

FN给一个特定的浮点寄存器命名

79

指示符2-一数据定义指示符⑴

LTORG指示汇编器汇编当前文字池

…或MAP置存储映射的起点到一个特定的地址

#或FIELD描述指示符所定义的存储映射中的空间

%或SPACE定义一块值为0的存储器区域

二或DBC分配一个或多个字节

&或DCD分配一个或多个字,从4字节边界开始

DCDU分配一个或多个字,但不一定从4字节边界开始

DCDO分配以字边界开始的存储区域,并指定初始值为到

静态基址寄存器的偏移

80

指示符2--数据定义指示符⑵

DCFD分配给双精度浮点数一段以字边界开始的内存区域

DCFDU分配给双精度浮点数一段以任意边界开始的内存区域

DCFS分配给单精度浮点数一段以字边界开始的内存区域

DCFSU分配给单精度浮点数一段以任意边界开始的内存区域

DCI分配以字边界开始的存储区域,并指定初始值。标记此地

址存储的是代码而不是数据

DCQ分配给双精度浮点数一段以4字节边界开始的内存区域

DCQU分配给双精度浮点数一段以任意边界开始的内存区域

DCW分配给一个或多个半字以半字边界开始的内存区域

DCWU分配给一个或多个半字以任意边界开始的内存区域

DATA标识一个标号是代码段中数据的标号,该符号后是DCB或

DCD

81

I指示符3-一报告指示符

ASSERT对于声明错误,在第二次汇编时

产生错误信息

!或INFO在汇编时显示信息

OPT可在源代码中设置列表选项

TTL在一个列表文件每页的开始插入

一个标题,每一页的标题在下一

个TTL之前都有效

SUBT在一个列表文件的页中设置一个

子标题,每一页的子标题在下一

个SUBT之前都有效

82

4指示符4-一汇编控制指示符⑴

[或IF这三个符号连用,进行条件汇编

]或ENDIF

MACRO这二个符号连用,定义一个宏定

MEND

83

■指示符4--汇编控制指示符⑵

用来在结束前退出宏定义

WHILE这二个符号连用,进行重复汇编

WEND

84

指不符5一杂项指小符(1)

ALIGN从一个字边界开始

AREA指示汇编器汇编一段新的代码或

数据部分

CODE16指示汇编器将随后的指令作为16

位Thumb指令

CODE32指示汇编器将随后的指令作为32

位ARM指令

END表示源程序的结束

85

&指示符5--杂项指示符⑵

ENTRY指向程序的入口,一个源文件中

只能有一个ENTRY

*或EQU对一个常量赋予一个符号名

说明了由链接器在目标和库文件

EXPORT或GLOBAL中使用的符号

提供汇编器在当前汇编中未曾定

IMPORT或EXTERN义的符号名

包含一个文件,在GET处汇编包含

GET或INCLUDE的文件

86

指不符5一杂项指不符(3)

INCBIN包含一个未被汇编过的文件

KEEP指示汇编器保留符号表中的局部符

NOFP在汇编语言程序中禁止浮点指令

REQUIRE指示两段之间的依赖关系

REQUIRES指示当前文件请求堆栈为8字节对准

87

指不符5--杂项指不符(4)

PRESERVES指示当刖文件保持堆栈为8字节对

RN给特定的寄存器命名

ROUT标记局部标号使用范围的界面

汇编指令与指示符应用实例--2440init代码分析

88

4.1.4与代码有关的指示符

■LAREA、ENTRY和END指示符使用程序举例

-【例4.1]用ARM汇编语言编写的汇编语言模块举例。

■(程序见参考书)

■①定义区域的AREA指示符

■②声明汇编程序入口点的ENTRY指示符

■③应用程序执行

■④应用程序终止

■⑤源程序结束的END指示符

89

■2.CODE32、C0DE16指示符使用程序举例

■用于选择指令集的C0DE16和CODE32指示符

■⑴格式

■格式分别是:

■C0DE16

■CODE32

■(2)使用

■在ARM状态当使用BX指令分支到Thumb指令时,使用

CODEI60C0DE16放置在分支目标处代码的前面。当

从Thumb状态分支到ARM指令时,使用CODE32。

CODE32放置在分支目标处代码的前面。

90

■⑶使用举例

■使用举例1:这个例子给出如何从ARM指令分

支到Thumb指令。

-AREAARMtoThumb,CODE,READONLY

-;这个区域开始于ARM状态

■ADRrl,testl+l

-;装入地址,设置最低位为1

-BXrl

-;分支并且改变指令集

-CODE16;跟随指令为Thumb指令

-testlMOVr0,#20;Thumb指令

91

■3.禁止浮点运算的NOFP指示符

■NOFP指示符表明在一个汇编语言源文件中

不接受浮点指令。

■⑴格式

■NOFP

■⑵使用

■使用NOFP指示符确认在软件或目标硬件不支

持浮点指令的情况下,程序中没有使用浮点

指令。

92

■4■定义局部标号使用范围的ROUT指示符

■ROUT指示符标记局部标号使用范围的界线。

■⑴格式

■{name}ROUT

■(2)使用

■在使用中,ROUT指示符限制了局部标号的使用范围。

这使得程序员容易避免偶然引用一个错误的标号这种

情况的发生。如果不存在ROUT指示符,局部标号的使

用范围是整个AOF区域。如果存在ROUT指示符,局部

标号的使用范围在两个ROUT之间。

■使用name选项用于保证每次引用正确的标号。如果标

号名或引用标号名与ROUT指示符前面的名字不匹配,

汇编器产生错误信息,汇编失败。

93

■⑶使用举例(见参考书)

94

4.1.5与数据定义有关的指示符

卜1.在代码中使用数据的DATA指示符

:DATA指示符通知汇编器,这个标号是在代码中

的数据标号,这意味着标号是在代码段中的数据

的地址。

■⑴格式

■labelDATA

■⑵使用

■使用时,如果需要在Thumb代码区域用到某一个

数据定义指示符,如DCD、DCB和DCW,定义数

据时,必须使用DATA指示符。

95

⑶使用举例

AREAtest,CODE

Thumb_Code;code

;code

MOVpc,lr

ThumbDataDATA

DCB2,5,8

96

■2.分配存储器字节的DCB指示符

■DCB也可以用=指示符代替。

■DCB指示符分配一个或多个存储器中的字节,

并且定义初始运行时的存储器内容。

■(1)格式

■{label}DCBexpression{expression}...

■⑵使用

■如果需要在Thumb代码中用DCB定义带标号的

数据,必须使用DATA指示符。

■如果DCB后跟随着指令,应该使用ALIGN指示符

去确认指令存放是边界对齐的。

■⑶使用举例(见参考书)

97

■3.分配存储器半字的DCW和DCWU指示符

■DCW指示符分配一个或多个存储器中的半字,

以2字节边界对齐,定义初始运行时的存储器

内容。

■DCWU与DCW的区别是:DCWU不要求以2字节

边界对齐。

■(1)格式

■格式分别是:

■{label}DCWexpression{,expression}...

■{label}DCWUexpression{,expression)...9

■⑵使用

■使用时,如果需要在Thumb代码中用DCW(

DCWU)定义一个带标号的数据,必须使用

DATA指示符。

■如果DCW(DCWU)后跟随着指令,要使用

ALIGN指示符,确认指令是字边界对齐的。

■⑶使用举例(见参考书)

99

■4.分配存储器字的DCD和DCDU指示符

■■DCD也可以用&指示符代替。

■■DCD指示符分配1个或多个存储器中的字,4字

节边界对齐,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论