下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、dsp編程技巧之24 在c/c+與匯編語言混合編程的狀況下,普通我們都會挑選c/c+來實現(xiàn)所期盼的大部分功能,對于少數(shù)和硬件關(guān)聯(lián)度高(例如操作某些cpu寄存器)以及對運算的實時性要求高(例如高速、多點的fft)的功能才用法匯編來實現(xiàn),這就使得大多數(shù)狀況下,c/c+與匯編的交互都是從c/c+代碼調(diào)用匯編代碼中的函數(shù)與變量,所以在此我們就來看一下這種調(diào)用的規(guī)章。 1.從c/c+中調(diào)用匯編代碼中的函數(shù)假如一個在匯編代碼中定義的函數(shù)需要在c/c+中被調(diào)用,那么這個匯編函數(shù)相對于c/c+代碼來說,相當于一個外部的函數(shù),所以需要用法extern "c"關(guān)鍵字舉行特殊聲明,使得編譯器和鏈
2、接器能夠知道這個函數(shù)并不存在于當前的c/c+代碼中。注:(1)假如c/c+中的函數(shù)需要在匯編代碼中被調(diào)用,則在c/c+代碼中,同樣需要用法extern "c"關(guān)鍵字舉行特殊聲明,這也是extern關(guān)鍵字的多用途所在。(2)在c+程序中,extern "c"聲明用來告知編譯器用法的命名規(guī)章,而不是用法c+中的函數(shù)命名轉(zhuǎn)換(name mangling)在鏈接時對函數(shù)名舉行修改,不然就找不到對應(yīng)的匯編函數(shù)了(mangle在英語中是“亂砍”的意思,可以據(jù)此想象一下它的效果,不知道當時發(fā)明c+語言的人是怎么想到的。)。舉例解釋一個匯編函數(shù)asmfunc是如何在c+
3、中的main函數(shù)中被調(diào)用的:c/c+代碼:extern "c"extern int asmfunc(int a); /* 聲明外部的匯編函數(shù)*/int gvar = 0; /*定義全局變量*/void main()int i = 5;i = asmfunc(i); /*調(diào)用匯編函數(shù) */匯編代碼中的匯編函數(shù)定義:.global _gvar.global _asmfunc_asmfunc:movz dp,_gvaraddb al,5mov _gvar,allretr當鏈接器從符號表中解析到.global _asmfunc這條語句的時候,它就可以把匯編代碼中的asmfunc函數(shù)
4、與c/c+中調(diào)用的匯編函數(shù)給關(guān)聯(lián)上了。2.用法內(nèi)聯(lián)函數(shù)法調(diào)用匯編函數(shù)這種辦法普通用于引用單條的匯編語句,例如:asm("* this is an assembly language comment");上面例子并沒有影響任何的變量,它的作用只是在c/c+代碼編譯成匯編代碼之后,在相對應(yīng)的位置插入了一端匯編代碼的注釋,對調(diào)試特殊有協(xié)助。固然,我們也可以插入特定的匯編函數(shù)進完成特定的功能。例如,在的編程中,我們常常用法的eallow和edis語句其實就是這種辦法的典型例子,只不過為了書寫的簡便,我們在頭文件中舉行了容易的轉(zhuǎn)換:define eallow asm(" e
5、allow")define edis asm(" edis")用法這樣的內(nèi)聯(lián)函數(shù)調(diào)用辦法,必需銘記以下五點:(1) 該辦法有可能會破壞代碼的優(yōu)化效果。請參考(2) 不要內(nèi)嵌匯編中的跳轉(zhuǎn)或者標志(label)等命令或者偽命令,它會寄存器的值,造成不行預(yù)料的結(jié)果。(3) 不要在內(nèi)嵌的匯編語句中轉(zhuǎn)變c/c+變量的值,由于有可能會產(chǎn)生意料之外的結(jié)果。(4) 不要在內(nèi)嵌的匯編語句中用法匯編語言的指示性命令(directives)。(5) 避開在c代碼中用法內(nèi)嵌匯編語句定義匯編的宏,同時用法-debug:dwarf (即-g)選項來編譯,由于二者是不兼容的。-g選項的含義可參
6、考3.從c/c+中調(diào)用匯編代碼中的變量或者常量為了調(diào)試等功能的便利,有時候我們需要挺直在c/c+代碼中用法匯編代碼中的變量值或者狀態(tài)等。按照匯編變量/常量的類型,詳細的調(diào)用的辦法也不一樣。3.1 調(diào)用匯編中的全局變量從c/c+中調(diào)用匯編中的全局變量的辦法與調(diào)用匯編函數(shù)的辦法類似,都是比較直觀的:(1) 在匯編中用法.bss或者.usect命令定義變量(2) 在匯編中用法.def或者.global命令把變量聲明為全局變量(3) 在匯編中用法特點的鏈接命名規(guī)章(可參考(4) 在c/c+中,用extern聲明在匯編中已經(jīng)定義的變量,然后就根據(jù)普通變量的用法規(guī)章舉行調(diào)用即可。例如,在匯編代碼中定義全局
7、變量var:.bss _var,1 ; 定義變量.global _var ; 聲明為全局類型在c代碼中調(diào)用該變量:extern int var; /* 聲明var為外部變量 */var = 1; /* 用法匯編變量 */3.2 調(diào)用匯編中的常量變量constant與常量的一個顯著區(qū)分是,編譯器編譯產(chǎn)生的符號表中會包含變量的地址,所以在對變量舉行引用時,編譯器可以挺直從符號表中找到對應(yīng)的地址;但是對匯編常量而言,符號表中保存的是它的值,而不是它的地址,所以假如在c/c+中挺直用法匯編常量的名字,需要用法取地址符才干得到正確的值:用c/c+語言編程的話自然不會生疏,即假如x是匯編代碼中的常量,需要
8、在c/c+中用法&x對其舉行調(diào)用才干得到正確的結(jié)果;調(diào)用的規(guī)章與變量是一樣的。例如,在匯編代碼中定義常量table_size:_table_size .set 10000 ; 定義常量table_size=10000.global _table_size ; 聲明為全局類型在c代碼中調(diào)用該變量:extern int table_size; /*聲明外部引用,并且用法鏈接命名規(guī)章*/define table_size (int) (&table_size). /* 用&來引用匯編常量,用define來避開每次書寫& */.for (i=0; i4. 在匯編代碼中分
9、享c/c+的頭文件既然是c/c+與匯編代碼的交互,那么就要既有“來”,又有“往”,我們可以通過在匯編代碼中用法.cdecls命令聲明某些變量,從而通知編譯器把c/c+頭文件中的這些變量轉(zhuǎn)換為匯編代碼可以用法的信息。其調(diào)用格式為:.cdecls options , " filename ", " filename2 ",.或者.cdecls options%/*-*/* c/c+ code - typically a list of includes and a few defines */*-*/%例如,在c/c+頭文件myheader.h中定義defi
10、ne want_id 10define name "johnn"extern int a_variable;extern float cvt_integer(int src);struct mycstruct int member_a; float member_b; ;enum status_enum ok = 1, fai = 256, running = 0 ;然后在匯編代碼中用法.cdecls就可以引用這頭文件了:.cdecls c,list,"myheader.h"size: .int $sizeof(mycstruct)aoffset: .int mycstruct.member_aboffset: .int mycstruct.member_bokvalue: .int status_enum.okfailval: .int status_enum.fai
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45068.1-2024數(shù)字化試衣系統(tǒng)性能評估第1部分:虛擬人體表示
- 廣東酒店管理職業(yè)技術(shù)學院《食品微生物綜合實訓(xùn)》2023-2024學年第一學期期末試卷
- 廣東金融學院《公司金融含實驗》2023-2024學年第一學期期末試卷
- 廣東建設(shè)職業(yè)技術(shù)學院《技術(shù)及應(yīng)用實驗》2023-2024學年第一學期期末試卷
- 廣東金融學院《小動物影像學》2023-2024學年第一學期期末試卷
- 網(wǎng)絡(luò)文明培訓(xùn)課件
- 《能源互聯(lián)網(wǎng)》課件
- 小班安全課件《狗狗來了》
- 廚具銷售培訓(xùn)課件
- 共青科技職業(yè)學院《現(xiàn)代基礎(chǔ)化學》2023-2024學年第一學期期末試卷
- 2025年初級會計職稱《經(jīng)濟法基礎(chǔ)》全真模擬及答案(解析3套)
- 2024年八年級班主任德育工作個人總結(jié)
- 《健康社區(qū)評價標準》
- 戶外市場研究報告-魔鏡洞察-202412
- 浙江省金華市金東區(qū)2023-2024學年九年級上學期語文期末試卷
- 【7地星球期末】安徽省合肥市包河區(qū)智育聯(lián)盟校2023-2024學年七年級上學期期末地理試題(含解析)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之2:“1至3章:范圍、術(shù)語和定義”(雷澤佳編制-2025B0)
- (2021)最高法民申5114號凱某建設(shè)工程合同糾紛案 指導(dǎo)
- 【9物(人)期末】安慶市宿松縣2023-2024學年九年級上學期期末考試物理試題
- 導(dǎo)航通信一體化考核試卷
- 甘肅省會寧二中2025屆高考仿真模擬數(shù)學試卷含解析
評論
0/150
提交評論