第七章-偽指令和宏語言_第1頁
第七章-偽指令和宏語言_第2頁
第七章-偽指令和宏語言_第3頁
第七章-偽指令和宏語言_第4頁
第七章-偽指令和宏語言_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

偽指令和宏語言●

信息工程學(xué)院

●17.1、偽指令7.2、宏語言7.3、通用目標(biāo)文件格式7.4、命令文件程序舉例偽指令和宏語言2偽指令

TMS320C2000/C5X的匯編偽指令可以實(shí)現(xiàn)以下功能:▲

匯編代碼和數(shù)據(jù)到指定的段;▲

為未定義的變量保存空間;▲

控制列表文件;▲

分配存儲器;▲

匯編條件塊;▲

定義全局變量;▲

指定匯編器能得到的宏;▲

檢查符號調(diào)試信息。37.1偽指令——分為8類:

段定義偽指令:把匯編語句程序的各部分與適當(dāng)?shù)亩温?lián)系起來。

.bes,

.bss,.data,.text,.sect,.usect,.sblock?!跏蓟?shù)偽指令:為當(dāng)前段匯編數(shù)值。

.space,.byte,.field,.float,.xfloat,.int,.word,.long,.xlong,.pstring,string?!纬绦蛴嫈?shù)器排列偽指令:使段程序計數(shù)器SPC指向預(yù)定的位置。align,.even。

▲輸出列表格式偽指令:控制列表文件的格式。.drlist,.drnolist,.fclist,.fcnolist,.length,.width,.list,.nolist,.mlist,.mnolist,.option,.page,.sslist,.ssnolist,.tab,.title。▲引用其他文件偽指令:為文件提供信息或提供這些文件的信息。..copy,.include,.global,.def,.ref,.mlib?!鴹l件匯編偽指令:使匯編器根據(jù)表達(dá)式求值結(jié)果的真或假來匯編代碼的某些段。

.if,.elseif,.else,.endif,.loop,.break,.endloop?!鴧R編時的符號偽指令:使定義的符號名等同于常數(shù)值或字符串。

.asg,.eval,.set,.equ,.struct,.endstruct,.label

。

匯編模式偽指令:定義在C28x或認(rèn)可C2xLP模式。.c28_amode,.lp_amode?!渌麄沃噶睿壕哂衅渌δ芎吞匦缘膫沃噶睢?end,.mmregs,.newblock,.port,.sblock,.version,.emsg,.wmsg。47.2宏指令▲

將頻繁出現(xiàn)的程序段定義為宏指令,▲

當(dāng)程序中需要執(zhí)行該程序段時,只需用一條宏調(diào)用語句?!?/p>

縮短源程序的長度,使源程序易讀,減少了書寫錯誤。使用宏的過程要經(jīng)過以下3個步驟:1)定義宏:用戶在使用宏之前必須先定義宏。在程序的任何地方都可以定義一個宏??稍谠次募_始處或者在.include/.copy文件中或者在宏庫中定義。格式:

宏名.macro[形式參數(shù)1][,形式參數(shù)2]…[,形式參數(shù)n]

}宏體

[.mexit]

.endm5宏名——用通常規(guī)定的字符串格式書寫。.mexit

——相當(dāng)于“goto.endm”,用于條件判斷后的轉(zhuǎn)移,可缺省。形式參數(shù)——或稱為替代符號。同樣按通常規(guī)定的字符串格式書寫。替代符號作為宏參數(shù)僅在被定義的宏中有效。▲

每個宏最多可以用32個宏參數(shù)?!?/p>

宏可以嵌套,但宏的所有元素都應(yīng)在同一個文件中定義。7.2宏指令(2)調(diào)用宏:在定義了宏以后,就可以在源程序中將宏的名字作為操作碼來調(diào)用。

格式:

宏名[實(shí)參數(shù)1][,實(shí)參數(shù)2]…[,實(shí)參數(shù)n]6,7.2宏指令(3)展開宏:匯編器在對源文件進(jìn)行匯編時,對調(diào)用的宏進(jìn)行展開。在展開過程中,匯編器用宏體取代宏調(diào)用語句,宏體中的形式參數(shù)實(shí)際參數(shù)代替。

①如果某個形式參數(shù)沒有對應(yīng)的實(shí)參數(shù)為其賦值,該形式參數(shù)將被空串(“”)代替。②如果實(shí)參數(shù)的個數(shù)多于形式參數(shù),則余下的實(shí)參數(shù)將賦給最后一個形式參數(shù)(用逗號隔開)。③如果要把一串變量賦給一個形式參數(shù),或者把一個逗號(或分號)傳給一個形式參數(shù),就必須用引號將它們引起來。④匯編時,匯編器先用實(shí)參數(shù)代替形式參數(shù)并展開宏,然后把源語句匯編為目標(biāo)代碼,并輸出到列表文件中。7,7.2宏指令例6.23

宏定義:

parms .macrox,y,z a=x b=y c=z .endm調(diào)用宏:

匯編時展開宏:

parms 100,200

;a=100

;b=200

;c=“”

parms

“100,200,300”,55,66,77

;a=“100,200,300”

;b=55

;c=66,778

.C

——C源文件

.ASM

——匯編文件

.CMD

——命令文件.H

——頭文件.PRJ

——工程文件

.LST——列表文件

.MAP——映射文件

.OBJ——目標(biāo)文件

.OUT——可執(zhí)行文件

7.3通用目標(biāo)文件格式通用目標(biāo)文件格式允許用戶編寫匯編語言程序時使用代碼塊和數(shù)據(jù)塊,這些塊被稱為段。用匯編器可以將匯編語言源程序匯編為目標(biāo)文件,用連接器將若干個目標(biāo)文件連接成一個可被DSP芯片執(zhí)行的可執(zhí)行文件。這些目標(biāo)文件的格式稱為通用目標(biāo)文件格式(COFF,CommonObjectFileFormat)。DSP系統(tǒng)中常用的文件后綴9

COFF目標(biāo)文件總是包括3個默認(rèn)的段:

▲文本段:用.text定義,通常包括可執(zhí)行代碼。

數(shù)據(jù)段:用.data定義,通常包括已初始化的數(shù)據(jù)。

預(yù)留段:用.bss定義,通常保留用于未初始化變量的空間。用.usect,.sect或.asect偽指令可創(chuàng)建命名段。這些命名段可以像.text,.data一樣被使用。

COFF有兩種基本類型的段:①已初始化的段——包含數(shù)據(jù)或代碼。用.text和.data偽指令定義的段和用.sect或.asect偽指令創(chuàng)建的命名段均為已初始化的段。②未初始化的段——在內(nèi)存映射中為未初始化數(shù)據(jù)保留空間。.bss段和用.usect偽指令創(chuàng)建的命名段是未初始化的段,在目標(biāo)文件中這些段沒有實(shí)際內(nèi)容。段7.3通用目標(biāo)文件格式目標(biāo)文件的最小單位被稱為段,它是在存儲器中占有連續(xù)空間的代碼塊或數(shù)據(jù)塊。107.3通用目標(biāo)文件格式▲

匯編器在匯編過程中建立這些段,連接器把段重定位到目標(biāo)存儲器中▲

所有的段都是獨(dú)立的、可定位的▲

相同的段將按先后次序定位在連續(xù)的區(qū)域內(nèi)▲

未初始化段被定位到RAM內(nèi);初始化段可單獨(dú)定位在RAM或ROM內(nèi),并且在連接時還可引用其他段內(nèi)定義的符號匯編器為每個段設(shè)置了一個獨(dú)立的程序計數(shù)器,這些計數(shù)器稱為段程序計數(shù)器(SPC,SectionProgramCounters)??梢杂枚纬绦蛴嫈?shù)器排列偽指令.align或.even,強(qiáng)迫SPC指向預(yù)定的位置。段段程序計數(shù)器117.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲連接器通過連接COFF目標(biāo)文件建立可執(zhí)行文件,▲目標(biāo)文件中的段是連接時的重要依據(jù)?!B接器可把段定位到用戶系統(tǒng)已配置的存儲器中?!B接器命令文件(.cmd)則給出連接器在連接時的有關(guān)信息▲

DSP芯片的存儲器配置隨應(yīng)用的不同而不同. 用連接器偽指令

MEMORY(存儲器偽指令)可以確定目標(biāo)系統(tǒng)的各種內(nèi)存配置?!?dāng)MEMORY決定了存儲器模式后,可以用連接器偽指令SECTIONS

(段偽指令)確定連接器組合輸入段的方法和輸出段在存儲器中的位置?!绻皇褂眠@兩條偽指令,連接器則用默認(rèn)存儲器的定位方式來組合段,并把它們定位到存儲器中。127.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令連接器命令文件.cmd連接器命令文件允許用戶把連接信息放置在文件中。命令文件是ASCII文件,可以包含下列各項中的某一項:▲輸入文件名。該輸入文件可以是目標(biāo)文件、歸檔庫或其他命令文件?!B接器選項。在命令文件中可以用命令行上的連接器選項。▲MEMORY和SECTIONS連接器偽指令。▲注釋。用戶可以使用/*和*/定界符把注釋加到命令文件中。▲賦值語句。該語句定義并賦值給全局符號。137.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令連接時給符號賦值▲賦值語句的語法:連接器中賦值語句的語法類似于C語言中賦值語句語法。符號=表達(dá)式 ;把表達(dá)式的值賦予符號符號+=表達(dá)式 ;把表達(dá)式的值加到符號上符號-=表達(dá)式 ;從符號減去表達(dá)式的值符號*=表達(dá)式 ;符號乘以表達(dá)式符號/=表達(dá)式 ;符號除以表達(dá)式

▲把SPC賦予符號“.”:“.”表示定位期間SPC的當(dāng)前值?!?”符號僅可用在SECTIONS偽指令內(nèi)的賦值語句中,用來表示段的當(dāng)前運(yùn)行地址。147.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲賦值表達(dá)式:連接器表達(dá)式必須遵循以下規(guī)則:√

表達(dá)式可包含全局符號、常數(shù),以及表8-3-1所列的C語言運(yùn)算符?!?/p>

所有數(shù)被當(dāng)做長整數(shù)(32位)處理?!?/p>

連接器用和匯編器相同的方式識別常數(shù)。見表8-3-2.√表達(dá)式中的符號只具有符號的地址值,不進(jìn)行類型檢查?!?/p>

連接器表達(dá)式可以是絕對的或可重定位的。157.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲MEMORY偽指令——確定在目標(biāo)系統(tǒng)中具有物理位置且可被程序使用的存儲器范圍。MEMORY偽指令的一般語句形式為:MEMORY{PAGE0:存儲器名1[(屬性)]:ORIGIN=常數(shù),LENGTH=常數(shù)

PAGEn:存儲器名n[(屬性)]:ORIGIN=常數(shù),LENGTH=常數(shù)

}167.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令PAGE:

√定義一個存儲器空間,用戶可以定義多達(dá)255頁?!?/p>

PAGE0定義程序存儲器,PAGE1定義數(shù)據(jù)存儲器,PAGE2定義I/O空間?!倘绻脩魶]有使用PAGE選項,那么連接器把段定位到PAGE0?!堂總€PAGE代表一個完全獨(dú)立的地址空間?!淘赑AGE0上已配置的存儲器可以和在PAGE1上已配置的存儲器重疊。存儲器名:√命名存儲器范圍。由1~8個字符組成?!堂謱τ谶B接器沒有特殊的意義,僅指明存儲器的區(qū)域?!淘诓煌撋洗鎯ζ鞣秶梢杂邢嗤拿?,√在同一頁,所有的存儲器范圍不能有相同的名字,且不能重疊。177.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令屬性:可選項,當(dāng)被使用時,必須用括號括起來。屬性把輸出段的定位限制在某些存儲器范圍內(nèi)。如果用戶不使用任何屬性,則輸出段即可以定位到任何范圍內(nèi)。有效的屬性包括:R——存儲器可讀;W——存儲器可寫;X——儲器可以包含可執(zhí)行代碼;I——存儲器可被初始化。ORIGIN:指定存儲器的起始地址,也可以寫成org或o。這個值是以字節(jié)規(guī)定的16位常數(shù),也可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制。

LENGTH:指定存儲器的長度,也可以寫成len或l。數(shù)值的表示與origin相同▲

當(dāng)用戶使用MEMORY偽指令時,要確信已指定了所有可用于裝載代碼的存儲器范圍?!?/p>

連接器不把程序放到未配置的存儲器中。注意:187.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令例6.24

MEMORY指令舉例

/*SampleCommandfilewithMEMORYdirective*/file1.objfile2.obj-oprog.out

MEMORY{PAGE0:ROM:ORIGIN=0C00h,LENGTH=1000hPAGE1:SCRATCH:ORIGIN=60h,LENGTH=20hRAM:ORIGIN=200h,LENGTH=200h}該例定義了一個存儲器系統(tǒng):具有程序存儲器中地址為0C00h,長度為4K字的ROM;數(shù)據(jù)存儲器中地址為60h,長度為32字的RAM;數(shù)據(jù)存儲器中地址為200h,長度為512字的RAM。197.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

SECTIONS偽指令

——

描述輸入段怎樣被組合到輸出段內(nèi);定義在執(zhí)行程序中的輸出段;規(guī)定輸出段在存儲器中的位置;允許重新命名輸出段。SECTIONS偽指令的一般語法形式是:SECTIONS{

段名1:[特性1,特性2,……]

段名2:[特性1,特性2,……]……………}指令中的每一行從段名開始定義輸出段,輸出段是輸出文件內(nèi)的段。在段名之后是特性列表(以逗號隔開),定義段的內(nèi)容以及它是怎樣被分配的。207.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令特性列表的選項(段所具備的特性)有以下幾種?!?/p>

裝載地址:規(guī)定段將被裝載在存儲器中的位置。

語法:load=allocation或allocation或{}>allocationallocation是MEMORY偽指令所定義的范圍內(nèi)地址?!?/p>

運(yùn)行地址:定義段在存儲器內(nèi)運(yùn)行的位置。

語法:run=allocation或 run>allocation

如果在一個段中l(wèi)oad和run的地址相同,run可以省略。連接器為每個輸出段分配兩個目標(biāo)存儲器地址:裝載地址和運(yùn)行地址。通常這兩個地址是相同的。但有時用戶可能把代碼裝入存儲器的一個區(qū)域卻在另一個區(qū)域運(yùn)行它。例如在引導(dǎo)加載程序,用load設(shè)置它的裝載地址,用run設(shè)置它的運(yùn)行地址。217.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

調(diào)準(zhǔn)地址:規(guī)定段應(yīng)在地址邊界上開始。調(diào)準(zhǔn)可以使連接器把輸出段放在位于n字邊界的地址,其中n是2的冪。

語法:align=n或 align=(n)

如.textalign=128,即將.text段定位于頁邊界?!?/p>

塊地址:規(guī)定段必須裝在兩個地址邊界之間,它把段定位在大小為n的塊內(nèi)任何地方,如果段大于塊,那么段將從該邊界開始。和調(diào)準(zhǔn)一樣,n必須是2的冪。

語法:block=n或block(n)

.bssload=block(0x80)。定位.bss段使其包含在單個128字的頁內(nèi)或者從新頁開始。用戶可以單獨(dú)使用調(diào)準(zhǔn)或塊,也可以和裝入地址、運(yùn)行地址結(jié)合在一起使用,但是調(diào)準(zhǔn)和塊不能一起使用。227.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

輸入段:定義組成輸出段的輸入段。

語法:{input_sections}

輸入文件中的段組合起來形成輸出段,連接器按照所列出的輸入段的次序連接并組合它們。輸出段的大小是組成它的輸入段的大小之和。通用類型的段的規(guī)格說明中沒有輸入段。如:SECTIONS{.text:.data:.bss:}

此時連接器從輸入文件取出所有.text段并把它們組合到.text輸出段內(nèi)。連接器按照它在輸入文件中遇到的次序連接.text輸入段,對.data和.bss段的操作與.text相同。用戶也可以明確規(guī)定組成輸出段的輸入段,每個輸入段用它的文件名和段名來標(biāo)志。237.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令例6.25

SECTIONS{.text {f1.obj(.text) f2.obj(sec1) f3.obj f3.obj(.text,sec2)}

}

輸入段不必相互同名也不必和輸出段同名。如果列舉輸入文件時不帶段,那么它所有的段將被包含在輸出段之內(nèi)。247.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令

段類型:定義特殊段類型的標(biāo)志。語法:type=COPY

type=DSECT

或type=NOLOAD

用戶可以把這3種特殊的類型賦予輸出段。用COPY和DSECT創(chuàng)建的段是一個虛段,它不包括在輸出段存儲器分配內(nèi),也不占據(jù)存儲器空間,不包括在存儲器映象列表中。但在虛段中定義的全局符號可以被其他輸入段引用,COPY段可以將段的內(nèi)容、重定位信息及行號信息放在輸出模塊中,而DSECT段則不放置。NOLOAD創(chuàng)建的段不將段的內(nèi)容、重定位信息及行號信息放在輸出模塊中,但連接器為其分配空間并包括在存儲器映象列表中。257.3通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

填充值:定義用于填充初始化空位的數(shù)值。

語法:file=value

name:…{…}=value

當(dāng)初始化輸出段內(nèi)有空位存在時,連接器必須提供原始數(shù)據(jù)以填充它。連接器用16位數(shù)值填充空位,該數(shù)值在存儲器內(nèi)復(fù)制直至它填滿空位為止。267.4通用目標(biāo)文件格式連接器命令文件和連接器偽指令例6.26

SETIONS偽指令的使用file1.objfile2.obj -oprog.out

SECTIONS{.text:load=ROM run=0800h.const:load=ROM.bss:load=RAMvectors:load=0FF80h {t1.obj(.intvec1) t2.obj(.intvec2)

endvec=. }.data:align=16}277.4通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

連接器舉例

例6.27是一個名為demo.cmd的連接器命令文件,它連接了3個目標(biāo)文件:demo.obj,fft.obj和tables.obj,并創(chuàng)建了一個名為demo.out的可執(zhí)行程序。假設(shè)目標(biāo)存儲器具有下列配置。程序存儲器:

地址范圍

內(nèi)容0xF0000~0x3FFFBF片內(nèi)ROM0x3FFFC0~0x3FFFFF中斷向量表數(shù)據(jù)存儲器:

地址范圍

內(nèi)容0x000040~0x0001FF 堆棧0x000200~0x0007FF RAM_10x3ED000~0x3EFFFF RAM_228例6.27

命令文件exmp.cmd

/** 定義連接器選項 **/-e SETUP/*定義程序入口 */-o demo.out

/*命名輸出文件*/-m demo.map

/*創(chuàng)建一個輸出列表文件*/

/** 定義輸入文件 **/demo.obj

/*連接三個目標(biāo)文件*/fft.objtables.obj/** 定義存儲器配置 **/MEMORY{PAGE0:ROM(R):ORIGIN=3F0000h,LENGTH=0FFC0hVECTORS(R):ORIGIN=3FFFC0h,LENGTH=0040hPAGE1:STACK(RW):ORIGIN=000040h,LENGTH=01C0hRAM_2(RW)

:ORIGIN=000200h,LENGTH=0600hRAM_1(RW)

:ORIGIN=3ED000h,LENGTH=3000h}

29SECTIONS{vectors:{}>VECTORS,PAGE=0 .text:load=ROM,PAGE=0 .data:file=07A1Ch,load=RAM_1,PAGE=1

{tables.obj(.data)

fft.obj(.data)+=100h;/*創(chuàng)建一個長度為100的空間,用07A1Ch填充*/

}

var_defs:{}>RAM_2page=1/*包含在dmo.obj文件中var_defs段的變量連接到數(shù)據(jù)塊RAM_2中*/

.bss:{}>RAM_1,page=1,fill=0FFFFh/*.bss的填充和鏈接*/

}7.4通用目標(biāo)文件格式連接器命令文件和連接器偽指令307.4通用目標(biāo)文件格式連接器命令文件和連接器偽指令▲

TMS320C228x器件的默認(rèn)定位MEMORY{PAGE0:PROG:ORIGIN=0x000040H,LENGTH=0x3FFFC0HPAGE1:DATA:ORIGIN=0x000000H,LENGTH=0x010000HPAGE1:DATA1:ORIGIN=0x010000H,LENGTH=0x3F0000H}

SECTIONS{.text:PAGE=0 .data:PAGE=0.cinit:PAGE=0/*僅在C程序中使用*/ .bss:PAGE=1 }用戶沒有使用MEMORY和SECTIONS的情況下,存儲器使用該默認(rèn)定位317.4程序舉例▲

公用文件程序設(shè)計時,需在多個模塊中使用相同設(shè)置和中斷處理:

將芯片中映射至I/O空間的寄存器地址及標(biāo)號、預(yù)置變量和常數(shù)的空間等設(shè)置語句集中在一個文件中,稱為I/O寄存器頭文件(如init.h);

將轉(zhuǎn)移中斷矢量地址的指令集中在一個文件中,稱為中斷矢量頭文件(如vector.h);

將定義程序、數(shù)據(jù)和I/O空間地址塊大小和位置的偽指令集中在一個文件中,稱為命令文件(如F206.cmd)。

這3個文件稱為公用文件。

32

用.copy或.include偽指令將I/O寄存器頭文件和中斷矢量頭文件復(fù)制到該應(yīng)用程序中,形成一個匯編源程序(如

delay.asm)

由匯編器進(jìn)行匯編后生成一個目標(biāo)文件(如delay.obj

溫馨提示

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

評論

0/150

提交評論