




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章匯編語言程序開發主講:喬瑞萍
西安交通大學信通學院email:rpqiao@
主要內容:TMS320C54x匯編語言的基本概念匯編語言程序設計的基本方法匯編語言程序的編輯、匯編和鏈接過程程序示例匯編源程序〈一〉來源C語言代數指令程序宏源文件C編譯器代數式指令翻譯器歸檔(將若干宏文件集中為一個宏文件庫)匯編源程序宏庫匯編器〈二〉匯編語言程序的編寫方法1.語句格式:見P80[標號][:]助記符[操作數][;注釋]2.匯編命令
見83頁表4-3常用的匯編命令3.宏命令
見88頁4.分析程序(P90)1.語句格式[標號][:]助記符[操作數][;注釋]2.匯編命令
命令句法:
.text[段起點].data[段起點] ;若[]缺省,SPC=0.bss符號,字數;例:.bssx,2.sect“段名”[,段起點]符號.usect“段名”,字數例:STACK.usect“STACK”,10H.wordvalue1[,…,valuen];例:table:
.word3,23.宏命令宏定義格式:宏命令名.macro<形式參數>
.endm宏調用格式:宏命令名<實際參數>
宏展開實際參數傳遞給形式參數,宏定義代替宏調用語句宏體宏定義、宏調用和宏展開:舉例宏定義:
add3 .macro p1,
p2,
p3,
ADDRP
LD P1,
A
ADD P2,
A
ADD P3,
A
STL A,
ADDRP
.endm宏調用:
add3 abc, def, ghi, adr 宏展開:
LD abc, A ADD def, A ADD ghi, A STL A, adr4.2 匯編程序設計的基本方法
匯編源程序(.asm)一般由數據段、堆棧段、代碼段組成。
程序的基本結構有四種:順序結構分支結構循環結構子程序結構
匯編語言程序框架如下:
.mmregsSTACK.usect"STACK",10h
.data
<數據、變量在此定義>
.text ;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP
<加入你自己的程序段>end:Bend.end
另外,.bss用于為變量保留一塊存儲空間,.sect常用于定義中斷向量表。
4.2.2順序結構
例1試編制程序,求出下列公式中z的值,z=(x+y)*8-w
.title"ex41.asm".mmregsSTACK.usect"STACK",10h;allocatespaceforstack.bssx,1;allocate4wordforvariates.bssy,1.bssw,1.bssz,1.defstart
.data
table:.word6,7,9;datafollows....text ;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP;setstackpointerSTM#x,AR1;AR1pointtoaRPT#2;move3valuesMVPDtable,*AR1+;fromprogrammemory;intodatamemoryLD@x,AADD@y,A;A=x+y
LDA,3;A=(x+y)*8SUB@w,A;A=(x+y)*8-wSTLA,@zend:Bend.end返回4.2.3分支結構基本的程序控制與轉移指令,實行分支轉移,循環控制及子程序操作1、分支改寫PCBnextBACCsrcBCnext,cnd分支舉例標號:條件滿足?處理NYIF…THEN結構程序結構:
…
條件轉移指令(BC標號,cond)
處理體
標號:其他指令
…例2:試編制程序,求一個數的絕對值,并送回原處。
.mmregsSTACK.usect"STACK",10h;allocatespaceforstack .bssx,1 ;allocate1wordforvariates
.defstart .datatable:.word-7 ;datafollows... .text;codefollows...start: STM#0,SWWSR;addsnowaitstates STM#STACK+10h,SP;setstackpointer
STM#x,AR1 MVPDtable,*AR1 LD*AR1,A
BCend,AGT
;若A>0,則轉至end,否則往下執行
ABSA STLA,@xend:Bend .end循環舉例4.2.4循環結構條件算符(cnd)LEQGEQEQNEQLTGTNOVOVTCNTCCNCBIONBIO1.2.說明:1.第一組:組內兩類條件可以與/或,當選兩條件時,累加器必須是同一個。2.第二組:可以從組內3類算符中各選一個條件算符。3.組與組之間只能“或”。循環程序設計主要用于某些需要重復進行的操作,簡化程序,節約內存。主要使用循環指令BANZ等循環指令。循環程序的設計可分為設置循環初始狀態、循環體和循環控制條件三部分。
返回
循環程序(1)DO…UNTIL<條件>結構先執行,再判斷條件。工作部分至少執行一次。初始化循環體循環控制繼續循環?YN(2)DOWHILE<條件>結構先判斷條件,再執行。工作部分有可能一次都不執行。初始化循環體循環控制繼續循環?YN主要是指設置循環次數的計數初值,以及其他為能使循環體正常工作而設置的初始狀態等。
返回設置循環初始狀態循環體是循環操作(重復執行)的部分,包括循環的工作部分及修改部分。循環的工作部分是實現程序功能的主要程序段;循環的修改部分是指當程序循環執行時,對一些參數如地址、變量的有規律的修正。
循環體返回循環控制部分循環控制部分是循環程序設計的關鍵。每個循環程序必須選擇一個控制循環程序運行和結束的條件。要點:①找出循環的規律。②確定控制循環的方法。
注意:循環可以嵌套(多重循環),但多個循環體之間不能交叉,控制條件不能混淆。返回
分析:例3:試編制程序,在4項乘積aixi(i=1,2,3,4)中
找出最大值,并存放在累加器A中。 .mmregsSTACK.usect"STACK",10h.bssa,4.bssx,4.defstart.datatable:.word1,2,3,4.word8,6,9,7.textstart:STM#0,SWWSRSTM#STACK+10h,SPSTM#a,AR1RPT#7MVPDtable,*AR1+STM#a,AR1STM#x,AR2
STM#2,AR3
LD*AR1+,TMPY*AR2+,A
;第一個乘積在累加器A中loop1:LD*AR1+,TMPY*AR2+,B ;其它乘積在累加器B中
MAXA;累加器A和B比較,選大的存在A中
BANZloop1,*AR3-
;此循環中共進行3次乘法和比較end:Bend.end例9ex43.cmd文件(P108)
ex43.obj-oex43.out-mex43.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100h
PAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}子程序調用將返回地址壓入堆棧CALLsubCALAsrcCCsub,cnd返回復原RETRCcnd4.2.5子程序結構子程序的定義子程序是一個獨立的程序段,具有確定的功能,可被其他程序調用,調用它的程序一般為主程序。其特點是:模塊化程序設計,省內存、省時間(研制周期)。通用功能程序編成子程序方便用戶
一個子程序可以被其他程序所調用,它最后一條指令總是返回指令,用以控制子程序在執行完畢后,返回主程序。子程序的調用子程序的結構格式:子程序名:
RET子程序體例4(整數的)求乘法累加運算y=a1*x1+a2*x2+a3*x3+a4*x4*************************************************EX44.asmy=a1*x1+a2*x2+a3*x3+a4*x4*************************************************.title"EX44.asm".mmregsSTACK.usect"STACK",10h;allocatespaceforstack.bssa,4;allocate9wordforvariates.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4;datafollows....word8,6,4,2
.text;codefollows...start:STM#0,SWWSR;addsnowaitstatesSTM#STACK+10h,SP;setstackpointerSTM#a,AR1;AR1pointtoaRPT#7;move8valuesMVPDtable,*AR1+;fromprogrammemory;intodatamemoryCALLSUM;callSUMsubrotineend:BendSUM:STM#a,AR3;ThesubrotinelmplememtSTM#x,AR4;multiply--accumulateRPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end例:浮點運算P94例5目的:為了擴大數據的范圍和精度,采用浮點運算,C54x是定點DSP,但它支持浮點運算1.浮點的表示方法定點數=尾數2-(指數)2.定點數浮點數步驟:EXPA;提取指數STT,EXPONENT;T中的指數存放到數存的指定單元中NORMA;規格化處理A=FFFFFFF001;按T中數值對A歸一化EXP
A
;T=A的冗余符號位數-8=27-8=13HNORM
A
;按T中數值對A歸一化1111111111111111111111111111000000000001
左移13H
尾數FF80080000H和指數13H注:冗余符號位-8,也就是為消去多余符號位而將累加器中的數值左移的位數,當累加器數值超過32位時,指數是一個負值。3.浮點數相乘:指數相加;尾數相乘即[m1*2-(e1)]*[m2*2-(e2)]=(m1*m2)*2-(e1+e2)4.浮點數定點數按指數值將尾數右移(指數為負時左移)就可以了編寫浮點乘法程序,完成
x1*x2=0.3*(-0.8)運算。程序中所用數據變量如下:x1:定點被乘數;e1:被乘數的指數;m1:被乘數的尾數;x2:定點乘數;e2:乘數的指數 ;m2:乘數的尾數;ep:乘積的指數 ;mp:乘積的尾數 ;product:定點乘積 ;temp:暫存單元。首先將定點數x1、x2轉換為浮點數,浮點數相乘即指數相加,尾數相乘,最后再將乘積(浮點數)轉換為定點數。.title"EX45.asm".mmregsSTACK.usect"STACK",10h.bssx1,1.bssx2,1.bsse1,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.defstart.datatable:.word4*32768/10.word-6*32768/10.textstart:STM#0,SWWSRSTM#STACK+10h,SP;設置堆棧指針
MVPDtable,@x1;將x1、x2傳送至數據存儲器
MVPDtable+1,@x2
LD@x1,16,A;先將x1加載至A(31~16),因小數在高位EXPA ;提取指數
STT,@e1;保存x1的指數NORMA ;將x1規格化為浮點數,按指數將尾數移位STHA,@m1
;保存x1的尾數
LD@x2,16,A
EXPASTT,@e2 ;保存x2的指數NORMASTHA,@m2
;保存x2的尾數CALLMULT ;調用浮點乘法子程序done:BdoneMULT:SSBXFRCT ;小數相乘消去冗余符號位SSBXSXM ;符號位擴展LD@e1,A :指數相加ADD@e2,A STLA,@epLD@m1,T ;尾數相乘(有符號數),乘積左移1位MPY@m2,A EXPA ;對尾數乘積規格化STT,@tempNORMASTHA,@mp ;保存乘積尾數LD@temp,A ;修正乘積指數,ep+temp=epADD@ep,ASTLA,@ep ;保存乘積指數NEGA ;乘積指數反號,將浮點乘積轉換為定點數STLA,@tempLD@temp,TLD@mp,16,ANORMASTHA,@product ;保存定點乘積RET.end4.3匯編語言程序的編輯、匯編和鏈接過程圖4-1匯編語言程序的編輯、匯編和鏈接過程一個或多個TMS320源程序經過匯編和鏈接,生成公共目標文件格式的COFF可執行文件。再通過軟件仿真或硬件在線仿真器的調試,最后將程序加載到用戶的應用系統。本章4.3節~4.5節主要介紹匯編語言程序的.cmd文件編寫方法。一主要的軟件開發工具文本編輯器EDIT.COM(在driver:\dos子目錄下)。C54x匯編器ASM500.EXE(在driver:\C54x\asmlink子目錄下)。C54x鏈接器LNK500.EXE(在driver:\C54x\asmlink子目錄下)。軟件仿真器SIM54XW.EXE(在driver:\
C54x\sim子目錄下)。二鏈接連接命令文件(.cmd)
利用LNK500,根據鏈接文件命令對已匯編的一個或多個目標文件(.obj)進行鏈接,生成.map文件和.out文件。.cmd指出輸入文件,輸出文件程序段,數據段,堆棧段,復位向量,中斷向量安排在什么地方
程序M,數據M.cmd指明(.text,.data,.bss,及STACK)入口地址三調試對.out文件的調試手段:軟件仿真器Sim54xw。C54xEVM評估板上調試。XDS510在線仿真器上進行調試。四固化程序HEX500(格式轉換器)對ROM、EPROM編程,安裝到用戶程序的應用系統中。4.4 匯編器4.4.1COFF的一般概念匯編器(Assembler)將匯編語言源文件匯編成機器語言COFF(CommonObjectFileFormat)目標文件。COFF的用途:會使模塊化編程和管理變得更加方便,編程時按代碼段和數據段來考慮問題,匯編器和鏈接器都有一些命令建立并管理各種各樣的段所謂段(Section),是指連續地占有存儲空間的一個代碼塊或數據塊。
一、COFF文件中的段P99
.text:已初始化段(通常包含可執行代碼).data:已初始化段(通常包含初始化數據).bss:未初始化段(通常為未初始化變量保留存儲空間)
此外,自定義段:.sect(已初始化段).usect(未初始化段)命令句法:已初始化段.text[段起點].data[段起點] ;若[]缺省,SPC=0。.bss 符號,字數未初始化段.sect“段名”[,段起點].usect“段名”,字數說明:符號——對應于保留的存儲空間第一個字的變量名稱。字數——段中保留多少個存儲單元。段名——為段所起名字。段有兩種:已初始化段:包含有數據或程序代碼。未初始化段:為未初始化的數據保留存儲空間,通常定位到RAM區,存放變量匯編器將程序代碼和數據鏈接在一起,構成目標文件。鏈接器把各個段重新定位到目標存儲器圖。二、匯編器對段的處理在編程時,“段”沒有絕對定位,每個“段”都認為是從0地址開始的一塊連續的存儲空間。程序員只需要用“段”偽指令來組織程序的代碼和數據,而無需關心這些“段”究竟定位于系統何處。
由于所有的“段”都是從0地址開始,因此程序編譯完成后無法直接運行。要讓程序正確運行,必須對“段”進行重新定位,即把各個段重新定位到目標存儲器圖,這個工作由鏈接器完成
。匯編器對段的處理
匯編器用5條命令(.bss、.usect、.text、.data和.sect)識別匯編語言程序的各個部分。
匯編器第一次遇到新“段”時,將該“段”的段程序計數器(SPC)置為0,并將隨后的程序代碼或數據順序編譯進該“段”中。匯編器遇到同名“段”時,將它們合并,然后將隨后的程序代碼或數據順序編譯進該“段”中。
匯編器為每個段都安排了一個單獨的段程序計數器(SPC)。SPC表示一個程序代碼或數據段內的當前地址。最初,匯編器將每個SPC置為0。當代碼或數據被加到一個段內時,相應的SPC的值就增加。如果繼續匯編進一個段,則匯編器會記住前面的SPC值,并在該點繼續增加SPC的值。鏈接器在鏈接時要對每個段進行重新定位
。列表文件中每行由4個區域組成即:Field1:源程序的行號。Field2:段程序計數器SPC。Field3:目標代碼。Field4:源程序。見P100例64.5 鏈接器任務:1.將各個段配置到目標系統的存儲器。
2.為各個輸出段選定存儲器地址。3.解決輸入文件之間未定義的外部引用。 鏈接器的主要功能就是對程序定位,是一種相對的程序定位方式。
程序的定位方式有3種:編譯時定位。鏈接時定位。加載時定位。編譯時定位MCU系統采用編譯時定位,編程時由ORG語句確定代碼塊和數據塊的絕對地址,編譯器以此地址為首地址,連續、順序地存放該代碼塊或數據塊。編譯時定位簡單、容易上手,但程序員必須熟悉硬件資源,模塊化編程差,工程化不支持。
鏈接時定位DSP系統采用鏈接時定位,編程時由“段”偽指令,以區分不同的代碼塊和數據塊;編譯器每遇到一個“段”偽指令,從0地址重新開始一個代碼塊或數據塊;鏈接器將同名的“段”合并,并按.cmd文件中的“段”命令進行實際的定位。鏈接時定位程序員不必熟悉硬件資源,模塊化編程強,便于工程化管理,可將軟件開發人員和硬件開發人員基本上分離開,但定位靈活、上手較難。
加載時定位PC機系統采用加載時定位,編程、編譯和鏈接時均未對系統進行絕對定位,而是在程序運行前,由操作系統對程序進行重定位,并加載到存儲空間中。加載時定位必須要有操作系統支持,便于程序的模塊化編程及工程化管理支持。
1、鏈接器對段的處理MEMORY命令:此條命令用來定義目標系統的存儲器配置圖。包括對存儲器各部分命名,以及規定他們的起始地址和長度。基本句法如下:詳情見P105名稱:orign=常數,length=常數;SECTIONS命令。此命令告訴鏈接地址器如何將輸入段組合成輸出段,以及將輸出段放在存儲器的什么位置。基本句法如下:詳情見P106名稱:>某存儲區目標文件目標存儲器.bss.data.textSPRAMEPROM目標文件中的段與目標存儲器之間的關系.cmd文件由3部分組成:輸入/輸出定義:這一部分可通過CCS的“BuildOptions…”菜單設置.obj文件:鏈接器要鏈接的目標文件.lib文件:鏈接器要鏈接的庫文件.map文件:鏈接器生成的交叉索引文件.out文件:鏈接器生成的可執行代碼鏈接器選項MEMORY命令:描述系統實際的硬件資源SECTIONS命令:描述“段”如何定位2、鏈接器命令文件lab1.cmdlab1.obj-olab1.out-mlab1.map-estartMEMORY{PAGE0:EPROM:org=0E000h,len=100h
PAGE1:SPRAM:org=0060h,len=20hDARAM:org=0080h,len=100h}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}3、重定位P109~110
匯編器處理每個段都是從0開始,而所需要重新定位的符號(標號)在段內都是相對于地址0的。實際上,所有段都不可能從存儲器中的地址0單元開始的,因此鏈接器必須通過以下方法對各個段進行重新定位:將各個段定位到存儲器圖中,這樣一來每一個段都從一個恰當的地址開始。將符號的數值調整到相對于新的段地址的數值。調整對重定位后符號的引用。4、COFF文件中的符號外部符號:在一個模塊中定義,又可在另一個模塊中引用的符號,可用下列符號:.def:在當前模塊中定義,并可在別的模塊中使用的符號。.ref:在當前模塊中使用,但在別的模塊中定義的符號。.global:可以在以上任意一種情況。返回4.7 程序示例
多個文件鏈接
P117
正弦波發生器
P1211、多個文件鏈接將復位和中斷向量文件vectors.asm和ex421.asm兩個文件相鏈接。對ex42.asm文件進行修改:增加.def start,INT_2增加中斷服務程序INT_2開放中斷RSBX INTMSTM #0004,IMR分別對vectors.asm和ex421.asm兩個文件進行匯編,并對各自生成的兩個目標文件vectors.obj和ex421.obj進行鏈接。
lnk500ex421.cmd修改ex42.cmd。輸入文件增加vectors.objMEMORYPAGE0SECTIONS在MEMORYPAGE0中增加:VECS:org=0FF80H,len=4VECS1:org=0FFC8H,len=4在SECTIONS中增加:.vectors:>VECSPAGE0INT_2:>VECS1PAGE0********************************** vectors.asm ** Resetvector **********************************.title"vectors.asm"
*******Reset-Vector*********.refstart .sect".vectors"Bstart
*******Interrupt-Vector********.refINT_2.sect"INT_2"BIN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年會策劃方案模板(18篇)
- 軍訓開幕式學生演講稿2025年(18篇)
- 人機交互測試的基本原則試題及答案
- 反擔保人保證合同書
- 新聞學概論與實務試題集
- 化學工業分析與檢測技術試題
- 培訓服務合同書及課程安排細節說明
- 行政組織的外部環境分析考題及答案
- 公路工程服務體系建設試題及答案
- 計算機三級考試中的易錯試題及答案
- 血管瘤護理綜合護理方案幫助患者康復
- 寵物血液庫市場營銷策劃
- 采掘開工作面動態驗收表
- 垃圾分類意識的培養與智能垃圾分類系統
- 人力資源管理與創新創業實踐-青島大學中國大學mooc課后章節答案期末考試題庫2023年
- 電梯維保服務方案及措施方案
- 廢品承包合同
- 酒水鑒賞與調酒技術智慧樹知到答案章節測試2023年青島恒星科技學院
- 排序算法及其算法分析課件
- 吸煙對人體危害和戒煙
- 子宮內膜增生課件
評論
0/150
提交評論