第4章 ARM匯編語言特性與編程基礎(chǔ)_第1頁
第4章 ARM匯編語言特性與編程基礎(chǔ)_第2頁
第4章 ARM匯編語言特性與編程基礎(chǔ)_第3頁
第4章 ARM匯編語言特性與編程基礎(chǔ)_第4頁
第4章 ARM匯編語言特性與編程基礎(chǔ)_第5頁
已閱讀5頁,還剩146頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章ARM北.編語舌特性

與編程基礎(chǔ)

'■本章重點(diǎn):

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

■⑴ARM匯編器提供的匯編語言特性,包括行格

式、預(yù)定義名和內(nèi)建變量、偽指令、符號(hào)、指

示符、表達(dá)式和操作符等,以及它們的使用;

■⑵ARM匯編語言編程基礎(chǔ),包括調(diào)用子程序、

條件執(zhí)行、裝入常數(shù)和地址到寄存器、裝入和

存儲(chǔ)多個(gè)寄存器、多路分支等內(nèi)容,以及對(duì)應(yīng)

的程序代碼。

2

補(bǔ)充知識(shí):

ADSIDE(集成開發(fā)環(huán)境)

■1ADS工具包的組成

-2ADS開發(fā)工具集

■3ARM映像文件

3

補(bǔ)充知識(shí):

ADSIDE(集成開發(fā)環(huán)境)

■ARM應(yīng)用軟件的開發(fā)工具根據(jù)功能的不同,可

以分為編輯軟件、編譯軟件、匯編軟件、鏈接

軟件、調(diào)試軟件、嵌入式實(shí)時(shí)操作系統(tǒng)、函數(shù)

庫、評(píng)估板,JTAG仿真器以及在線仿真器等。

■選擇合適的開發(fā)工具可以加快開發(fā)進(jìn)度,節(jié)省

開發(fā)成本。

4

1ADS工具包的組成

■ADS是ARM公司推出的集成開發(fā)工具包,是專

門用于ARM相關(guān)應(yīng)用開發(fā)和調(diào)試的綜合性軟件。

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

早期的SDT都有提高,是一款功能強(qiáng)大又易于

使用的開發(fā)工具。

■ARMADS包含有CodeWarriorIDE、編譯器、

鏈接器、調(diào)試器、指令集模擬器、ARM開發(fā)包

和應(yīng)用庫等部分,可以用ADS來開發(fā)、編譯、

調(diào)試采用包括C、C++和ARM匯編語言編寫的

程序。

5

ADS工具包的組成(一)

■1.CodeWarriorIDE

■CodeWarriorIDE(集成開發(fā)環(huán)境)包括工

程管理器、代碼生成接口、語法敏感編輯器、

源文件和類瀏覽器、源代碼版本控制系統(tǒng)接口

以及文本搜索引擎等。ADS僅在其PC機(jī)版本中

集成了該IDE。

■CodeWarriorIDE為管理和開發(fā)項(xiàng)目提供了簡

單多樣化的圖形用戶界面,用戶可以使用ADS

的CodeWarriorIDE為ARM和Thumb處理器開

發(fā)用C、C++或者ARM匯編語言編寫的程序代

碼。

6

ADS工具包的組成(二)

■2.編譯器

■ADS提供多種編譯器,以支持ARM和Thumb指

令的編譯。

■3.鏈接器

■Armlink(ARM鏈接器)可以將編譯得到的一個(gè)

或多個(gè)目標(biāo)文件和相關(guān)的一個(gè)或多個(gè)庫文件進(jìn)

行鏈接,生成一個(gè)可執(zhí)行文件,也可以將多個(gè)

目標(biāo)文件部分鏈接成一個(gè)目標(biāo)文件,以供進(jìn)一

步的鏈接。

7

&ADS工具包的組成(三)

■4.調(diào)試器(Debuggers)

■(1)調(diào)試器類型

-調(diào)試器部分包括兩個(gè)調(diào)試器:

-ARM擴(kuò)展調(diào)試器AXD(ARMextendedDebugger)

■ARM符號(hào)調(diào)試器armsd(ARMsymbolicdebugger)

■AXD基于WindowsXX/NT風(fēng)格,具有一般意義

上調(diào)試器的所有功能,包括簡單和復(fù)雜斷點(diǎn)設(shè)

置、棧顯示、寄存器和存儲(chǔ)區(qū)顯示、命令行接

口等。

-Arr^sd作為一個(gè)命令行工具輔助調(diào)試或者用在

其他操作系統(tǒng)平臺(tái)上。

8

ADS工具包的組成(四)

■AXD調(diào)試器本身是一個(gè)軟件,用戶通過這個(gè)軟

件可以對(duì)包含有調(diào)試信息的、正在運(yùn)行的可執(zhí)

行代碼進(jìn)行變量的查看、斷點(diǎn)的設(shè)置、單步執(zhí)

行等調(diào)試操作。在ARM體系中,它有Multi-ICE、

ARMulator和Angel等幾種方式。AXD可以在

Windows和UNIX下進(jìn)行程序的調(diào)試,它為用C、

C++和匯編語言的源代碼提供了一個(gè)全面的

Windows和UNIX環(huán)境。

9

ADS工具包的組成(五)

■(2)調(diào)試方式

■在ARM體系中,可以選擇Multi-ICE(Multi-

processorin-circuitemulator)ARMugtor或

Angel多種調(diào)試方式。ARMulator

■指令集模擬器(InstructionSet

Simulators)

■用戶使用指令集模擬器無需任何硬件即可在

PC機(jī)上完成一部分調(diào)試工作。

10

ADS工具包的組成(六)

■5.ARM開發(fā)包和函數(shù)庫

■ARM開發(fā)包由一些底層的例程和庫組成,可

以幫助用戶快速開發(fā)基于ARM的應(yīng)用程序和

操作系統(tǒng)。

■ADS的ARM應(yīng)用庫完善并增強(qiáng)了SDT中的函

數(shù)庫,同時(shí)還包括一些非常有用的源碼例程。

■具體包括系統(tǒng)啟動(dòng)代碼、串行口驅(qū)動(dòng)程序、

時(shí)鐘例程、中斷處理程序等,

11

2ADS開發(fā)工具集

■2.1ADS命令行開發(fā)工具

■2.2GU1開發(fā)工具

■2.3ADS實(shí)用工具

12

2.1ADS命令行開發(fā)工具

■(l)armcc

■armcc是ARMC編譯器。在命令控制臺(tái)環(huán)境下,輸

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

格式以及最常用的一些操作選項(xiàng)。

■(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的匯編器,它對(duì)用ARM

匯編語言和Thumb匯編語言寫的源代碼進(jìn)行匯編。

■(6)armlink

■armlink是ARM連接器。

■(7)armsd

■armsd是ARM和Thumb的符號(hào)調(diào)試器。

14

(A)ARM編譯器

ADS提供四種編譯器,下表給出了這4種編譯器

的總結(jié)

編譯器名稱編譯器類型源代碼編譯輸出

armccC編譯器C32位ARM代碼

tccC編譯器C16位Thumb代碼

armcppC++編譯器C或C++32位ARM代碼

tcppC++編譯器C或C++16位Thumb代碼

15

(B)ARM匯編器

■ADS包含一個(gè)獨(dú)立的ARM匯編器armasm

和一個(gè)內(nèi)置在C/C++編譯器中的內(nèi)聯(lián)匯

編器(inlineassembler)。這兩個(gè)匯編

器能夠處理基本相同的匯編代碼。

16

(C)ARM連接器

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

■將一組目標(biāo)文件或庫連接產(chǎn)生一個(gè)可執(zhí)

行的ELF映像文件;

■將一組目標(biāo)文件部分連接產(chǎn)生一個(gè)新的

目標(biāo)文件,用于以后的連接;

■指定代碼和數(shù)據(jù)在內(nèi)存中的位置;

■為連接產(chǎn)生的文件產(chǎn)生調(diào)試和引用信息

17

連接操作的輸出結(jié)果

■目標(biāo)文件由輸入段(inputsection)組成,輸

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

(讀寫,Read/Write)段、ZI(零初始化,

Zero-Initialized)段。

■armlink可以利用這些屬性把輸入段分組歸并為

更大的生成塊,分別是輸出段(output

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

■輸出段大致相當(dāng)于的段

ELF(segment)o

18

連接器的輸入和輸出

■連接器的輸入是:

-一個(gè)或多個(gè)ELF目標(biāo)格式的目標(biāo)文件,或(可選

的)一個(gè)或多個(gè)由armar工具產(chǎn)生的庫。

■缺省情況下,連接器的輸出是非可重定位映像,

代碼從內(nèi)存地址0x30000000開始,數(shù)據(jù)段緊

隨其后??梢酝ㄟ^連接器選項(xiàng)或一個(gè)配置文件

來指定代碼段和數(shù)據(jù)段存放在什么內(nèi)存地址。

19

連接正確的輸出

①一個(gè)ELF可執(zhí)行格式的可執(zhí)行映像。

②一個(gè)ELF目標(biāo)格式的部分連接的目標(biāo)文

件。

通過fromELF工具,一個(gè)ELF的可執(zhí)行

映像也可以轉(zhuǎn)化為其他的文件格式。

20

2.2GUI開發(fā)工具

■ADS的GUI開發(fā)工具主要包括兩個(gè)獨(dú)立的

工具:CodeWarriorIDE(CodeWarrior

集成開發(fā)環(huán)境)和AXD(ARMexecutor

Debugger)。

21

⑴CodeWarrior集成開發(fā)環(huán)境

■CodeWarrior集成開發(fā)環(huán)境為管理和開發(fā)工程項(xiàng)

目提供了簡單一致的圖形用戶界面,可以加速并

簡化嵌入式開發(fā)過程中的每個(gè)環(huán)節(jié),縮短用戶項(xiàng)

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

面介紹的各種命令行工具,實(shí)現(xiàn)對(duì)項(xiàng)目代碼的編

譯、匯編和連接。

■CodeWarrior以工程項(xiàng)目的方式組織源代碼文件、

庫文件和其他文件,讓用戶將這些文件及配置設(shè)

置放在一個(gè)工程項(xiàng)目中。每個(gè)工程項(xiàng)目可以創(chuàng)建

和管理多個(gè)生成選項(xiàng)的配置。

22

CodeWarriorIDE主要提供以下功能:

1.按照工程項(xiàng)目(Project)的方式來組

織源代碼文件、庫文件和其他文件。

2.設(shè)置各種生成選項(xiàng)(Buildoptions),

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

3.一個(gè)源代碼編輯器。

4.一個(gè)文件瀏覽器。

5.在文本文件中進(jìn)行字符串搜索和替換。

6.文本文件比較功能。

7.用戶自定義界面

23

CodeWarrior中常用的兩個(gè)術(shù)語

■目標(biāo)系統(tǒng)(Targetsystem)

■目標(biāo)系統(tǒng)是指應(yīng)用程序運(yùn)行的環(huán)境,可以是基

于ARM的硬件系統(tǒng),也可以是ARM仿真運(yùn)行環(huán)

境。比如,當(dāng)應(yīng)用程序運(yùn)行在ARM評(píng)估板上時(shí),

目標(biāo)系統(tǒng)就是該評(píng)估板。

■生成目標(biāo)(Buildtarget)

■生成目標(biāo)是指生成特定目標(biāo)文件的選項(xiàng)設(shè)置

(包括匯編選項(xiàng)、編譯選項(xiàng)、連接選項(xiàng)以及連

接后的處理選項(xiàng)等)和所用的所有文件的集合。

通常一個(gè)生成目標(biāo)對(duì)應(yīng)一個(gè)目標(biāo)映像文件。

24

CodeWarric^工程項(xiàng)目通常包

括3個(gè)生成目標(biāo):

-Debug:該生成目標(biāo)對(duì)應(yīng)的映像文件包含所

有調(diào)試信息。在開發(fā)過程中使用。

■Release:該生成目標(biāo)對(duì)應(yīng)的映像文件不包含

調(diào)試信息。用于生成實(shí)際發(fā)行的軟件版本。

■DebugRel:該生成目標(biāo)對(duì)應(yīng)的映像文件包含

基本的調(diào)試信息。

25

7種可選的ADS工程項(xiàng)目模板

①ARMExecutablImage:ARM可執(zhí)行映像文件模

板。用于由ARM指令的代碼生成一個(gè)ELF格式的可

執(zhí)行映像文件;

②ARMObjectLibrary:ARM目標(biāo)文件庫模板。用于由

ARM指令的代碼生成一個(gè)armar格式的目標(biāo)文件庫;

③EmptyProject:空工程模板。用于創(chuàng)建一個(gè)不包含

任何庫或源文件的工程;

④MakefileImporterWizard:Makefile導(dǎo)入向?qū)0濉?/p>

用于將VisualC的nmake或GNUmake文件轉(zhuǎn)入到

CodeWarriorIDE工程文件;

26

7種可選的ADS工程項(xiàng)目模板(續(xù))

⑤ThumbARMExecutableImage:ARM/Thumb7昆

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

Thumb指令的混和代碼生成一個(gè)可執(zhí)行的ELF

格式的映像文件;

⑥ThumbExecutableimage:Thumb可執(zhí)行映像

文件模板。用于由Thumb指令創(chuàng)建一個(gè)可執(zhí)行

的ELF格式的映像文件;

⑦ThumbObjectLibrary:Thumb目標(biāo)文件庫模板。

用于由Thumb指令的代碼生成一個(gè)armar格疝

的目標(biāo)文件庫。

27

L7個(gè)ADS工程模板的截圖

Nev

ProjectFile|Object|

ExecutableImageProjectname:

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

哈ARMObjectLibrary

能EmptyProject

Location:

的MakefileImporterWizard

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

的ThumbExecutableImage

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

的ThumbObjectLibrary

Project'

28

(2)AXD

■AXD(ARM擴(kuò)展調(diào)試器,ARMextended

Debugger)是ADS的圖形化調(diào)試工具。AXD是

一個(gè)功能強(qiáng)大的調(diào)試工具,提供了多種輔助調(diào)試

手段用來對(duì)用戶程序進(jìn)行調(diào)試,包括斷點(diǎn)、觀測(cè)

點(diǎn)和觀測(cè)項(xiàng)等。

■其他兩個(gè)調(diào)試器:armsd(ARM符號(hào)調(diào)試器,

ARMSymbolicDebugger)和ADW/ADU

(ApplicationDebuggerWindows/UNIX)也是

ADS的調(diào)試工具。前者在命令行工具里已簡單介

紹,后者是ADS老版本的圖形化調(diào)試工具。

29

調(diào)試目標(biāo)和調(diào)試代理

■英文術(shù)語分另U是debugtarget和debugagent

■調(diào)試目標(biāo):被調(diào)試程序運(yùn)行所在的目標(biāo)設(shè)備或

仿真軟件。

■調(diào)試代理:運(yùn)行在調(diào)試目標(biāo)上,接受并執(zhí)行主

機(jī)上調(diào)試器發(fā)來的命令,例如,在目標(biāo)程序中

設(shè)置斷點(diǎn)、單步執(zhí)行、讀內(nèi)存、寫內(nèi)存等。

30

ARM體系中的三種調(diào)試代理

■在ARM體系中主要有以下三種調(diào)試代理:

.ARMulator,打開AXD軟件時(shí)默認(rèn)打開的H

標(biāo)是ARMidator。

■基于JTAG的調(diào)試代理Multi-ICE

■Angel調(diào)試監(jiān)控程序

31

調(diào)試代理與調(diào)試器的關(guān)系

■調(diào)試代理與調(diào)試器的關(guān)系是前者執(zhí)行后者請(qǐng)求

的操作。調(diào)試代理既不是被調(diào)試的程序,也不

是調(diào)試器本身。用戶可以通過AXD使用調(diào)試代

理,對(duì)運(yùn)行在調(diào)試目標(biāo)上的包含調(diào)試信息的程

序進(jìn)行變量查看、斷點(diǎn)控制等操作。

32

23ADS實(shí)用工具

■ARM映像文件轉(zhuǎn)換工具一fromelf

■ARM函數(shù)庫管理工具一armar

33

(1)fromelf

■這是ARM映像文件轉(zhuǎn)換工具。該命令將ELF

格式的文件作為輸入文件,將該格式轉(zhuǎn)換為各

種輸出格式的文件,包括plainbinary(BIN格

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

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

IntelHex32format(Intel公司32位格式映

像文件),和Verilog-likehexformat(Verilog

類型16進(jìn)制文件)。fromelf命令也能夠?yàn)檩?/p>

入映像文件產(chǎn)生文本信息,例如代碼和數(shù)據(jù)長

度。

34

(2)armar

■armar是ARM庫管理工具。armar將一系列ELF格式

的目標(biāo)文件集合在一起,組成一個(gè)庫。這樣的庫可以

傳遞給連接器armlink以代替多個(gè)目標(biāo)文件。不過,連

接一個(gè)庫文件并不意味著庫中的所有目標(biāo)文件都被連

接。armlink連接目標(biāo)文件和連接庫有如下不同:

■作為輸入的每個(gè)目標(biāo)文件都無條件地被連接在輸出文

件中,盡管如果armlink帶-remove選項(xiàng),耒用到的區(qū)

段會(huì)被剪裁掉。

-庫文件中的成員僅當(dāng)它被一個(gè)目標(biāo)文件或其他已被包

含的庫文件引用時(shí)才被包含在輸出文件中。

35

3ARM映像文件

-什么是映像文件

■映像文件(image)是一個(gè)計(jì)算機(jī)上

的可執(zhí)行文件,在執(zhí)行之前被加載到

計(jì)算機(jī)的存儲(chǔ)器中。通常,一個(gè)映像

文件中包含多個(gè)線程。

36

ELF目標(biāo)文件

■ARM集成開發(fā)環(huán)境中的各種源文件(包

括匯編程序、C程序以及C++程序)經(jīng)過

ARM編譯器編譯之后,生成ELF格式的目

標(biāo)文件。

■ELF目標(biāo)文件的文件名后綴是.0。

37

ARM映像文件.axf

■目標(biāo)文件,o和相應(yīng)的C/C++運(yùn)行時(shí)庫.a經(jīng)

過ARM連接器連接后,生成.axf映像文

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

包含特定格式的調(diào)試信息,可在開發(fā)板

上調(diào)試運(yùn)行。

38

不含調(diào)試信息的映像文件

■映像文件調(diào)試結(jié)束之后,可以使用

fromelf工具將映像文件中的調(diào)試信息和

注釋過濾掉,生成二進(jìn)制的可加載映像

文件(通常帶后綴,bin,也可以無后綴)。

可加載映像文件可寫入嵌入式設(shè)備的

ROM中,在加電啟動(dòng)過程執(zhí)行。

39

ARM映像文件的組成

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

者.bin文件。

■,axf文件和.bin文件的區(qū)別之處在于前者

包含有調(diào)試信息和注釋信息,后者沒有。

編譯器輸出的ARM映像文件以,axf文件為

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

轉(zhuǎn)換成.bin文件。實(shí)際下載到系統(tǒng)板的映

像文件多數(shù)是?bin格式文件。

40

映像文件的加載視圖和執(zhí)行視圖

■映像文件域在加載時(shí)被映射存放到系統(tǒng)存儲(chǔ)區(qū)。

在執(zhí)行映像時(shí),往往需要移動(dòng)一些域到執(zhí)行地

址并且產(chǎn)生ZI輸出段。例如,初始化的RW數(shù)

據(jù)也許要被迫從ROM區(qū)的加載地址拷貝到RAM

區(qū)的執(zhí)行地址。

■加載視圖:根據(jù)映像文件裝載到存儲(chǔ)器時(shí)的地

址描述每一個(gè)域和段,該視圖是映像文件開始

執(zhí)行前它的域和段的位置視圖。

■執(zhí)行視圖:該視圖根據(jù)映像文件在執(zhí)行時(shí)每一

個(gè)域和段的地址描述映像的各個(gè)組成部分。

41

&加載視圖與執(zhí)行視圖的比較

Image$$RW$$limit

Image$$ZI$$limit

Image$$ZI$$base

Image$$RW$$base

Image$$RO$$limit

Image$$RO$$base

42

圖中帶有$$"符號(hào)的含義

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

■說明如下:

Image$$RO$$baseRO輸出段運(yùn)行時(shí)起始地址

Image$$RO$$limitR0輸出段運(yùn)行時(shí)存儲(chǔ)區(qū)界限

Image$$RW$$baseRW輸出段運(yùn)行時(shí)起始地址

Image$$RW$$limitRW輸出段運(yùn)行時(shí)存儲(chǔ)區(qū)界限

Image$$ZI$$baseZI輸出段運(yùn)行時(shí)起始地址

Image$$ZI$$limitZI輸出段運(yùn)行時(shí)存儲(chǔ)區(qū)界限

43

三個(gè)段空間計(jì)算公式

R0段大小二

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

RW段大小二

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

ZI段大小二

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

44

段大小計(jì)算小結(jié),段大小的設(shè)置

■加載時(shí),R0段+RW段=整個(gè)程序大小。

■運(yùn)行時(shí),R0段+RW段2整個(gè)程序大小

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

■這些符號(hào)具體取值可以在ADS或者SDT中設(shè)置。

■-ro-base選項(xiàng)對(duì)應(yīng)設(shè)置Image$$RO$$base,

■-rw-base選項(xiàng)對(duì)應(yīng)設(shè)置Image$$RW$$base。

45

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

址映像

-在生成映像文件時(shí),ARM連接器需要

知道下列信息:

■分組信息決定如何將各個(gè)輸入段組

織成相應(yīng)的輸出段和域。

■定位信息決定各個(gè)域在存儲(chǔ)空間中

的起始地址。

46

ADS編譯成功后輸出的映像文件內(nèi)

I部成分統(tǒng)計(jì)表舉例

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.

映像文件統(tǒng)計(jì)報(bào)告

■在ADS集成開發(fā)環(huán)境下,對(duì)工程文件進(jìn)行編譯

之后,會(huì)輸出一個(gè)映像文件的統(tǒng)計(jì)報(bào)告。該報(bào)

告中會(huì)分別給出目標(biāo)文件(.0)文件和庫(.a)

文件中5種組成成分的占空間大小。這5種組成

成分是:代碼、R0數(shù)據(jù)、RW數(shù)據(jù)、ZI數(shù)據(jù)和

Debug數(shù)據(jù),如圖6-7所示。此外,還會(huì)分別給

出總R0空間(代碼+R0數(shù)據(jù))、總RW空間

(RW數(shù)據(jù)+ZI數(shù)據(jù))和總ROM空間(代碼+R0

數(shù)據(jù)+RW數(shù)據(jù))的大小。

48

4.1ARM匯編語言特性

■4.1.1行格式、預(yù)定義名和內(nèi)建變量

■L行格式

■在ARM匯編語言模塊中,源代碼行的一般格

式是:

■{symbol}{instruction|directive|pseudoJnstruction}

{;comment}

■也就是:

-{符號(hào)}{指令|指示符|偽指令}{;注釋}

49

*

■上述行格式中用大括號(hào)括起來的三部分是

可選的。如果一行中沒有symbol,指令|指

示符I偽指令不能從第1列位置開始,指令|

指示符I偽指令前面必須放置空格或Tab(

制表符)字符。

50

□l__每一_條_指令的-助記符可以使用全部大寫或全部小寫字符

,但不能在同一條指令的助記符中大、小寫混用。

■指示符必須大寫。

■指令中每一個(gè)寄存器名能夠全部大寫或全部小寫,但不

能大、小寫混用。

■行格式中symbol通常是標(biāo)號(hào)dabel),在指令或偽指

令前它總是標(biāo)號(hào),在某些指示符前它是表示變量或常量

的符號(hào)(symbol)。

■行格式中symbol必須從第一列開始,不能含任何如空格

或Tab的字符,詳見本節(jié)符號(hào)命名規(guī)則部分。

51

2.預(yù)定義寄存器和協(xié)處理器名

!ARM匯編器對(duì)ARM的寄存器進(jìn)行了預(yù)定義,所有

的寄存器和協(xié)處理器名都是大小寫敏感的。

-⑴預(yù)定義寄存器名

-⑵預(yù)定義程序狀態(tài)寄存器名

-⑶預(yù)定義浮點(diǎn)寄存器名

-(4)預(yù)定義協(xié)處理器名和協(xié)處理器寄存器名

52

預(yù)定義變量1

?預(yù)定義的寄存器如下I

■,R0~R15和r0~rl5;

■,al~a4(參數(shù)、結(jié)果或臨時(shí)寄存器,與

r0~r3同義);

■,vl~v8(變量寄存器,與r4~rll同義);

■,sb和SB(靜態(tài)基址寄存器,與r9同義);

■,sl和SL(堆棧限制寄存器,與rlO同義);

■,fp和FP(幀指針,與同義);

■,ip和IP(過程調(diào)用中間臨時(shí)寄存器,與「12同

義);

預(yù)定義變量2

,sp和SP(堆棧指針,與門3同義);

,|r和LR(鏈接寄存器,與「14同義);

?pc和PC(程序計(jì)數(shù)器,與「15同義);

,cpsr和CPSR(程序狀態(tài)寄存器);

,spsr和SPSR(程序狀態(tài)寄存器);

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

?s0~s31和S0~S31(VFP單精度寄存器);

?d0~dl5和D0~D15(VFP雙精度寄存器);

■p0-pl5(協(xié)處理器0~15);

-C0-C15(協(xié)處理器寄存器0~15)。

3.內(nèi)建變量

■內(nèi)建變量(builtinvariables)見表律1,

它們是由ARM匯編器定義過的。內(nèi)建變

量不能用SETA、SETL或SETS指示符設(shè)置

,它們能被用在表達(dá)式或條件中,如:

■IF{ENDIAN}="big?

■IF{ARCHITECTURE}=、'4T〃

內(nèi)置變量2

赤曷______________含義

{PC}或.當(dāng)前指令的地址

何慶可或@存儲(chǔ)區(qū)位置計(jì)數(shù)器的當(dāng)前值

{TRUE}邏輯常量真

{FALSE}邏輯常量假

{OPT}當(dāng)前設(shè)置列表選項(xiàng)值,OPT用來保存當(dāng)前列表選項(xiàng),改變選項(xiàng)值,恢復(fù)它的原始值

{CONFIG}如果匯編器匯編ARM代碼,則值為32;如果匯編器匯編Thumb代碼,則值為16

{ENDIAN}如果匯編器在大端模式下,則值為big;如果匯編器在小端模式下,則值為little

內(nèi)置變量3

到!味J把哪幃井生淵AK1Vl代“時(shí)》則恒?為JZ;如果/L通砧制1nun1D1Lg,則值為lb,卜回乂

{CPU}選定的CPU名,缺省時(shí)為ARM7TDMI

{FPU}選定的FPU名,缺省時(shí)為SoftVFP

{ARCHITECTURE}選定的ARM體系結(jié)構(gòu)的值;3,3M,4,4T和4TxM

{PCSTOREOFFSET}STRpc,或STMRb,[...PC]指令的地址和PC存儲(chǔ)值之間的偏移量

{ARMASM_VERSION}ARM匯編器的版本號(hào),為整數(shù)

或|ads$version|

4.1.2ARM偽指令與Thumb偽指令

■ARM匯編器支持ARM偽指令和Thumb偽指令,在

匯編時(shí)把它們翻譯成適當(dāng)?shù)腁RM或Thumb指令組

合。

■全部ARM和Thumb偽指令見表4-2。Thumb偽指

令在表中用(Thumb)標(biāo)出。

■雖然表4-2中Thumb偽指令A(yù)DR、LDR和NOP與

ARM偽才旨令A(yù)DR、LDR和NOP格式完全相同,但

相同的偽指令出現(xiàn)在程序中Thumb代碼區(qū),匯編

器識(shí)別為Thumb偽指令;出現(xiàn)在ARM代碼區(qū)匯編

器識(shí)別為ARM偽指令。

58

LADRARM偽指令

■ADR偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄

存器的地址到一個(gè)寄存器。

■⑴格式

■ADR{condition}register,expression

59

■⑵使用

■使用中,ADR總是被匯編成一條指令。匯編器試圖產(chǎn)

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

指令構(gòu)造出地址,則產(chǎn)生錯(cuò)誤信息,匯編失敗。

■如果expression是相對(duì)程序的,計(jì)算產(chǎn)生的地址必須

與ADR偽指令在同一個(gè)代碼區(qū)域。

■⑶使用舉例

■TestiMOVrl,#0

■ADRr2,Testi

;產(chǎn)生指令SUBr2,pc,#0xC

60

2.ADRLARM偽指令

■ADRL偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄

存器的地址到一個(gè)寄存器。與ADR偽指

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

的地址范圍,原因是ADRL產(chǎn)生兩條數(shù)據(jù)

處理指令。

■⑴格式

ADRL{condition}register,expression

61

■(2)使用

■使用中,ADRL總是被匯編成2條指令。如果匯編器不

能以2條指令構(gòu)造出地址,則產(chǎn)生錯(cuò)誤信息,匯編失敗

O

■如果expression是相對(duì)程序的,它必須計(jì)算產(chǎn)生一個(gè)與

ADRL偽指令在同一個(gè)代碼區(qū)域的地址,否則在隨后的

連接時(shí),地址可能出了范圍。

■⑶使用舉例

■startMOVr0,#10

■ADRLr4,start+60000

■;產(chǎn)生指令A(yù)DDr4,pc,#0xe800

■;ADDr4,r4,#0x254

62

3.LDRARM偽指令

■LDR偽指令裝入二個(gè)32位常數(shù)值或一個(gè)地址到

一個(gè)寄存器。

■⑴格式

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

■⑵使用

■使用LDR偽指令有兩個(gè)主要目的,一是當(dāng)一個(gè)立即數(shù)

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

個(gè)寄存器時(shí),用LDR偽指令產(chǎn)生一個(gè)文字池常數(shù);二

是裝入一個(gè)相對(duì)程序或外部的地址到一個(gè)寄存器。

■⑶使用舉例

LDRrO,=Oxlff;裝入Oxlff到rO

LDRrl,=label;裝入山bel地址到門63

4.NOPARM偽指令

■對(duì)NOP偽指令,匯編器產(chǎn)生什么也不操作的

ARM指令:MOVrO,rOo

■⑴格式

■NOP

64

■5.ADRThumb偽指令

■ADR偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄存器的

地址到一個(gè)寄存器。

■⑴格式

■ADRregister,expression

■⑵使用

■使用中,在Thumb狀態(tài),ADR只能產(chǎn)生字對(duì)齊

的地址。要使用ALIGN指示符去確認(rèn)expression

是字對(duì)齊的。

-若表達(dá)式是相對(duì)程序的,必須計(jì)算產(chǎn)生一個(gè)與

ADR偽指令在同一個(gè)代碼區(qū)域的地址。65

■⑶使用舉例

■ADRr3,testexml

■;產(chǎn)生指令A(yù)DDr3,pc,#nn

■;code

■ALIGN

■testexm1DCW1,2,3,4

66

■6.LDRThumb偽指令

■LDR偽指令裝入一個(gè)32位常數(shù)值或一個(gè)地址到一個(gè)低寄

存器中。

■⑴格式

■LDRregister,=[expression|label-expression]

■(2)使用

■使用LDR偽指令有兩個(gè)主要目的,一是當(dāng)一個(gè)立即數(shù)的

值由于超出MOV指令的范圍,不能裝入一個(gè)寄存器時(shí),

產(chǎn)生文字池常數(shù);二是裝入一個(gè)相對(duì)程序或外部的地址

到一個(gè)寄存器。

■⑶使用舉例

■LDRrO,=OxOffe;裝入OxOffe到rO

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

67

■7.MOVThumb偽指令

■MOV偽指令傳送一個(gè)低寄存器的值到另一個(gè)低

寄存器(r0-r7)o而MOV指令不能傳送一個(gè)低

寄存器的值到另一個(gè)低寄存器。

■(1)格式

■MOVRd,Rs

■⑵使用

■在使用中,匯編器將MOV偽指令變成帶立即數(shù)

的ADD指令,指令中立即數(shù)的值為0。

■⑶使用舉例

■MOVRd,Rs;產(chǎn)生指令A(yù)DDRd,Rs,#0

68

■8.NOPThumb偽指令

■對(duì)NOP偽指令,匯編器產(chǎn)生什么也不操

作的Thumb指令:MOVr8/8。

■⑴格式

■NOP

69

4.1.3符號(hào)(symbols)

與指示符(directives)

■使用符號(hào)能夠代表變熹"地址和數(shù)值常數(shù)。符

號(hào)代表地址時(shí),也稱為標(biāo)號(hào)。

■1.符號(hào)命名規(guī)則

■符號(hào)命名遵守以下規(guī)則:

-⑴在符號(hào)名中可以使用大寫字母、小寫字母、數(shù)字

字符或下劃線字符。

-⑵除了局部標(biāo)號(hào)外,不允許在符號(hào)名的第一個(gè)字符

位置使用數(shù)字字符。

-⑶符號(hào)名中對(duì)大、小寫字母是敏感的。

-⑷在符號(hào)名中所有的字符是有意義的。

70

-⑸在它們的作用范圍內(nèi),符號(hào)名必須是唯一的。

■⑹符號(hào)名必須不使用內(nèi)建變量名、預(yù)定義寄存器名和

預(yù)定義協(xié)處理器名。

■⑺符號(hào)名應(yīng)該不使用與指令助記符或指示符相同的名

字。

■⑻如果需要在符號(hào)名中使用更大范圍的字符,使用如

下舉例的格式為符號(hào)名劃界線:

■|C$$code|

■其中兩邊的兩條豎線不是符號(hào)的一部分,只用于為符

號(hào)名劃界線,它們之間不允許使用豎線、分號(hào)和換行符

71

■2.變量(variables)

-變量有三種類型:

①?數(shù)值

②?邏輯

③?串

■變量的類型不能被改變,變量的值可以

被改變。

72

■3.匯編時(shí)串變量的替換

■可以使用串變量作為匯編語言的一整行或一行

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

巧’作為前綴,則匯編器用串變量的值替換串變

量。巧,字符通知匯編器,在檢查一行的語法前

替換源代碼行的串。

■使用,'標(biāo)記變量名結(jié)束,如果變量名后有跟隨

的字符,替換后跟隨在串變量的值后,

■4.標(biāo)號(hào)(labels)

■⑴相對(duì)程序的標(biāo)號(hào)

■⑵相對(duì)寄存器的標(biāo)號(hào)

■⑶絕對(duì)地址

73

■5.局部標(biāo)號(hào)(locallabels)

■局部標(biāo)號(hào)使用0~99范圍內(nèi)的一個(gè)數(shù),可以有選

擇地在其后跟隨一個(gè)表示當(dāng)前范圍的名字。

■局部標(biāo)號(hào)用在指令中,指出分支的目標(biāo)處。

■局部標(biāo)號(hào)格式為:

■n{routname)

74

■6.常量

■常量由數(shù)值常量、串常量、布爾常量和字符常量組成。

■⑴數(shù)值常量

-數(shù)值常量在匯編語言中采用以下三種形式:

■?十進(jìn)制數(shù),例如234;

■?十六進(jìn)制數(shù),例如0x7b或0x7B;

■,n進(jìn)制數(shù),格式為n_xxx,n是2~9之間的一個(gè)基數(shù),

xxx是這個(gè)基數(shù)下的殘值,例如8_375,表示基數(shù)為8(

八進(jìn)制數(shù)),數(shù)值為375。

-⑵串常量

■⑶布爾常量

■⑷字符常量

75

■使用舉例:

■anumSETA3500;假定anum在以前聲明過

■addrDCDOxOOff;十六進(jìn)制數(shù)

■DCDOxOOFF;十六進(jìn)制數(shù)

■DCD2_11000011;二進(jìn)制數(shù)

■bnumSETA8_74007

■;假定bnum在以前聲明過,八進(jìn)制數(shù)

■LDRn,=6A5;字符

76

■7.指示符(directives)

-匯編器提供指示符用來支持:

-⑴定義數(shù)據(jù)結(jié)構(gòu)和為數(shù)據(jù)分配空間;

-⑵文件分隔成邏輯上的一個(gè)或多個(gè)區(qū)域;

-⑶錯(cuò)誤報(bào)告和匯編列表控制;

■⑷符號(hào)定義;

■⑸條件匯編和重復(fù)匯編,以及在一個(gè)文件中包含輔助

文件。

77

指示符1--符號(hào)定義指示符(1)

指示符■功能

聲明和初始化一個(gè)全局算術(shù)變量,初始值為0

GBLL聲明和初始化一個(gè)全局邏輯變量,初始值為{FALSE}

GBLS聲明和初始化一個(gè)全局字符串變量,初始值為空

?r1△聲明和初始化一個(gè)局部算術(shù)變量,初始值為0。局部算術(shù)變

量只能在宏中進(jìn)行聲明。

IC.聲明和初始化一個(gè)局部邏輯變量,初始值為《FALSE>。局

部邏輯變量只能在宏中進(jìn)行聲明。

,riq聲明和初始化一個(gè)局部字符串變量,初始值為空。局部字

符串變量只能在宏中進(jìn)行聲明。

SETA給一個(gè)局部或全局算術(shù)變量置值

SETL給一個(gè)局部或全局邏輯變量置值_

SETS給一個(gè)局部或全局字符串變量置值

78

4指示符1-一符號(hào)定義指示符(2)

RLIST給寄存器集命名

CN給一個(gè)協(xié)處理器寄存器命名

CP給一個(gè)特定協(xié)處理器命名,協(xié)處理器號(hào)為0~15

DN給一個(gè)雙精度VFP寄存器命名

SN給一個(gè)單精度VFP寄存器命名

FN給一個(gè)特定的浮點(diǎn)寄存器命名

79

指示符2-一數(shù)據(jù)定義指示符⑴

LTORG指示匯編器匯編當(dāng)前文字池

…或MAP置存儲(chǔ)映射的起點(diǎn)到一個(gè)特定的地址

#或FIELD描述指示符所定義的存儲(chǔ)映射中的空間

%或SPACE定義一塊值為0的存儲(chǔ)器區(qū)域

二或DBC分配一個(gè)或多個(gè)字節(jié)

&或DCD分配一個(gè)或多個(gè)字,從4字節(jié)邊界開始

DCDU分配一個(gè)或多個(gè)字,但不一定從4字節(jié)邊界開始

DCDO分配以字邊界開始的存儲(chǔ)區(qū)域,并指定初始值為到

靜態(tài)基址寄存器的偏移

80

指示符2--數(shù)據(jù)定義指示符⑵

DCFD分配給雙精度浮點(diǎn)數(shù)一段以字邊界開始的內(nèi)存區(qū)域

DCFDU分配給雙精度浮點(diǎn)數(shù)一段以任意邊界開始的內(nèi)存區(qū)域

DCFS分配給單精度浮點(diǎn)數(shù)一段以字邊界開始的內(nèi)存區(qū)域

DCFSU分配給單精度浮點(diǎn)數(shù)一段以任意邊界開始的內(nèi)存區(qū)域

DCI分配以字邊界開始的存儲(chǔ)區(qū)域,并指定初始值。標(biāo)記此地

址存儲(chǔ)的是代碼而不是數(shù)據(jù)

DCQ分配給雙精度浮點(diǎn)數(shù)一段以4字節(jié)邊界開始的內(nèi)存區(qū)域

DCQU分配給雙精度浮點(diǎn)數(shù)一段以任意邊界開始的內(nèi)存區(qū)域

DCW分配給一個(gè)或多個(gè)半字以半字邊界開始的內(nèi)存區(qū)域

DCWU分配給一個(gè)或多個(gè)半字以任意邊界開始的內(nèi)存區(qū)域

DATA標(biāo)識(shí)一個(gè)標(biāo)號(hào)是代碼段中數(shù)據(jù)的標(biāo)號(hào),該符號(hào)后是DCB或

DCD

81

I指示符3-一報(bào)告指示符

ASSERT對(duì)于聲明錯(cuò)誤,在第二次匯編時(shí)

產(chǎn)生錯(cuò)誤信息

!或INFO在匯編時(shí)顯示信息

OPT可在源代碼中設(shè)置列表選項(xiàng)

TTL在一個(gè)列表文件每頁的開始插入

一個(gè)標(biāo)題,每一頁的標(biāo)題在下一

個(gè)TTL之前都有效

SUBT在一個(gè)列表文件的頁中設(shè)置一個(gè)

子標(biāo)題,每一頁的子標(biāo)題在下一

個(gè)SUBT之前都有效

82

4指示符4-一匯編控制指示符⑴

[或IF這三個(gè)符號(hào)連用,進(jìn)行條件匯編

]或ENDIF

MACRO這二個(gè)符號(hào)連用,定義一個(gè)宏定

MEND

83

■指示符4--匯編控制指示符⑵

用來在結(jié)束前退出宏定義

WHILE這二個(gè)符號(hào)連用,進(jìn)行重復(fù)匯編

WEND

84

指不符5一雜項(xiàng)指小符(1)

ALIGN從一個(gè)字邊界開始

AREA指示匯編器匯編一段新的代碼或

數(shù)據(jù)部分

CODE16指示匯編器將隨后的指令作為16

位Thumb指令

CODE32指示匯編器將隨后的指令作為32

位ARM指令

END表示源程序的結(jié)束

85

&指示符5--雜項(xiàng)指示符⑵

ENTRY指向程序的入口,一個(gè)源文件中

只能有一個(gè)ENTRY

*或EQU對(duì)一個(gè)常量賦予一個(gè)符號(hào)名

說明了由鏈接器在目標(biāo)和庫文件

EXPORT或GLOBAL中使用的符號(hào)

提供匯編器在當(dāng)前匯編中未曾定

IMPORT或EXTERN義的符號(hào)名

包含一個(gè)文件,在GET處匯編包含

GET或INCLUDE的文件

86

指不符5一雜項(xiàng)指不符(3)

INCBIN包含一個(gè)未被匯編過的文件

KEEP指示匯編器保留符號(hào)表中的局部符

號(hào)

NOFP在匯編語言程序中禁止浮點(diǎn)指令

REQUIRE指示兩段之間的依賴關(guān)系

REQUIRES指示當(dāng)前文件請(qǐng)求堆棧為8字節(jié)對(duì)準(zhǔn)

87

指不符5--雜項(xiàng)指不符(4)

PRESERVES指示當(dāng)刖文件保持堆棧為8字節(jié)對(duì)

準(zhǔn)

RN給特定的寄存器命名

ROUT標(biāo)記局部標(biāo)號(hào)使用范圍的界面

匯編指令與指示符應(yīng)用實(shí)例--2440init代碼分析

88

4.1.4與代碼有關(guān)的指示符

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

-【例4.1]用ARM匯編語言編寫的匯編語言模塊舉例。

■(程序見參考書)

■①定義區(qū)域的AREA指示符

■②聲明匯編程序入口點(diǎn)的ENTRY指示符

■③應(yīng)用程序執(zhí)行

■④應(yīng)用程序終止

■⑤源程序結(jié)束的END指示符

89

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

■用于選擇指令集的C0DE16和CODE32指示符

■⑴格式

■格式分別是:

■C0DE16

■CODE32

■(2)使用

■在ARM狀態(tài)當(dāng)使用BX指令分支到Thumb指令時(shí),使用

CODEI60C0DE16放置在分支目標(biāo)處代碼的前面。當(dāng)

從Thumb狀態(tài)分支到ARM指令時(shí),使用CODE32。

CODE32放置在分支目標(biāo)處代碼的前面。

90

■⑶使用舉例

■使用舉例1:這個(gè)例子給出如何從ARM指令分

支到Thumb指令。

-AREAARMtoThumb,CODE,READONLY

-;這個(gè)區(qū)域開始于ARM狀態(tài)

■ADRrl,testl+l

-;裝入地址,設(shè)置最低位為1

-BXrl

-;分支并且改變指令集

-CODE16;跟隨指令為Thumb指令

-testlMOVr0,#20;Thumb指令

91

■3.禁止浮點(diǎn)運(yùn)算的NOFP指示符

■NOFP指示符表明在一個(gè)匯編語言源文件中

不接受浮點(diǎn)指令。

■⑴格式

■NOFP

■⑵使用

■使用NOFP指示符確認(rèn)在軟件或目標(biāo)硬件不支

持浮點(diǎn)指令的情況下,程序中沒有使用浮點(diǎn)

指令。

92

■4■定義局部標(biāo)號(hào)使用范圍的ROUT指示符

■ROUT指示符標(biāo)記局部標(biāo)號(hào)使用范圍的界線。

■⑴格式

■{name}ROUT

■(2)使用

■在使用中,ROUT指示符限制了局部標(biāo)號(hào)的使用范圍。

這使得程序員容易避免偶然引用一個(gè)錯(cuò)誤的標(biāo)號(hào)這種

情況的發(fā)生。如果不存在ROUT指示符,局部標(biāo)號(hào)的使

用范圍是整個(gè)AOF區(qū)域。如果存在ROUT指示符,局部

標(biāo)號(hào)的使用范圍在兩個(gè)ROUT之間。

■使用name選項(xiàng)用于保證每次引用正確的標(biāo)號(hào)。如果標(biāo)

號(hào)名或引用標(biāo)號(hào)名與ROUT指示符前面的名字不匹配,

匯編器產(chǎn)生錯(cuò)誤信息,匯編失敗。

93

■⑶使用舉例(見參考書)

94

4.1.5與數(shù)據(jù)定義有關(guān)的指示符

卜1.在代碼中使用數(shù)據(jù)的DATA指示符

:DATA指示符通知匯編器,這個(gè)標(biāo)號(hào)是在代碼中

的數(shù)據(jù)標(biāo)號(hào),這意味著標(biāo)號(hào)是在代碼段中的數(shù)據(jù)

的地址。

■⑴格式

■labelDATA

■⑵使用

■使用時(shí),如果需要在Thumb代碼區(qū)域用到某一個(gè)

數(shù)據(jù)定義指示符,如DCD、DCB和DCW,定義數(shù)

據(jù)時(shí),必須使用DATA指示符。

95

⑶使用舉例

AREAtest,CODE

Thumb_Code;code

;code

MOVpc,lr

ThumbDataDATA

DCB2,5,8

96

■2.分配存儲(chǔ)器字節(jié)的DCB指示符

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

■DCB指示符分配一個(gè)或多個(gè)存儲(chǔ)器中的字節(jié),

并且定義初始運(yùn)行時(shí)的存儲(chǔ)器內(nèi)容。

■(1)格式

■{label}DCBexpression{expression}...

■⑵使用

■如果需要在Thumb代碼中用DCB定義帶標(biāo)號(hào)的

數(shù)據(jù),必須使用DATA指示符。

■如果DCB后跟隨著指令,應(yīng)該使用ALIGN指示符

去確認(rèn)指令存放是邊界對(duì)齊的。

■⑶使用舉例(見參考書)

97

■3.分配存儲(chǔ)器半字的DCW和DCWU指示符

■DCW指示符分配一個(gè)或多個(gè)存儲(chǔ)器中的半字,

以2字節(jié)邊界對(duì)齊,定義初始運(yùn)行時(shí)的存儲(chǔ)器

內(nèi)容。

■DCWU與DCW的區(qū)別是:DCWU不要求以2字節(jié)

邊界對(duì)齊。

■(1)格式

■格式分別是:

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

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

■⑵使用

■使用時(shí),如果需要在Thumb代碼中用DCW(

DCWU)定義一個(gè)帶標(biāo)號(hào)的數(shù)據(jù),必須使用

DATA指示符。

■如果DCW(DCWU)后跟隨著指令,要使用

ALIGN指示符,確認(rèn)指令是字邊界對(duì)齊的。

■⑶使用舉例(見參考書)

99

■4.分配存儲(chǔ)器字的DCD和DCDU指示符

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

■■DCD指示符分配1個(gè)或多個(gè)存儲(chǔ)器中的字,4字

節(jié)邊界對(duì)齊,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論