版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章C語言編程與混合編程7.1
C語言編程7.2
C程序編譯7.3
C語言與匯編語言混合編程
7.1
C語言編程
7.1.1
C54x支持的基本數(shù)據(jù)類型
C54xDSP的基本數(shù)據(jù)類型如表7.1所示,字長為16位或32位。7.1.2常量與變量
常量名和變量名都以字母或下劃線開頭,最多可以有100個(gè)字符,不能使用C語言的關(guān)鍵字來命名常量名和變量名。常量在編譯后直接嵌入代碼中。變量名經(jīng)C編譯器編譯后,代表一個(gè)變量的內(nèi)存地址,并自動(dòng)在變量名前加下劃線(_),
如變量“a”經(jīng)編譯后,在內(nèi)存單元顯示為“_a”。這樣的好處就是C語言定義的變量和匯編文件定義的變量可以重名且不會混淆,還有一個(gè)好處就是匯編文件可以調(diào)用C
語言定義的變量和函數(shù)(C語言定義的函數(shù)名在編譯后也在函數(shù)名前加“_”),以實(shí)現(xiàn)混合編程。
符號的常量名通常用大寫字母表示,變量名用小寫字母表示,以示區(qū)別。變量名常采用著名的匈牙利命名規(guī)則,當(dāng)然,變量較少時(shí),也可以簡單地命名變量。7.1.3運(yùn)算符與表達(dá)式
將常量或變量用運(yùn)算符連在一起就構(gòu)成了表達(dá)式,再在句末加上分號(;)即成為語句。
(1)賦值運(yùn)算符:=。對DSP寄存器進(jìn)行賦值時(shí),先將寄存器定義為指針,然后與C語言變量賦值類似地進(jìn)行賦值。如中斷屏蔽寄存器(IMR)的地址為0地址,其定義和賦值如下:
#define IMR *(int*)0x0
IMR=0;對外部端口進(jìn)行賦值時(shí),先用關(guān)鍵字ioport和端口地址定義端口名,然后也是與C語言變量賦值類似地進(jìn)行賦
值,其定義和賦值如下:
ioportunsignedintport8000;//定義一個(gè)外部端口,地址為0x8000
port8000=0;
(2)算術(shù)運(yùn)算符:+(加)、-(減)、*(乘)、/(除)、%(取模)。在C54xDSP中,取模運(yùn)算按分子的符號確定取值的符號,如10%-3=1;-10%3=-1等。類似地,C54xDSP也支持組合運(yùn)算符,如+=、-=、*=、/=、%=及++、--等。
在表達(dá)式中,只能使用小括號改變運(yùn)算的優(yōu)先順序。
(3)關(guān)系運(yùn)算符:==(等于)、![KG-*2]=(不等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)。
作為關(guān)系運(yùn)算表達(dá)式的輸入,0為假,非0為真;作為運(yùn)算結(jié)果,0表示假,1表示真。
(4)位運(yùn)算符:&(按位與)、|(按位或)、∧(按位異或)、~(取反)、<<(左移)、>>(右移)。
(5)邏輯運(yùn)算符:&&(邏輯與)、‖(邏輯或)、!(邏輯非)。
(6)三元運(yùn)算符:“?:”,它有三個(gè)參加運(yùn)算的元素,而且有返回值,其使用格式為
(express)?(val1):(val2);[HT5]
如果express的值為真,則返回表達(dá)式val1的值,否則返回val2的值。這條語句也可用if語句代替,可不必記憶。
運(yùn)算符的優(yōu)先級自高到低為邏輯非、算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符&&或‖、賦值運(yùn)算符。7.1.4函數(shù)及調(diào)用規(guī)則
一個(gè)C語言編寫的函數(shù)就是一個(gè)功能模塊,多個(gè)函數(shù)可以組成更大的功能模塊。main函數(shù)包括除中斷函數(shù)外的其他全部函數(shù)的功能,DSP程序總從main函數(shù)開始執(zhí)行。為了能正確執(zhí)行main函數(shù),需要一個(gè)C語言運(yùn)行環(huán)境。通過適當(dāng)設(shè)置TMS320C54xC/C++編譯器,DSP項(xiàng)目中會自動(dòng)添加相應(yīng)的C語言初始化代碼,以適合main函數(shù)的執(zhí)行。
1.全局變量和局部變量
在主函數(shù)體中定義的變量或主函數(shù)體外的變量為全局變量,在編譯時(shí)有固定的存儲地址;而在其他函數(shù)體中定義的變量稱為局部變量,存儲單元是在堆棧中分配局部變量的,稱為局部幀。一旦函數(shù)執(zhí)行完畢,局部幀必須被收回,局部變量就消失了,所以局部變量的作用域僅限于函數(shù)體內(nèi)部。
2.參數(shù)傳遞
如果函數(shù)存在參數(shù)傳遞,則調(diào)用者將第一個(gè)參數(shù)(最左邊)載入累加器A,而將剩下的參數(shù)以逆序壓入堆棧,最右邊的先壓棧,最左邊的參數(shù)最后一個(gè)壓棧,即在最低的地址。
這些壓入堆棧的參數(shù)稱為局部幀,參數(shù)傳遞就是將實(shí)參的值復(fù)制到形參的值的過程。若參數(shù)為實(shí)浮點(diǎn)數(shù)或長整型數(shù),則是低字先入棧,高字后入棧。若參數(shù)中有結(jié)構(gòu)形式,則調(diào)用函數(shù)會給結(jié)構(gòu)分配空間,其地址通過累加器A傳遞給被調(diào)用函數(shù)。一旦函數(shù)執(zhí)行完畢,局部幀被收回,形參則消失。
3.函數(shù)返回
若函數(shù)返回一個(gè)值,則被調(diào)用函數(shù)將返回值載入累加器A中,再從A復(fù)制到實(shí)參中;如果是返回一個(gè)結(jié)構(gòu)體,則將結(jié)構(gòu)體的內(nèi)容復(fù)制到累加器A所指向的存儲空間;如果沒有返回值,則A被置0,然后撤銷局部幀和恢復(fù)函數(shù)中所有保護(hù)的寄
存器。
4.main函數(shù)
main函數(shù)主要由程序初始化代碼、硬件初始化代碼以及定時(shí)掃描代碼等組成。main函數(shù)往往是死循環(huán)函數(shù),定義死循環(huán)的語句有for(;;)或while(1)等。
5.中斷函數(shù)
中斷函數(shù)利用關(guān)鍵字interrupt來定義。如定義一個(gè)名稱為time的中斷函數(shù)如下:
interruptvoidtime();
{
…
}
用C語言編寫的中斷函數(shù),其執(zhí)行效率不高。因?yàn)楫?dāng)系統(tǒng)調(diào)用中斷函數(shù)時(shí),會將所有CPU寄存器的內(nèi)容壓棧保護(hù),中斷返回時(shí),系統(tǒng)又會將這些CPU寄存器的內(nèi)容出?;謴?fù)。7.1.5
C語言庫函數(shù)
在C5000DSP的C語言編程中,有很多現(xiàn)成的庫函數(shù)可以調(diào)用。假設(shè)CCS默認(rèn)安裝在c:\ti目錄下,則c:\ti\c5400\cgtools\include和c:\ti\c5500\cgtools\include兩個(gè)目錄下的文件即為C/C++庫函數(shù)文件。這里對C庫文件進(jìn)行介紹,C++庫文件從略。在c:\ti\c5400\cgtools\include目錄下的C語言頭文件(.h)有19個(gè),它們分別是access.h、assert.h、ctype.h、errno.h、file.h、float.h、intrindefs.h、iso646.h、limits.h、
linkage.h、math.h、setjmp.h、stdarg.h、stddef.h、stdio.h、stdlib.h、string.h、time.h、unaccess.h。
頭文件中的函數(shù)實(shí)現(xiàn)存儲在c:\ti\c5400\cgtools\lib\rts.src文件中,打開文件即可以看到具體的實(shí)現(xiàn)代碼。
(1)math.h:浮點(diǎn)數(shù)學(xué)函數(shù)。它包含下列函數(shù):
sin(正弦)、cos(余弦)、tan(正切)、asin(反正弦)、acos(反余弦)、atan(反正切)、atan2(兩數(shù)商的反正切)、sinh(雙曲正弦)、cosh(雙曲余弦)、tanh(雙曲正切)、ceil(向上取整)、floor(向下取整)、fmod(兩數(shù)商的浮點(diǎn)型余數(shù))、fabs(絕對值)、exp(以e為底的指數(shù))、frexp(返回一個(gè)數(shù)的尾數(shù)和以2為底的指數(shù))、ldexp(已知尾數(shù)和以2為底的指數(shù),求冪)、log(自然對數(shù))、log10(以10為底的對數(shù))、modf(分解成有符號整數(shù)部分和有符號小數(shù)部分)、pow(計(jì)算x的y次方)、sqrt(開平方)。
(2)stdlib.h:通用函數(shù)。它包含下列函數(shù):
abort(非正常程序中止)、abs(求整數(shù)絕對值)、labs(長整數(shù)絕對值)、atof(字符串轉(zhuǎn)換為浮點(diǎn)數(shù))、atoi(字符串轉(zhuǎn)換為整數(shù)型)、atol(字符串轉(zhuǎn)換為長整型)、div(整型除法)、ldiv(長整型除法)、ltoa(長整數(shù)轉(zhuǎn)換為字符串)、rand(產(chǎn)生偽隨機(jī)整數(shù))、srand(復(fù)位隨機(jī)數(shù)產(chǎn)生器)、strtod(字符串轉(zhuǎn)換為浮點(diǎn)值)、strtol(字符串轉(zhuǎn)換為長整型值)、strtoul(字符串轉(zhuǎn)換為無符號長整型值)。
(3)ctype.h:字符轉(zhuǎn)換。它包含下列函數(shù):
isalnum(是否是字母或數(shù)字)、isalpha(是否是字母)、iscntrl(是否是控制字符)、isdigit(是否是數(shù)字)、isgraph(是否是除空格外的可打印字符)、islower(是否是小寫字母)、
isprint[JP](是否是可打印字符(包括空格))、ispunct(是否是標(biāo)點(diǎn)符號)、isspace(是否是空格、制表符、回車符、換頁符或換行符)、isupper(是否是大寫字母)、isxdigit(是否是十六進(jìn)制數(shù))、isascii(是否是ASCII碼字符)、toupper(轉(zhuǎn)換成大寫字母)、tolower(轉(zhuǎn)換成小寫字母)、toascii(轉(zhuǎn)換成一個(gè)合法的ASCII碼值)。
(4)其他頭文件。它包括下列函數(shù):
assert.h(診斷信息)、errno.h(出錯(cuò)報(bào)告)、file.h(低級I/O函數(shù))、float.h、limits.h(取值范圍限制)、setjmp.h(非局部跳轉(zhuǎn))、stdarg.h(可變參數(shù))、stddef.h(標(biāo)準(zhǔn)定義)、stdio.h(輸入/輸出函數(shù))、string.h(字符串函數(shù))、time.h(時(shí)間函數(shù))。7.1.6
DSPLIB匯編庫函數(shù)
CCS開發(fā)環(huán)境還為C5400和C5500提供了通用數(shù)字信號處理算法庫(DSPLIB庫)。這些庫函數(shù)用匯編語言編寫,編譯效率高,多數(shù)為16位數(shù)據(jù)格式,執(zhí)行速度快,采用C函數(shù)格式直接調(diào)用或略加修改后調(diào)用,可大大加快項(xiàng)目的開發(fā)速度。如果采用默認(rèn)安裝的CCS軟件,則DSPLIB庫在c:\ti\c5400\dsplib目錄下。在此目錄下的\include\dsplib.h頭文件中列出了DSPLIB庫函數(shù)的原型,其源程序在c:\ti\c5400\dsplib\54xdsp.src文件或54x_src文件夾中,主要有以下相關(guān)函數(shù)。
(1)實(shí)數(shù)或復(fù)數(shù)FFT算法函數(shù)。
cfft8~cfft1024:16位數(shù)據(jù)的復(fù)數(shù)FFT算法,點(diǎn)數(shù)在8~1024點(diǎn)之間,取2的整數(shù)次冪。
rfft8~rfft1024:16位數(shù)據(jù)的實(shí)數(shù)FFT算法,點(diǎn)數(shù)同上。
cfft8~cfft1024:16位數(shù)據(jù)的復(fù)數(shù)IFFT算法,點(diǎn)數(shù)同上。
rfft8~rfft1024:16位數(shù)據(jù)的實(shí)數(shù)IFFT算法,點(diǎn)數(shù)同上。
cfft32_8~cfft32_1024:32位數(shù)據(jù)的復(fù)數(shù)FFT算法,點(diǎn)數(shù)
同上。
cifft32_8~cifft32_1024:32位數(shù)據(jù)的復(fù)數(shù)IFFT算法,
點(diǎn)數(shù)同上。
unpacki_16~unpacki_1024:IFFT算法解包裝(unpack)
算法,也就是將一個(gè)N/2點(diǎn)的復(fù)數(shù)IFFT變成N點(diǎn)的實(shí)數(shù)IFFT算法,點(diǎn)數(shù)在16~1024點(diǎn)之間,取2的整數(shù)次冪。
cbrev、cbrev32:16位、32位的復(fù)數(shù)倒位序程序。
(2)數(shù)字濾波和卷積函數(shù)。
convol:計(jì)算2個(gè)實(shí)序列的卷積。
fir:fir濾波函數(shù)。
firs:系數(shù)對稱的fir濾波函數(shù)。
cfir:復(fù)數(shù)fir濾波函數(shù)。
iircas4:使用直接II型結(jié)構(gòu)計(jì)算二階IIR級聯(lián)濾波,其算法如下:
d(n)=x(n)-a1d(n-1)-a2d(n-2)
(7.1)
y(n)=d(n)+b1d(n-1)-b2d(n-2)(7.2)
iircas5:使用直接II型結(jié)構(gòu)計(jì)算二階IIR級聯(lián)濾波,其算法如下:
d(n)=x(n)-a1d(n-1)-a2d(n-2)(7.3)
y(n)=b0d(n)+b1d(n-1)-b2d(n-2)(7.4)
iir32:32位數(shù)據(jù)的二階IIR級聯(lián)濾波。
firdec:帶抽取的fir濾波,允許分段連續(xù)濾波。
firinterp:帶內(nèi)插的fir濾波,允許分段連續(xù)濾波。
(3)自適應(yīng)濾波函數(shù)。
dlms:帶延遲的自適應(yīng)LMSfir濾波算法。
(4)相關(guān)函數(shù)。
acorr_raw、acorr_bias、acorr_unbias:
計(jì)算自相關(guān)及有偏、無偏處理,僅輸出自相關(guān)序列的半邊,而corr函數(shù)輸出自相關(guān)的全部序列值。
(5)數(shù)學(xué)函數(shù)。
add:向量加法。
sub:向量減法。
neg、neg32:16位、32位數(shù)據(jù)向量取相反數(shù)。
ldiv16:Q31除以Q15的長除法。
recip16:Q15格式浮點(diǎn)數(shù)倒數(shù)運(yùn)算。
expn:利用泰勒級數(shù)計(jì)算一個(gè)向量以e為底的指數(shù)值。
logn:利用泰勒級數(shù)計(jì)算一個(gè)向量的自然對數(shù)值。
log_2、log_10:利用泰勒級數(shù)計(jì)算一個(gè)向量以2為底、以10為底的對數(shù)值。
sqrt_16:開平方。
maxidx、minidx:返回一個(gè)向量最大值、最小值的索引。maxval、minval:計(jì)算一個(gè)向量的最大值、最小值。
rand16:向量隨機(jī)數(shù)產(chǎn)生器。
rand16init:初始化向量隨機(jī)數(shù)產(chǎn)生器。
mul32:Q31數(shù)與Q31數(shù)向量乘法,結(jié)果為Q31數(shù)據(jù)。
pow:求平方。
(6)三角函數(shù)。
sine:使用泰勒級數(shù)計(jì)算一個(gè)向量的正弦。
(7)矩陣運(yùn)算函數(shù)。
mmul:矩陣乘法。
mtrans:矩陣轉(zhuǎn)置。
(8)其他雜函數(shù),如數(shù)據(jù)格式轉(zhuǎn)換等。
fltoq15:浮點(diǎn)數(shù)轉(zhuǎn)化為Q15格式數(shù)。
q15tofl:Q15格式數(shù)轉(zhuǎn)化為浮點(diǎn)數(shù)。
在c:\ti\docs\pdf下的spra480b.pdf文檔中,詳細(xì)說明了這些函數(shù)的用法。在c:\ti\c5400\dsplib\EXAMPLES文件夾中還列出了這些函數(shù)的應(yīng)用示例,閱讀這些函數(shù)和應(yīng)用示例將大大提高對算法的編程和應(yīng)用能力。
7.2
C程序編譯
C語言開發(fā)的程序具有可移植性好的特點(diǎn),除底層的硬件控制和對時(shí)間有嚴(yán)格要求的函數(shù)外,一般盡可能用C語言開發(fā),以加快DSP的開發(fā)速度,同時(shí)使程序的修改和移植也變得非常容易。
C語言代碼通過C編譯器先轉(zhuǎn)化為匯編程序,然后由匯編器編譯轉(zhuǎn)化為機(jī)器執(zhí)行碼。在將C語言編譯成匯編程序時(shí),有一些固定的規(guī)則,學(xué)習(xí)這些規(guī)則對優(yōu)化代碼和混合編程都非常有好處。7.2.1
C編譯器生成的段
C54x有兩種存儲器:程序存儲器和數(shù)據(jù)存儲器,程序存儲器包含可執(zhí)行代碼,數(shù)據(jù)存儲器包含外部變量、靜態(tài)變量和系統(tǒng)堆棧等。C編譯器對C語言進(jìn)行編譯后,生成若干個(gè)
可以進(jìn)行重新定位的代碼和數(shù)據(jù)塊。除了生成3個(gè)基本的段.text、.data、.bss外,還有.cinit、.const、.stack、.sysmem段等。這些段分為兩類:已初始化段和未初始化段。已初始化段主要包含可執(zhí)行代碼和數(shù)據(jù)表,C編譯器共創(chuàng)建4種已初始化段。
(1).text段:包含可執(zhí)行代碼、字符串及編譯器產(chǎn)生的
常數(shù)。
(2).cinit段:包含初始化變量和常數(shù)表。
(3).const段:包含字符串和用const定義的常量。
(4).switch段:包含用.switch語句建立的表格。未初始化段用于為變量或函數(shù)執(zhí)行分配存儲空間,但沒有初始化,程序利用這些空間在運(yùn)行時(shí)創(chuàng)建和存儲變量,C編譯器共創(chuàng)建3種未初始化段。
(1).bss段:為全局變量和靜態(tài)變量分配存儲空間。在
程序啟動(dòng)后,C語言初始化引導(dǎo)程序?qū)?shù)據(jù)從.cinit段復(fù)制到
.bss段。
(2).stack段:為C語言堆棧分配存儲空間,用于傳遞變量、分配局部變量和保護(hù)函數(shù)現(xiàn)場等。
(3).sysmem段:為動(dòng)態(tài)存儲器函數(shù)malloc、calloc和realloc分配存儲器空間。若C語言沒有用到這些函數(shù),編譯器就不創(chuàng)建這個(gè)模塊。
其中堆棧段主要完成以下功能:保護(hù)函數(shù)的返回地址、分配局部變量、傳遞函數(shù)變量、保護(hù)調(diào)用函數(shù)現(xiàn)場及其他一些臨時(shí)結(jié)果。C編譯器定義的堆棧大小默認(rèn)為1K字,也可以在連接命令行加上一個(gè)stack選項(xiàng)重新定義堆棧大小。C編譯器用堆棧指針(SP)指向堆棧的頂部。通常,.text、.cinit和.switch段必須映射到程序存儲器的PAGE0頁,具體存儲器可以是ROM或RAM;.const段必須映射到數(shù)據(jù)存儲器的PAGE1頁,具體存儲器可以是ROM或RAM;而.bss、.stack和.sysmem段必須映射到數(shù)據(jù)存儲器的PAGE1頁,具體存儲器只能是RAM。7.2.2
C編譯器的寄存器規(guī)則
在C語言環(huán)境中,不同的寄存器有不同的使用規(guī)則。在混合編程時(shí),如果遵守這些規(guī)則,可有效地提高編程效率和程序的執(zhí)行效率。
寄存器在使用上分兩類:進(jìn)入保存和調(diào)用保存。進(jìn)入保存是由被調(diào)用函數(shù)負(fù)責(zé)保存,調(diào)用函數(shù)自由使用;調(diào)用保存是由調(diào)用函數(shù)分組保存,被調(diào)用函數(shù)自由使用。寄存器的使用和保護(hù)規(guī)則如表7.2所示。從表7.2中可以看出,被調(diào)用函數(shù)需保護(hù)AR1、AR6和AR7,其余寄存器由調(diào)用函數(shù)保護(hù),所以調(diào)用函數(shù)只可自由地使用AR1、AR6、AR7。要使用其他寄存器,需在調(diào)用函數(shù)前壓棧保護(hù)。調(diào)用函數(shù)執(zhí)行完畢后再恢復(fù)為原來的值,而被調(diào)用函數(shù)則相反。SP無論是在調(diào)用函數(shù)還是被調(diào)用函數(shù)中,都不允許自由使用,但可以用匯編指令“FRAME#k”來管理。7.2.3
C程序的系統(tǒng)初始化
C程序在運(yùn)行之前,必須創(chuàng)建C語言的運(yùn)行環(huán)境,創(chuàng)建過程由C初始化程序完成,其函數(shù)名為c_int00。
這個(gè)函數(shù)包含在rts.lib的運(yùn)行支持庫中,rts.lib庫中函數(shù)的源代碼都包含在rts.src中。要調(diào)用c_int00函數(shù),只需在鏈接器使用“l(fā)rts.lib”選項(xiàng)即可,也可手動(dòng)將其加入到項(xiàng)目中。c_int00初始化C語言運(yùn)行環(huán)境時(shí)主要完成以下工作:
(1)為系統(tǒng)堆棧定義.stack段,并初始化堆棧指針。
(2)將.cinit段的初始化數(shù)據(jù)復(fù)制到.bss段中,對全局變量和靜態(tài)變量進(jìn)行初始化。
(3)調(diào)用main()函數(shù),開始運(yùn)行程序。
7.3
C語言與匯編語言混合編程
C語言是一種通用編程語言,適用于對時(shí)間要求不高的場合。但如果運(yùn)算時(shí)間非常緊張,C編譯器則很難充分利用DSP獨(dú)特的硬件結(jié)構(gòu)來提高執(zhí)行效率,如充分利用循環(huán)尋址、位反轉(zhuǎn)尋址等。另外,C語言對底層的硬件操作比較困難,甚至無法實(shí)現(xiàn),而用匯編語言編程則比較容易,如初始化McBSP接口等。因此,采用C語言與匯編語言混合編程能充分發(fā)揮兩者的優(yōu)勢,達(dá)到最佳的效果。7.3.1混合編程方式
(1)獨(dú)立編寫C程序和匯編程序,只要兩者的接口滿足函數(shù)調(diào)用要求,就不會相互影響。如FFT程序一般先用匯編語言編寫,然后在C程序中調(diào)用。只要調(diào)用函數(shù)和FFT函數(shù)都滿足函數(shù)調(diào)用規(guī)則就能實(shí)現(xiàn)混合編程,達(dá)到優(yōu)勢互補(bǔ)的目的。(2)直接在C程序的相應(yīng)位置插入?yún)R編語句。這類匯編語句一般是對硬件進(jìn)行操作,要求不能對C環(huán)境造成影響。如下面一條語句是在C程序中設(shè)置開中斷:
asm(″ RSBXINTM″); //開中斷7.3.2
C程序訪問匯編變量
C文件定義的變量名在編譯時(shí)均在名稱前加一下劃線“_”,以區(qū)別匯編文件定義的變量名,C文件中定義的函數(shù)名也如此。這樣即使兩種文件的變量名和函數(shù)名相同,也不
會產(chǎn)生沖突。變量名和函數(shù)名經(jīng)編譯后都代表變量的存儲地址和函數(shù)的入口地址,由此可推出C文件與匯編文件相互訪問的方法。要使C文件能訪問匯編變量和函數(shù),則需要在匯編文件定義這些變量名和函數(shù)名時(shí),在其名稱前加下劃線“_”,而在C文件引用時(shí)不要加下劃線,具體實(shí)現(xiàn)方式如下:
(1)在匯編文件.bss段定義匯編全局變量。
①用.bss段定義變量,并在變量前加一下劃線;
②用.global命令聲明外部變量;
③在C文件中聲明外部變量。例7.1
C程序訪問匯編變量。
①匯編文件定義:
.global_input;聲明全局變量,名稱必須包含“_”
.bss_input,1
②C文件引用:
externintinput//聲明外部變量及數(shù)量類型,變量名要去掉“_”input=ioport0002;//讀外部端口0x0002到input中
(2)訪問匯編常數(shù)表。
①用.sect段定義常數(shù)表,并在變量前加一下劃線;
②用.global命令聲明外部變量;
③在C文件中聲明外部指針。
聲明的指針像C文件定義的指針一樣使用。例7.2
C程序訪問匯編常數(shù)表。
①匯編文件定義:
.global_sine;聲明全局變量,名稱必須包含“_”
.sect″sine_table″
_sine:
.word0x0,0x5a82,0x7fff,0x5a82,0x0,0xa57f,0x8002,0xa57f
;8點(diǎn)正弦表②C文件引用:
externintsine[]//聲明外部指針及數(shù)量類型,變量名要去掉“_”
for(i=0;i<8;i++)
x=sine[i];
(3)訪問匯編常數(shù)。
①用.set定義常數(shù),并在變量前加一下劃線;
②用.global命令將其聲明為外部變量;
③在C文件中用#define聲明常數(shù)。常數(shù)名前去掉“_”,但在其前加“&”,表示取地址。匯編文件定義的常數(shù)像C文件定義的常數(shù)一樣使用。例7.3
C程序訪問匯編常數(shù)。
①匯編文件定義:
.global_table_size,_sine
_table_size .set8//匯編文件定義的常數(shù)
_sine:
.word0x0,0x5a82,0x7fff,0x5a82,0x0,0xa57f,0x8002,0xa57f
;8點(diǎn)正弦表②C文件引用:
externintsine[]
#defineTABLE_SIZE(int)(&table_size)//C文件引用匯編常數(shù)
for(i=0;i<TABLE_SIZE;i++)
x=
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 離心風(fēng)機(jī)課程設(shè)計(jì)
- 液壓絞車設(shè)計(jì)課程設(shè)計(jì)
- 托班季節(jié)認(rèn)知課程設(shè)計(jì)
- 智能機(jī)械臂課程設(shè)計(jì)
- 幼兒弓箭課程設(shè)計(jì)
- 有關(guān)化合物的課程設(shè)計(jì)
- 液壓升降舞臺課程設(shè)計(jì)
- 振動(dòng)輸送機(jī)課程設(shè)計(jì)
- 瓶蓋注塑模課程設(shè)計(jì)
- 精準(zhǔn)引流營銷課程設(shè)計(jì)
- 《中國陶瓷鑒賞與器物陳設(shè)》復(fù)習(xí)考試題庫(帶答案)
- 五金標(biāo)準(zhǔn)件手冊
- 《財(cái)務(wù)共享實(shí)務(wù)》課程期末考試題庫及答案
- 氮?dú)饩彌_罐安全操作規(guī)程
- 金工釩鈦科技有限公司-年處理600萬噸低品位釩鈦磁鐵礦選礦項(xiàng)目可行性研究報(bào)告
- 博物館綜合安保系統(tǒng)技術(shù)方案-工程投標(biāo)型
- 1紀(jì)委監(jiān)委執(zhí)紀(jì)審查案件卷宗模版檢查卷模版
- 急診科建設(shè)與管理指南2023年
- 2023北京市第一次高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試卷真題(含答案詳解)
- 九年級語文上學(xué)期教學(xué)工作總結(jié)
- 偉大的《紅樓夢》智慧樹知到答案章節(jié)測試2023年
評論
0/150
提交評論