




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
偽指令和宏語言●
信息工程學院
●17.1、偽指令7.2、宏語言7.3、通用目標文件格式7.4、命令文件程序舉例偽指令和宏語言2偽指令
TMS320C2000/C5X的匯編偽指令可以實現(xiàn)以下功能:▲
匯編代碼和數(shù)據(jù)到指定的段;▲
為未定義的變量保存空間;▲
控制列表文件;▲
分配存儲器;▲
匯編條件塊;▲
定義全局變量;▲
指定匯編器能得到的宏;▲
檢查符號調試信息。37.1偽指令——分為8類:
▲
段定義偽指令:把匯編語句程序的各部分與適當?shù)亩温?lián)系起來。
.bes,
.bss,.data,.text,.sect,.usect,.sblock。▲初始化常數(shù)偽指令:為當前段匯編數(shù)值。
.space,.byte,.field,.float,.xfloat,.int,.word,.long,.xlong,.pstring,string。▲段程序計數(shù)器排列偽指令:使段程序計數(shù)器SPC指向預定的位置。align,.even。
▲輸出列表格式偽指令:控制列表文件的格式。.drlist,.drnolist,.fclist,.fcnolist,.length,.width,.list,.nolist,.mlist,.mnolist,.option,.page,.sslist,.ssnolist,.tab,.title。▲引用其他文件偽指令:為文件提供信息或提供這些文件的信息。..copy,.include,.global,.def,.ref,.mlib。▲條件匯編偽指令:使匯編器根據(jù)表達式求值結果的真或假來匯編代碼的某些段。
.if,.elseif,.else,.endif,.loop,.break,.endloop。▲匯編時的符號偽指令:使定義的符號名等同于常數(shù)值或字符串。
.asg,.eval,.set,.equ,.struct,.endstruct,.label
。
▲
匯編模式偽指令:定義在C28x或認可C2xLP模式。.c28_amode,.lp_amode。▲其他偽指令:具有其他功能和特性的偽指令。.end,.mmregs,.newblock,.port,.sblock,.version,.emsg,.wmsg。47.2宏指令▲
將頻繁出現(xiàn)的程序段定義為宏指令,▲
當程序中需要執(zhí)行該程序段時,只需用一條宏調用語句。▲
縮短源程序的長度,使源程序易讀,減少了書寫錯誤。使用宏的過程要經(jīng)過以下3個步驟:1)定義宏:用戶在使用宏之前必須先定義宏。在程序的任何地方都可以定義一個宏。可在源文件開始處或者在.include/.copy文件中或者在宏庫中定義。格式:
宏名.macro[形式參數(shù)1][,形式參數(shù)2]…[,形式參數(shù)n]
}宏體
[.mexit]
.endm5宏名——用通常規(guī)定的字符串格式書寫。.mexit
——相當于“goto.endm”,用于條件判斷后的轉移,可缺省。形式參數(shù)——或稱為替代符號。同樣按通常規(guī)定的字符串格式書寫。替代符號作為宏參數(shù)僅在被定義的宏中有效。▲
每個宏最多可以用32個宏參數(shù)。▲
宏可以嵌套,但宏的所有元素都應在同一個文件中定義。7.2宏指令(2)調用宏:在定義了宏以后,就可以在源程序中將宏的名字作為操作碼來調用。
格式:
宏名[實參數(shù)1][,實參數(shù)2]…[,實參數(shù)n]6,7.2宏指令(3)展開宏:匯編器在對源文件進行匯編時,對調用的宏進行展開。在展開過程中,匯編器用宏體取代宏調用語句,宏體中的形式參數(shù)實際參數(shù)代替。
①如果某個形式參數(shù)沒有對應的實參數(shù)為其賦值,該形式參數(shù)將被空串(“”)代替。②如果實參數(shù)的個數(shù)多于形式參數(shù),則余下的實參數(shù)將賦給最后一個形式參數(shù)(用逗號隔開)。③如果要把一串變量賦給一個形式參數(shù),或者把一個逗號(或分號)傳給一個形式參數(shù),就必須用引號將它們引起來。④匯編時,匯編器先用實參數(shù)代替形式參數(shù)并展開宏,然后把源語句匯編為目標代碼,并輸出到列表文件中。7,7.2宏指令例6.23
宏定義:
parms .macrox,y,z a=x b=y c=z .endm調用宏:
匯編時展開宏:
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——目標文件
.OUT——可執(zhí)行文件
7.3通用目標文件格式通用目標文件格式允許用戶編寫匯編語言程序時使用代碼塊和數(shù)據(jù)塊,這些塊被稱為段。用匯編器可以將匯編語言源程序匯編為目標文件,用連接器將若干個目標文件連接成一個可被DSP芯片執(zhí)行的可執(zhí)行文件。這些目標文件的格式稱為通用目標文件格式(COFF,CommonObjectFileFormat)。DSP系統(tǒng)中常用的文件后綴9
COFF目標文件總是包括3個默認的段:
▲文本段:用.text定義,通常包括可執(zhí)行代碼。
▲
數(shù)據(jù)段:用.data定義,通常包括已初始化的數(shù)據(jù)。
▲
預留段:用.bss定義,通常保留用于未初始化變量的空間。用.usect,.sect或.asect偽指令可創(chuàng)建命名段。這些命名段可以像.text,.data一樣被使用。
COFF有兩種基本類型的段:①已初始化的段——包含數(shù)據(jù)或代碼。用.text和.data偽指令定義的段和用.sect或.asect偽指令創(chuàng)建的命名段均為已初始化的段。②未初始化的段——在內存映射中為未初始化數(shù)據(jù)保留空間。.bss段和用.usect偽指令創(chuàng)建的命名段是未初始化的段,在目標文件中這些段沒有實際內容。段7.3通用目標文件格式目標文件的最小單位被稱為段,它是在存儲器中占有連續(xù)空間的代碼塊或數(shù)據(jù)塊。107.3通用目標文件格式▲
匯編器在匯編過程中建立這些段,連接器把段重定位到目標存儲器中▲
所有的段都是獨立的、可定位的▲
相同的段將按先后次序定位在連續(xù)的區(qū)域內▲
未初始化段被定位到RAM內;初始化段可單獨定位在RAM或ROM內,并且在連接時還可引用其他段內定義的符號匯編器為每個段設置了一個獨立的程序計數(shù)器,這些計數(shù)器稱為段程序計數(shù)器(SPC,SectionProgramCounters)。可以用段程序計數(shù)器排列偽指令.align或.even,強迫SPC指向預定的位置。段段程序計數(shù)器117.3通用目標文件格式連接器命令文件和連接器偽指令▲連接器通過連接COFF目標文件建立可執(zhí)行文件,▲目標文件中的段是連接時的重要依據(jù)。▲連接器可把段定位到用戶系統(tǒng)已配置的存儲器中。▲連接器命令文件(.cmd)則給出連接器在連接時的有關信息▲
DSP芯片的存儲器配置隨應用的不同而不同. 用連接器偽指令
MEMORY(存儲器偽指令)可以確定目標系統(tǒng)的各種內存配置。▲當MEMORY決定了存儲器模式后,可以用連接器偽指令SECTIONS
(段偽指令)確定連接器組合輸入段的方法和輸出段在存儲器中的位置。▲如果不使用這兩條偽指令,連接器則用默認存儲器的定位方式來組合段,并把它們定位到存儲器中。127.3通用目標文件格式連接器命令文件和連接器偽指令連接器命令文件.cmd連接器命令文件允許用戶把連接信息放置在文件中。命令文件是ASCII文件,可以包含下列各項中的某一項:▲輸入文件名。該輸入文件可以是目標文件、歸檔庫或其他命令文件。▲連接器選項。在命令文件中可以用命令行上的連接器選項。▲MEMORY和SECTIONS連接器偽指令。▲注釋。用戶可以使用/*和*/定界符把注釋加到命令文件中。▲賦值語句。該語句定義并賦值給全局符號。137.3通用目標文件格式連接器命令文件和連接器偽指令連接時給符號賦值▲賦值語句的語法:連接器中賦值語句的語法類似于C語言中賦值語句語法。符號=表達式 ;把表達式的值賦予符號符號+=表達式 ;把表達式的值加到符號上符號-=表達式 ;從符號減去表達式的值符號*=表達式 ;符號乘以表達式符號/=表達式 ;符號除以表達式
▲把SPC賦予符號“.”:“.”表示定位期間SPC的當前值。“.”符號僅可用在SECTIONS偽指令內的賦值語句中,用來表示段的當前運行地址。147.3通用目標文件格式連接器命令文件和連接器偽指令▲賦值表達式:連接器表達式必須遵循以下規(guī)則:√
表達式可包含全局符號、常數(shù),以及表8-3-1所列的C語言運算符。√
所有數(shù)被當做長整數(shù)(32位)處理。√
連接器用和匯編器相同的方式識別常數(shù)。見表8-3-2.√表達式中的符號只具有符號的地址值,不進行類型檢查。√
連接器表達式可以是絕對的或可重定位的。157.3通用目標文件格式連接器命令文件和連接器偽指令▲MEMORY偽指令——確定在目標系統(tǒng)中具有物理位置且可被程序使用的存儲器范圍。MEMORY偽指令的一般語句形式為:MEMORY{PAGE0:存儲器名1[(屬性)]:ORIGIN=常數(shù),LENGTH=常數(shù)
PAGEn:存儲器名n[(屬性)]:ORIGIN=常數(shù),LENGTH=常數(shù)
}167.3通用目標文件格式連接器命令文件和連接器偽指令PAGE:
√定義一個存儲器空間,用戶可以定義多達255頁。√
PAGE0定義程序存儲器,PAGE1定義數(shù)據(jù)存儲器,PAGE2定義I/O空間。√如果用戶沒有使用PAGE選項,那么連接器把段定位到PAGE0。√每個PAGE代表一個完全獨立的地址空間。√在PAGE0上已配置的存儲器可以和在PAGE1上已配置的存儲器重疊。存儲器名:√命名存儲器范圍。由1~8個字符組成。√名字對于連接器沒有特殊的意義,僅指明存儲器的區(qū)域。√在不同頁上存儲器范圍可以有相同的名字,√在同一頁,所有的存儲器范圍不能有相同的名字,且不能重疊。177.3通用目標文件格式連接器命令文件和連接器偽指令屬性:可選項,當被使用時,必須用括號括起來。屬性把輸出段的定位限制在某些存儲器范圍內。如果用戶不使用任何屬性,則輸出段即可以定位到任何范圍內。有效的屬性包括:R——存儲器可讀;W——存儲器可寫;X——儲器可以包含可執(zhí)行代碼;I——存儲器可被初始化。ORIGIN:指定存儲器的起始地址,也可以寫成org或o。這個值是以字節(jié)規(guī)定的16位常數(shù),也可以是十進制、八進制或十六進制。
LENGTH:指定存儲器的長度,也可以寫成len或l。數(shù)值的表示與origin相同▲
當用戶使用MEMORY偽指令時,要確信已指定了所有可用于裝載代碼的存儲器范圍。▲
連接器不把程序放到未配置的存儲器中。注意:187.3通用目標文件格式連接器命令文件和連接器偽指令例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通用目標文件格式連接器命令文件和連接器偽指令▲
SECTIONS偽指令
——
描述輸入段怎樣被組合到輸出段內;定義在執(zhí)行程序中的輸出段;規(guī)定輸出段在存儲器中的位置;允許重新命名輸出段。SECTIONS偽指令的一般語法形式是:SECTIONS{
段名1:[特性1,特性2,……]
段名2:[特性1,特性2,……]……………}指令中的每一行從段名開始定義輸出段,輸出段是輸出文件內的段。在段名之后是特性列表(以逗號隔開),定義段的內容以及它是怎樣被分配的。207.3通用目標文件格式連接器命令文件和連接器偽指令特性列表的選項(段所具備的特性)有以下幾種。▲
裝載地址:規(guī)定段將被裝載在存儲器中的位置。
語法:load=allocation或allocation或{}>allocationallocation是MEMORY偽指令所定義的范圍內地址。▲
運行地址:定義段在存儲器內運行的位置。
語法:run=allocation或 run>allocation
如果在一個段中l(wèi)oad和run的地址相同,run可以省略。連接器為每個輸出段分配兩個目標存儲器地址:裝載地址和運行地址。通常這兩個地址是相同的。但有時用戶可能把代碼裝入存儲器的一個區(qū)域卻在另一個區(qū)域運行它。例如在引導加載程序,用load設置它的裝載地址,用run設置它的運行地址。217.3通用目標文件格式連接器命令文件和連接器偽指令▲
調準地址:規(guī)定段應在地址邊界上開始。調準可以使連接器把輸出段放在位于n字邊界的地址,其中n是2的冪。
語法:align=n或 align=(n)
如.textalign=128,即將.text段定位于頁邊界。▲
塊地址:規(guī)定段必須裝在兩個地址邊界之間,它把段定位在大小為n的塊內任何地方,如果段大于塊,那么段將從該邊界開始。和調準一樣,n必須是2的冪。
語法:block=n或block(n)
如
.bssload=block(0x80)。定位.bss段使其包含在單個128字的頁內或者從新頁開始。用戶可以單獨使用調準或塊,也可以和裝入地址、運行地址結合在一起使用,但是調準和塊不能一起使用。227.3通用目標文件格式連接器命令文件和連接器偽指令▲
輸入段:定義組成輸出段的輸入段。
語法:{input_sections}
輸入文件中的段組合起來形成輸出段,連接器按照所列出的輸入段的次序連接并組合它們。輸出段的大小是組成它的輸入段的大小之和。通用類型的段的規(guī)格說明中沒有輸入段。如:SECTIONS{.text:.data:.bss:}
此時連接器從輸入文件取出所有.text段并把它們組合到.text輸出段內。連接器按照它在輸入文件中遇到的次序連接.text輸入段,對.data和.bss段的操作與.text相同。用戶也可以明確規(guī)定組成輸出段的輸入段,每個輸入段用它的文件名和段名來標志。237.3通用目標文件格式連接器命令文件和連接器偽指令例6.25
SECTIONS{.text {f1.obj(.text) f2.obj(sec1) f3.obj f3.obj(.text,sec2)}
}
輸入段不必相互同名也不必和輸出段同名。如果列舉輸入文件時不帶段,那么它所有的段將被包含在輸出段之內。247.3通用目標文件格式連接器命令文件和連接器偽指令
▲
段類型:定義特殊段類型的標志。語法:type=COPY
或
type=DSECT
或type=NOLOAD
用戶可以把這3種特殊的類型賦予輸出段。用COPY和DSECT創(chuàng)建的段是一個虛段,它不包括在輸出段存儲器分配內,也不占據(jù)存儲器空間,不包括在存儲器映象列表中。但在虛段中定義的全局符號可以被其他輸入段引用,COPY段可以將段的內容、重定位信息及行號信息放在輸出模塊中,而DSECT段則不放置。NOLOAD創(chuàng)建的段不將段的內容、重定位信息及行號信息放在輸出模塊中,但連接器為其分配空間并包括在存儲器映象列表中。257.3通用目標文件格式連接器命令文件和連接器偽指令▲
填充值:定義用于填充初始化空位的數(shù)值。
語法:file=value
或
name:…{…}=value
當初始化輸出段內有空位存在時,連接器必須提供原始數(shù)據(jù)以填充它。連接器用16位數(shù)值填充空位,該數(shù)值在存儲器內復制直至它填滿空位為止。267.4通用目標文件格式連接器命令文件和連接器偽指令例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通用目標文件格式連接器命令文件和連接器偽指令▲
連接器舉例
例6.27是一個名為demo.cmd的連接器命令文件,它連接了3個目標文件:demo.obj,fft.obj和tables.obj,并創(chuàng)建了一個名為demo.out的可執(zhí)行程序。假設目標存儲器具有下列配置。程序存儲器:
地址范圍
內容0xF0000~0x3FFFBF片內ROM0x3FFFC0~0x3FFFFF中斷向量表數(shù)據(jù)存儲器:
地址范圍
內容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
/*連接三個目標文件*/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通用目標文件格式連接器命令文件和連接器偽指令307.4通用目標文件格式連接器命令文件和連接器偽指令▲
TMS320C228x器件的默認定位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的情況下,存儲器使用該默認定位317.4程序舉例▲
公用文件程序設計時,需在多個模塊中使用相同設置和中斷處理:
將芯片中映射至I/O空間的寄存器地址及標號、預置變量和常數(shù)的空間等設置語句集中在一個文件中,稱為I/O寄存器頭文件(如init.h);
將轉移中斷矢量地址的指令集中在一個文件中,稱為中斷矢量頭文件(如vector.h);
將定義程序、數(shù)據(jù)和I/O空間地址塊大小和位置的偽指令集中在一個文件中,稱為命令文件(如F206.cmd)。
這3個文件稱為公用文件。
32
▲
用.copy或.include偽指令將I/O寄存器頭文件和中斷矢量頭文件復制到該應用程序中,形成一個匯編源程序(如
delay.asm)
▲
由匯編器進行匯編后生成一個目標文件(如delay.obj
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3881-2020中藥智能工廠中藥水提醇沉提取過程質量監(jiān)控
- DB32/T 3588-2019水稻-中華鱉共作技術規(guī)程
- DB32/T 1580-2019地理標志產(chǎn)品射陽大米
- DB32/ 4385-2022鍋爐大氣污染物排放標準
- DB31/T 606-2012立桿掛旗廣告設置技術規(guī)范
- DB31/T 583-2012社區(qū)公益服務項目績效評估導則
- DB31/ 897-2015預拌砂漿單位產(chǎn)品綜合能源消耗限額
- 2025電纜采購合同格式范本
- 谷物磨制在糧食加工產(chǎn)業(yè)促進農(nóng)產(chǎn)品加工副產(chǎn)物利用的研究考核試卷
- 玩具企業(yè)的品牌傳播與公關策略考核試卷
- 成都設計咨詢集團有限公司2025年社會公開招聘(19人)筆試參考題庫附帶答案詳解
- 2024年江西省高考化學試卷(真題+答案)
- 建筑史智慧樹知到期末考試答案2024年
- 基于MATLAB仿真的烤箱的溫度控制分析
- 餐廳食堂就餐券通用模板
- 煤礦安全安全設施設計
- 高中語文-戲劇單元重要知識點整理
- 門式腳手架移動作業(yè)平臺施工方案
- JJF 1934-2021 超聲波風向風速測量儀器校準規(guī)范
- 2021年寧夏中考地理試題及答案
- 《蘇幕遮燎沉香》教學設計
評論
0/150
提交評論