第4章 語言程序開發工具new_第1頁
第4章 語言程序開發工具new_第2頁
第4章 語言程序開發工具new_第3頁
第4章 語言程序開發工具new_第4頁
第4章 語言程序開發工具new_第5頁
已閱讀5頁,還剩81頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章匯編語言程序開發工具4.1TMS320C54x軟件開發過程

’C54x的應用軟件開發主要完成以下工作:(1)

選擇編程語言編寫源程序

’C54x提供2種編程語言,即匯編語言和C/C++語言。對于完成一般功能的代碼,這兩種語言都可使用,但對于一些運算量很大的關鍵代碼,最好采用匯編語言來完成,以提高程序的運算效率。(2)

選擇開發工具和環境

’C54x提供了兩種開發環境。即非集成開發環境和集成開發環境CCS。

2023/2/31DSP原理及應用第4章匯編語言程序開發工具4.1TMS320C54x軟件開發過程1.

’C54x應用軟件開發流程C源文件C編譯器匯編源文件匯編器匯編源文件COFF目標文件鏈接器可執行的COFF文件宏源文件存檔器宏庫存檔器目標文件庫建庫工具運行時支持庫EPROM編程器交叉引用列表器調試工具TMS320C54x絕對地址列表器HEX代碼轉換工具2023/2/32DSP原理及應用第4章匯編語言程序開發工具2023/2/33DSP原理及應用第4章匯編語言程序開發工具2.

’C54x的開發工具(1)代碼生成工具:C編譯器:用來將C/C++語言源程序自動編譯為’C54x的匯編語言源程序。

匯編器:用來將匯編語言源文件匯編成機器語言COFF目標文件。

鏈接器:將匯編生成的、可重新定位的COFF目標模塊組合成一個可執行的COFF目標模塊。

文檔管理器:允許用戶將一組文件(源文件或目標文件)集中為一個文檔文件庫。

2023/2/34DSP原理及應用第4章匯編語言程序開發工具2.

’C54x的開發工具助記符指令—代數式指令翻譯器:用來將包含助記符指令的匯編語言源文件轉換成包含代數式指令的匯編語言源文件。

建庫實用程序:用來建立用戶自己使用的、并用C/C++語言編寫的支持運行的庫函數。

十六進制轉換程序:可以很方便地將COFF目標文件轉換成TI、Intel、Motorola等公司的目標文件格式。(1)代碼生成工具:2023/2/35DSP原理及應用第4章匯編語言程序開發工具2.

’C54x的開發工具(1)代碼生成工具:絕對制表程序:將鏈接后的目標文件作為輸入,生成.abs輸出文件。

交叉引用制表程序:利用目標文件生成一個交叉引用清單,列出鏈接的源文件中的符號以及它們的定義和引用情況。2023/2/36DSP原理及應用第4章匯編語言程序開發工具2.

’C54x的開發工具(2)代碼調試工具:

C/匯編語言源碼調試器:與軟件仿真器、評價模塊、軟件開發系統、軟件仿真器等配合使用。

軟件仿真器:是一種模擬DSP芯片各種功能并在非實時條件下進行軟件調試的調試工具,它不需目標硬件支持,只需在計算機上運行。初學者工具DSK:是TI公司提供給初學者進行DSP編程練習的一套廉價的實時軟件調試工具。

2023/2/37DSP原理及應用第4章匯編語言程序開發工具2.

’C54x的開發工具(2)代碼調試工具:

軟件開發系統SWDS:是一塊PC插卡,可提供低成本的評價和實時軟件開發,還可用來進行軟件調試,程序可在DSP芯片上實時運行。

可擴展的開發系統仿真器(XDS510):可用來進行系統級的集成調試,是進行DSP芯片軟硬件開發的最佳工具。評價模塊EVM板:是一種低成本的開發板,可進行DSP芯片評價、性能評估和有限的系統調試。

2023/2/38DSP原理及應用第4章匯編語言程序開發工具4.2匯編語言程序的編輯、匯編和鏈接過程

匯編語言源程序可以在任何一種文本編輯器中進行。如筆記本、WORD、EDIT、TC等。

當匯編語言源程序編寫完成后,還必須經過匯編和鏈接后才能運行。

2023/2/39DSP原理及應用第4章匯編語言程序開發工具4.2匯編語言程序的編輯、匯編和鏈接過程示意圖匯編器調試程序鏈接器文本編輯器.asm源文件.obj目標文件.out輸出文件.cmd鏈接命令文件.lst列表文件.map存儲器映像文件十六進制轉換程序HEX500-

o-

m-

l2023/2/310DSP原理及應用第4章匯編語言程序開發工具4.3

COFF的一般概念

匯編器和鏈接器生成的目標文件,是一個可以由’C54x器件執行的文件。這些目標文件的格式稱之為公共目標文件格式(COFF)。

在編寫匯編語言程序時,COFF采用代碼段和數據段的形式,以便于模塊化的編程,使編程和管理變得更加方便。

這些代碼段和數據段簡稱為段。匯編器和鏈接器提供一些偽指令來建立和管理各種各樣的段。2023/2/311DSP原理及應用第4章匯編語言程序開發工具4.3.1

COFF文件的基本單元

1.

段(sections)

段——是存儲器中占據相鄰空間的代碼或數據塊。一個目標文件中的每個段都是分開的和各不相同的。

COFF目標文件都包含以下3種形式的(默認)段:

.text

段(文本段),通常包含可執行代碼;.data

段(數據段),通常包含初始化數據;.bss

段(保留空間段),通常為未初始化變量保留存儲空間。2023/2/312DSP原理及應用第4章匯編語言程序開發工具4.3.1

COFF文件的基本單元

2.

段的基本類型

COFF目標文件中的段有兩種基本類型。

初始化段

未初始化段(1)

初始化段初始化段中包含有數據或程序代碼。主要有:

.text段——已初始化段;

.data段——已初始化段;.sect段——已初始化段,由匯編器偽指令建立的自定義段。

2023/2/313DSP原理及應用第4章匯編語言程序開發工具4.3.1

COFF文件的基本單元

2.

段的基本類型

COFF目標文件中的段有兩種基本類型。(2)

未初始化段

在存儲空間中,為未初始化數據保留存儲空間。它包括:

.bss段——未初始化段;.usect段——未初始化段,由匯編命令建立的命名段(自定義段)。2023/2/314DSP原理及應用第4章匯編語言程序開發工具3.

段與目標存儲器的對應關系目標文件中的段與目標存儲器之間的關系

目標文件目標存儲器.bss.data.textRAME2PROMROM2023/2/315DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

匯編器對段的處理是通過段偽指令來區別各個段的,并將段名相同的語句匯編在一起。

匯編器有5條偽指令可識別匯編語言程序的各個部分:

.bss

.usect

.text

.data

.sect——定義未初始化段——定義未初始化段——定義已初始化段——定義已初始化段——定義已初始化段2023/2/316DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

未初始化段就是在’C54x存儲器中保留空間,通常它們被定位在RAM區。在目標文件中,這些段中沒有確切的內容。

未初始化段分為默認的和命名的兩種,分別由匯編器偽指令.bss和.usect產生。

1.未初始化段

2023/2/317DSP原理及應用第4章匯編語言程序開發工具(1).bss偽指令1.未初始化段

用于在bss段中保留若干個空間。

格式:

.bss

符號,字數符號——對應于保留的存儲空間第一個字的變量名稱。可以讓其他段引用,也可以用.global命令定義為全局符號。

字數——表示在bss段或標有名字的段中保留若干個存儲單元。例:.bssx,4

?2023/2/318DSP原理及應用第4章匯編語言程序開發工具1.未初始化段

(2).usect偽指令

用于為指定的命名段保留若干個空間。

格式:符號.usect

“段名”,字數段名——程序員為未初始化的命名段定義的名字。例:STACK.usect“STACK”,10H2023/2/319DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

已初始化段中包含有可執行代碼或初始化數據。

這些段中的內容都在目標文件中,當加載程序時再放到’C54x的存儲器中。鏈接器在鏈接時會自動地處理段間的相互引用。

已初始化段由.text、.data和.sect三個偽指令建立。2.

已初始化段2023/2/320DSP原理及應用第4章匯編語言程序開發工具已初始化命令的句法:

2.

已初始化段

.text[段起點]

.data[段起點]

.sect“段名”[,段起點]段起點——是任選項。若選用,它為段程序計數器SPC定義一個起始值。若默認,則SPC從0開始。

2023/2/321DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

當匯編器遇到.text或.data或.sect命令時,將停止對當前段的匯編(相當于一條結束當前段匯編的命令),然后將緊接著的程序代碼或數據匯編到指定的段中,直到再遇到另一條.text、.data或.sect命令為止。

當匯編器遇到.bss或.usect命令時,并不結束當前段的匯編,只是暫時從當前段脫離出來,并開始對新的段進行匯編。

2023/2/322DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

命名段由用戶指定,與默認的.text,.data和.bss段的使用相同,但它們被分開匯編。

可用.usect和.sect兩個偽指令產生命名段。3.

命名段(自定義段)2023/2/323DSP原理及應用第4章匯編語言程序開發工具

.usect偽指令產生類似.bss的段,為變量在RAM中保留存儲空間。.sect偽指令產生類似.text和.data的段,可以包含代碼或數據。.sect偽指令產生可重新定位地址的命名段。3.

命名段產生命名段偽指令格式:

符號

.usect“段名”,字數

.sect“段名”2023/2/324DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

4.子段

子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲器圖更加緊密。子段的命名句法為:

基段名:子段名子段也有兩種,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。例:在.text段內產生一個稱為_func的子段

.sect“.text:_func”

2023/2/325DSP原理及應用第4章匯編語言程序開發工具4.3.2

匯編器對段的處理

匯編器為每個段都安排了一個單獨的程序計數器稱之為段程序計數器SPC。

SPC表示在程序代碼或數據段內當前的地址。開始時匯編器將每個SPC置0。當匯編器將程序代碼或數據加到段內時,增加相應的SPC值。若再繼續對某個段匯編,則相應的SPC就在先前的數值上繼續增加。

5.

段程序計數器SPC2023/2/326DSP原理及應用第4章匯編語言程序開發工具【例4.3.1】段命令應用舉例。

匯編語言源程序:

.datacoeff.word044h,055h,066h.bssbuffer,8prt.word0456h.textadd:LD0Dh,Aaloop:SUB#1,A

BCaloop,AGEQ.dataivals.word0CCh,0DDh,0EEh

;初始化數據段

;3組數據放入.data段

;在.bss段保留8個單元

;0456h放入.data段

;初始化文本段

;1字指令

;2字指令

;2字指令共計5個字

;初始化數據段

;3組數據放入.data段2023/2/327DSP原理及應用第4章匯編語言程序開發工具匯編語言源程序:var2.usect“newvars”,2inbuf.usect“newvars”,8

.text

mpy:LD0Ah,B

mloop:MPY#0Ah,BBCmloop,BNOV.sect“vectors”.word044h,088h

;建立newvars命名段,保留2個單元

;在newvars段保留8個單元

;初始化文本段

;1字指令

;2字指令

;2字指令共計5個字;建立vectors命名段

;2組數據放入vectors命名段2023/2/328DSP原理及應用第4章匯編語言程序開發工具

匯編語言源程序經過匯編后,共建立了5個段:

.text段——文本段,段內有10個字可執行

的程序代碼。

.data段——已初始化的數據段,段內有7

個字的數據。

vectors段——用.sect命令生成的命名段,

段內有2個字的初始化數據。

.bss段——未初始化的數據段,在存儲器中

為變量保留8個存儲單元。

newvars段——用.usect命令建立的命名段,為變量保留10個存儲單元。

2023/2/329DSP原理及應用第4章匯編語言程序開發工具經匯編后,得列表文件(部分):2*******************************3

**匯編一個初始化表到.data段**4

*******************************5

0000.data6

0000

0044coeff.word044h,055h,066h

00010055

000200667*******************************8**在.bss段中為變量保留空間**9*******************************10

0000.bssbuffer,811*******************************12**仍然在.data段中**13*******************************14

00030456prt.word0456h行號目標代碼段名100df0100001f8420001110af166000aF8680006004400550066045600cc00dd00ee00440088

沒有數據保留10個字50000.data600000044coeff.word044h,055h,066h100000.bssbuffer,81400030456prt.word0456h.data

6

00446

00556

006610

.bss

沒有數據保留8個字14

04562023/2/330DSP原理及應用第4章匯編語言程序開發工具15********************************16**匯編代碼到.text段**17********************************18

0000.text19

0000

100dadd:LD0Dh,A20

0001

f010aloop:SUB#1,A

0002

0001

21

0003

f842

BCaloop,AGEQ

0004

0001’

22

**********************************23

**匯編另一個初始化表到.data段**

24**********************************25

0004

.data

26

0004

00ccivals.word0CCh,0DDh,0EEh

0005

00dd

0006

00ee27********************************28

**為更多的變量定義另一個段**29********************************30

0000var2.usect“newvars”,231

0001

inbuf.usect“newvars”,8

行號目標代碼段名100df0100001f8420001110af166000aF868000666614004400550066045600cc00dd00ee.data00440088

10沒有數據保留8個字.bss沒有數據保留10個字.text

180000.text190000100dadd:LD0Dh,A19

100d200001f010aloop:SUB#1,A20

f01020

0001210003f842BCaloop,AGEQ21

f84221

0001250004.data26000400ccivals.word0CCh,0DDh,0EEh.data

26

00cc26

00dd26

00ee300000var2.usect“newvars”,2newvars

30

保留2個字310001inbuf.usect“newvars”,831

保留8個字2023/2/331DSP原理及應用第4章匯編語言程序開發工具32

*********************************33

**匯編更多代碼到.text段**34*********************************35

0005

.text

36

0005

110a

mpy:LD0Ah,B

370006

f166mloopMPY#0Ah,B

0007

000a

38

0008

f868BCmloop,BNOV

0009

0006’

39****************************************40

**為中斷向量.vectors定義一個自定義段**41****************************************42

0000

.sect“vectors”430000

0044

.word044h,088h0001

0088

行號目標代碼段名1920202121100df0100001f8420001110af166000aF8680006.text66614262626004400550066045600cc00dd00ee.data00440088

10沒有數據保留8個字.bss3031沒有數據保留10個字newvars350005.text.text

360005110ampy:LD0Ah,B36

110a370006f166mloopMPY#0Ah,B37

f16837

000a380008f868BCmloop,BNOV38

f86838

0006420000.sect“vectors”vectors

4300000044.word044h,088h43

004443

00882023/2/332DSP原理及應用第4章匯編語言程序開發工具4.3.3

鏈接器對段的處理

鏈接器是開發’C54x器件必不可少的開發工具之一,它對段處理時有2個主要任務:

將一個或多個COFF目標文件中的各種段作為鏈接器的輸入段,經鏈接后在一個執行的COFF輸出模塊中建立各個輸出段;

②在程序裝入時對其重新定位,為各個輸出段選定存儲器地址。

2023/2/333DSP原理及應用第4章匯編語言程序開發工具4.3.3

鏈接器對段的處理

鏈接器有2條偽指令支持上述任務:

MEMORY偽指令——用來定義目標系統的存儲器配置空間,包括對存儲器各部分命名,以及規定它們的起始地址和長度。

SECTIONS偽指令——用來指定鏈接器將輸入段組合成輸出段方式,以及輸出段在存儲器中的位置,也可用于指定子段。

若未使用偽指令,則鏈接器將使用目標處理器默認的方法將段放入存儲空間。

2023/2/334DSP原理及應用第4章匯編語言程序開發工具默認的存儲器分配:

①將所有.text段組合在一起,形成一個.text段,并分配到程序存儲器中;

②將多個目標文件中的.data段組合在一起,分配到緊接著.text段的程序存儲空間中;

③將.bss段組合,配置到數據存儲器中;

④組合命名段。初始化的命名段按順序分配到緊隨.data段的程序存儲器,而未初始化命名段將被配置到緊隨.bss段的數據存儲器中。

1.默認的存儲器分配2023/2/335DSP原理及應用第4章匯編語言程序開發工具默認的存儲器分配過程:File1.obj.text1.data1.bss1table_1(初始化的命名段)u_vars1(未初始化的命名段)File2.obj.text2.data2.bss2table_2(初始化的命名段)u_vars2(未初始化的命名段)FFT(初始化的命名段)程序存儲器數據存儲器.text.text1.text2.data.data1.data2.bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT沒有使用沒有配置沒有配置沒有使用2023/2/336DSP原理及應用第4章匯編語言程序開發工具4.3.3

鏈接器對段的處理2.段放入存儲器空間若不希望鏈接器將所有的.text段結合在一起形成單個的.text段,就不能采用默認的方式。由于DSP硬件系統中可能配置多種類型的存儲器,若要把某一段分配到特定類型的存儲器中,或將命名段配置特定的地址,則需采用MEMORY和SECTIONS偽指令來配置。

若不采用默認的方式,通常需要建立一個鏈接命令文件,在命令文件中用MEMORY和SECTIONS偽指令定義存儲器和配置段地址。

2023/2/337DSP原理及應用第4章匯編語言程序開發工具4.3.4

鏈接器對程序的重新定位1.

鏈接器重新定位匯編器對每個段匯編時都是從0地址開始,而所有需要重新定位的符號(標號)在段內都是相對于0地址的。事實上,所有段都不可能從存儲器中0地址單元開始,因此鏈接器必須對各個段進行重新定位。

重新定位的方法:

將各個段定位到存儲器圖中,使每個段有合適的起始地址。

調整符號值,使之對應于新的段地址。

調整對重新定位后符號的引用

2023/2/338DSP原理及應用第4章匯編語言程序開發工具1.

鏈接器重新定位匯編器在需要引用重新定位的符號處都留了一個重定位入口。鏈接器在對符號重新定位時,利用這些入口修正對符號的引用值。

【例4.3.2】一段采用助記符指令編寫的程序,經匯編后得列表文件如下:

1

.refX2

.refZ30000.text40000F073

BY

;產生一個重定位入口

00010006’50002F073

BZ

;產生一個重定位入口

00030000!60004F020

LD#X,A

;產生一個重定位入口

00050000!70006F7E0

Y:RESET

2023/2/339DSP原理及應用第4章匯編語言程序開發工具1.

鏈接器重新定位程序中有三個符號:

X、Z——是在另一個模塊中定義的;Y——在.text段中定義的。當程序匯編時,X、Z的值為0——未定義的外部符號

Y的值為6——相對于.text段地址0定義匯編器形成了兩個重定位入口:

X和Z:在.text段中為一次外部引用,用符號!表示;Y:是一次內部引用,用符號’表示。鏈接時,X重新定位在地址7100h

.text段起始地址重新定位在7200hY的重新定位值為7206h。2023/2/340DSP原理及應用第4章匯編語言程序開發工具1.

鏈接器重新定位

鏈接器利用兩個重定位入口,對目標文件中的兩次引用進行修正:變成

f073

7206’變成

f020

7100!

f073

BY

0006’

f020

LD#X,A

0000!

2023/2/341DSP原理及應用第4章匯編語言程序開發工具4.3.4

鏈接器對程序的重新定位2.

運行時間重新定位在實際運行中,有時需要將代碼裝入存儲器的一個地方,而在另一個地方運行。

如:一些關鍵的執行代碼必須裝在系統的ROM中,但運行時希望在較快的RAM中進行。

利用SECTIONS偽指令選項可讓鏈接器對其定位2次,其方法:

①使用裝入關鍵字設置裝入地址;

②使用運行關鍵字設置它的運行地址。2023/2/342DSP原理及應用第4章匯編語言程序開發工具4.3.5

程序裝入

鏈接器產生可執行的COFF目標文件。可執行的目標文件模塊與鏈接器輸入的目標文件具有相同的COFF格式。為了運行程序,在可執行模塊中的數據必須傳輸或裝入目標系統存儲器中。

可以采用以下方法裝入程序:

使用調試工具轉入程序’C54x的調試工具包括軟件模擬器,XDS仿真器和集成系統CCS。它們都具有內部的裝入器,調用裝入器的LOAD命令,裝入器將程序復制到目標系統的存儲器中。

采用Hex轉換工具轉入程序可以使用轉換工具Hex500,將可執行COFF目標模塊轉換成幾種其他目標格式文件,然后將轉換后的文件通過編程器將程序裝(燒)進EPROM。

2023/2/343DSP原理及應用第4章匯編語言程序開發工具4.3.6

COFF文件中的符號

COFF文件中有一個符號表,主要用來存儲程序中有關符號的信息。鏈接器在執行程序定位時,要使用符號表提供的信息,而調試工具也要使用該表來提供符號調試。

1.

外部符號

是指在一個模塊中定義、而在另一個模塊中引用的符號。它可以用偽指令.def、.ref或.global來定義。

●.def在當前模塊中定義,并可在別的模塊中使用的符號;

●.ref在當前模塊中使用,但在別的模塊中定義的符號;

●.global可以是上面的任何一種情況。

2023/2/344DSP原理及應用第4章匯編語言程序開發工具1.

外部符號【例4.3.3】說明代碼段中外部符號的定義。

x:ADD#56h,ABy.defx

.refy

;定義x

;引用y

;x在此模塊中定義,可為別

的模塊引用

;y在這里引用,它在別的模

塊中定義

2023/2/345DSP原理及應用第4章匯編語言程序開發工具4.3.6

COFF文件中的符號2.

符號表每當遇到一個外部符號,無論是定義的還是引用的,匯編器都將在符號表中產生一個條目。匯編器還產生一個指到每段的專門符號,鏈接器使用這些符號將其他引用符號重新定位。

2023/2/346DSP原理及應用第4章匯編語言程序開發工具4.5

鏈接器的使用鏈接器的主要任務是根據鏈接命令文件(.cmd),將一個或多個COFF目標文件鏈接起來,生成存儲器映像文件(.map)和可執行的輸出文件(.out)。

在鏈接過程中,鏈接器將各個目標文件合并,并完成以下工作:●

將各個段配置到目標系統的存儲器。

對各個符號和段進行重新定位,并給它們指定一個最終的地址。

解決輸入文件之間未定義的外部引用。2023/2/347DSP原理及應用第4章匯編語言程序開發工具4.5.2

鏈接器命令文件的編寫與使用鏈接命令文件用來為鏈接器提供鏈接信息,可將鏈接操作所需的信息放在一個文件中,這在多次使用同樣的鏈接信息時,可以方便地調用。

在鏈接命令文件中,可使用MEMORY和SECTIONS偽指令,為實際應用指定存儲器結構和地址的映射。

MEMORY——用來指定目標存儲器結構。

SECTIONS——用來控制段的構成與地址分配。

2023/2/348DSP原理及應用第4章匯編語言程序開發工具4.5.2

鏈接器命令文件的編寫與使用鏈接命令文件為ASCⅡ文件,可包含以下內容:

(1)

輸入文件名,用來指定目標文件、存檔庫或其他命令文件。

(2)

鏈接器選項,它們在命令文件中的使用方法與在命令行中相同。

(3)

MEMORY和SECTIONS鏈接偽指令,用來指定目標存儲器結構和地址分配。

(4)

賦值說明,用于給全局符號定義和賦值。2023/2/349DSP原理及應用第4章匯編語言程序開發工具例如:可根據給出鏈接命令,編寫完成該命令操作的鏈接器命令文件link.cmd。

lnk500a.objb.obj-mprog.map-oprog.out該命令是將兩個目標文件a.obj和b.obj進行鏈接,生成一個映像文件prog.map和一個可執行的輸出文件prog.out。鏈接命令文件的內容如下:

a.obj/*第一個輸入文件名*/b.obj/*第二個輸入文件名*/-mprog.map/*指定map文件的選項*/-oprog.out/*指定輸出文件的選項*/2023/2/350DSP原理及應用第4章匯編語言程序開發工具

【例4.5.1】鏈接器命令文件舉例。

a.objb.obj/*輸入文件名*/

-oprog.out/*指定輸出文件的選項*/-mprog.map/*指定map文件的選項*/

MEMORY/*MEMORY偽指令*/

{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*SECTIONS偽指令*/

{.text:>ROM.data:>ROM.bss:>RAM}

2023/2/351DSP原理及應用第4章匯編語言程序開發工具注意:在命令文件中,不能采用下列符號作為段名或符號名:

alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小寫L)NOLOADrangeUNION2023/2/352DSP原理及應用第4章匯編語言程序開發工具4.5.3MEMORY指令

MEMORY指令用來規定目標存儲器的結構。在實際的應用中,目標系統所配置的存儲器是各不相同的,通過MEMORY指令,可以進行各種各樣的存儲器配置。MEMORY指令的句法:

MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}

指令字存儲區間說明語句書寫方式:①已大寫MEMORY指令字開始;

②由大括號括起來的存儲器區間說明。存儲區間:存儲頁面區間名稱區間屬性起始地址區間長度2023/2/353DSP原理及應用第4章匯編語言程序開發工具4.5.3MEMORY指令存儲區間說明語句:

PAGE:

指定存儲器空間頁面,最多為255頁,取決于目標存儲器的配置。

每一個PAGE代表一個完全獨立的地址空間。

通常,PAGE0用于程序存儲器;

PAGE1用于數據存儲器。

若沒有規定PAGE,則鏈接器默認為PAGE0。2023/2/354DSP原理及應用第4章匯編語言程序開發工具4.5.3MEMORY指令存儲區間說明語句:

name:

存儲器區間名稱。可由用字母、$、.、_等組成。

存儲器區間為內部記號,因此不需要保留在輸出文件或者符號表中。

不同PAGE上的存儲器區間可以取相同的名字,但在同一PAGE內的名字不能相同,且不許重疊配置。

2023/2/355DSP原理及應用第4章匯編語言程序開發工具4.5.3MEMORY指令存儲區間說明語句:

attr:

為任選項,用來為命名的存儲器區間規

定1~4個屬性。

當對輸出段定位時,可利用屬性限制輸出段分配到一定的存儲區間。

屬性選項共有4項:

R

規定可以對存儲器執行讀操作。

W規定可以對存儲器執行寫操作。

X

規定存儲器可以裝入可執行的程序代碼。I規定可以對存儲器進行初始化。

若未選屬性,可將輸出段不受限制地定位到任何一個存儲器的位置。任何一個沒有規定屬性的存儲器(包括所有默認方式的存儲器)都有全部4項屬性。

2023/2/356DSP原理及應用第4章匯編語言程序開發工具4.5.3MEMORY指令存儲區間說明語句:

origin:用來指定存儲區間的起始地址,可簡寫為org或o。其值以字為單位,可以用十進制、八進制或十六進制數表示。

Length:

用來指定存儲器空間的長度,可簡寫為len或l,其值以字為單位,可以用十進制、八進制或十六進制數表示。2023/2/357DSP原理及應用第4章匯編語言程序開發工具【例4.5.2】用MEMORY偽指令編寫連接命令文件。要求:

程序存儲器:4K字ROM,起始地址為C00h,取名為ROM。

數據存儲器:32字RAM,起始地址為60h,取名為SCR。

512字RAM,起始地址為80h,取名為CHIP。file1.objfiel2.obj-oProg.outMEMORY{

PAGE0:

ROM:origin=C00h,length=1000h

PAGE1:

SCR:origin=60h,length=20h

CHIP:origin=80h,length=200h}

兩個輸入文件鏈接命令選項指令字頁面名稱區間名稱起始地址區間長度2023/2/358DSP原理及應用第4章匯編語言程序開發工具【例4.5.2】用MEMORY偽指令編寫連接命令文件。file1.objfiel2.obj-oProg.outMEMORY{ PAGE0:

ROM:org=C00h,len=1000hPAGE1:

SCR:org=60h,len=20h

CHIP:org=80h,len=200h}

PAGE0:ROM:org=C00h,len=1000h程序存儲器00000h0FFFFh00C00h1000h01C00hROMPAGE1:

SCR:org=60h,len=20h數據存儲器00000h0FFFFh00060h0007Fh20hSCR

CHIP:org=80h,len=200h00080h200h0027FhCHIP2023/2/359DSP原理及應用第4章匯編語言程序開發工具4.5.4

SECTIONS指令用來控制段的構成與地址分配。指令功能:

①說明如何將輸入段組合成輸出段;

在可執行程序中定義輸出段;③

規定輸出段在存儲器中的存放位置;④

允許重新命名輸出段。1.

SECTIONS指令語法

2023/2/360DSP原理及應用第4章匯編語言程序開發工具SECTIONS指令的句法:

SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}

指令字輸出段說明語句

段名:定義輸出段的名稱。

屬性:定義該段的內容和存儲器的分配。段名1.

SECTIONS指令語法屬性屬性屬性2023/2/361DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法段屬性用來定義輸出段的內容和存儲地址的分配。包括的內容如下:①裝入存儲器分配

②運行存儲器分配③輸入段④

段的類型⑤充填值2023/2/362DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法①裝入存儲器分配

用于定義段裝入時的存儲器地址。語法格式:load=allocation

或allocation

或>allocation

allocation:關于段地址的說明,即給段分配存儲單元。

2023/2/363DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法①裝入存儲器分配例如:

.text:load=0x1000

.text:load>ROM.bss:load>(RW).text:align=0x80.text:PAGE0.bss:load=block(0x80)

將.text段定位到一個特定的地址。

將.text段定位到命名為ROM的存儲區。

將.bss段定位到屬性為R、W的存儲區。

將.text段定位到從地址0x80開始。

將.text段定位到PAGE0。

將.bss段定位到一個n字存儲器塊

的任何一個位置(n為2的冪次)。

2023/2/364DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法①裝入存儲器分配

若用到一個以上參數,可以將它們排成一行。

例如:

.text:>ROM(align(16)PAGE(2))。

2023/2/365DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法②運行存儲器分配

用于定義段運行時的存儲器地址。語法格式:run=allocation

run>allocation

2023/2/366DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法鏈接器為段在目標存儲器中分配兩個地址:

加載的地址——由裝入存儲器分配完成

執行程序的地址——由運行存儲器分配完成

通常,這兩個地址是相同的。

若要想把程序的加載區分開,先將程序加載到ROM,然后在RAM中運行,則用SECTIONS命令讓鏈接器對這個段定位兩次即可。

例如:

.fir:load=ROM,run=RAM

2023/2/367DSP原理及應用第4章匯編語言程序開發工具1.

SECTIONS指令語法③輸入段用于定義組成輸出段的輸入段。語法格式:{input_sections}

大多數情況下,在SECTIONS命令中是不列出每個輸入文件的輸入段的段名。

例如:

SECTIONS{.text:.data:.bss

}鏈接時:在輸入文件中的所有.text段鏈接成.text輸出段所有.data段鏈接成.data輸出段所有.bss段鏈接成.bss輸出段2023/2/368DSP原理及應用第4章匯編語言程序開發工具4.5.5

SECTIONS指令2.

SECTIONS指令的使用

【例4.5.3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:load=RAM.vec:load=FF80h{t1.obj(.int1)t2.obj(.int2)endvec=.;}.data:align=16}兩個輸入文件鏈接命令選項指令字輸出段說明語句2023/2/369DSP原理及應用第4章匯編語言程序開發工具2.

SECTIONS指令的使用

【例4.5.3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:load=RAM.vec:load=FF80h{t1.obj(.int1)t2.obj(.int2)endvec=.;}.data:align=16}輸出段加載地址運行地址.textROMRAM800h.conROM.bssRAM.vecROMFF80.dataRAM16位邊界2023/2/370DSP原理及應用第4章匯編語言程序開發工具2.

SECTIONS指令的使用

【例4.5.3】SECTIONS指令的使用。

file1.objfile2.obj-oProg.outSECTIONS{.text:load=ROM,run=800h.con:load=ROM.bss:load=RAM.vec:load=FF80h{t1.obj(.int1)t2.obj(.int2)endvec=.;}.data:align=16}輸出段加載地址運行地址.textROMRAM800h.conROM.bssRAM.vecROMFF80.dataRAM16位邊界

ROM

RAM00h.text.con.bss.vec.dataFF80h運行時800h.text.text.text2023/2/371DSP原理及應用第4章匯編語言程序開發工具4.5.5

SECTIONS指令3.

MEMORY和SECTIONS命令的默認使用

如果沒有利用MEMORY和SECTIONS命令,鏈接器就按默認算法來定位輸出段。

將所有的.text輸入段鏈接成一個.text輸出段,并配置到PAGE

0上的存儲器;

將所有的.data輸入段組合成.data輸出段,定位到PAGE

0上的存儲器;

2023/2/372DSP原理及應用第4章匯編語言程序開發工具3.

MEMORY和SECTIONS命令的默認使用

所有的.bss輸入段則組合成一個.bss輸出段,并由鏈接器定位到配置為PAGE1上的存儲器。

如果輸入文件中包含有已初始化的命名段,則鏈接器將它們定位到程序存儲器,緊隨.data段之后。

如果輸入文件中包括有未初始化的命名段,則鏈接器將它們定位到數據存儲器,并緊隨.bss段之后。

2023/2/373DSP原理及應用第4章匯編語言程序開發工具3.

MEMORY和SECTIONS命令的默認使用

MEMORY{PAGE0:PROG:origin=0x0080,length=0xFF00PAGE1:DATA:origin=0x0080,length=0xFF80}

SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1}2023/2/374DSP原理及應用第4章匯編語言程序開發工具4.5.6

多個文件的鏈接實例

下面以example.asm源程序為例,將復位向量列為一個單獨的文件,對兩個目標文件進行鏈接。(1)編寫復位向量文件

vectors.asm文件清單:

.title“vectors.asm”.refstart.sect“.vectors”Bstart.end

2023/2/375DSP原理及應用第4章匯編語言程序開發工具4.5.6

多個文件的鏈接實例(2)

編寫源程序文件清單:

.title“example.asm”.mmregsstack.usect“STACK”,10h;為堆棧指定空間.bssa,4;為變量分配9個字的空間.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4;變量初始化.word8,6,4,2.text2023/2/376DSP原理及應用第4章匯編語言程序開發工具(2)

編寫源程序文件清單:

start:STM#

0,SWWSR;插入0個等待狀態

STM#

STACK+10h,SP;設置堆棧指針

STM#

a,AR1;AR1指向aRPT#

7;移動8個數據

MVPDtable,*AR1+;從程序存儲器到數據存儲器

CALLSUM;調用SUM子程序

end:BendSUM:STM#

a,AR3;子程序執行

STM#

x,AR4RPTZA,#

3MAC*AR3+,*AR4+,ASTLA,@

yRET.end2023/2/377DSP原理及應用第4章匯編語言程序開發工具(3)對源文件匯編(4)編寫鏈接命令文件

編寫的命令文件用來鏈接兩個目標文件(輸入文件),生成一個映像文件example.map和一個可執行的輸出文件example.out。標號start是程序的入口。

假設目標存儲器的配置如下:

程序存儲器

EPROME000h~FFFFh(片外)

數據存儲器

SPRAM0060h~007Fh(片內)

DARAM0080h~017Fh(片內)

由匯編器分別對兩個源文件進行匯編,生成目標文件example.obj和vectors.obj。

2023/2/378DSP原理及應用第4章匯編語言程序開發工具(4)編寫鏈接命令文件

命令文件清單:

vectors.objexample.obj-oexample.out-mexample.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100hVECS:org=0FF80h,len=04hPAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}

溫馨提示

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

評論

0/150

提交評論