




已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2019/7/16,第13章匯編語言與C/C+的混合編程,1,8086/8088和ARM核匯編語言程序設(shè)計(jì),第13章 匯編語言與C/C+的混合編程,2019/7/16,第13章匯編語言與C/C+的混合編程,2,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,13.2 匯編語言與C/C+語言的連接,第13章 匯編語言與C/C+的混合編程,2019/7/16,第13章匯編語言與C/C+的混合編程,3,調(diào)用協(xié)議是指在進(jìn)行了程序調(diào)用時(shí),主程序向子程序傳遞參數(shù)以及從子程序獲得返回值的方式。通常使用系統(tǒng)堆棧向子程序傳遞入口參數(shù),而使用CPU內(nèi)部寄存器來保存子程序的返回值。 采用C/C+語言調(diào)用協(xié)議調(diào)用一個(gè)子程序時(shí),是按照調(diào)用參數(shù)表自右向左的順序?qū)⒆映绦蛉肟趨?shù)壓入堆棧的。,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,2019/7/16,第13章匯編語言與C/C+的混合編程,4,例如在C語言源程序中有子程序max(a,b,c),則是參數(shù)c最先入棧,然后是參數(shù)b入棧,最后是參數(shù)a入棧,且位于棧頂,堆棧的地址變化是向下增長的,最后一個(gè)進(jìn)入堆棧的參數(shù)總在內(nèi)存的低端它的地址BP+偏移量。其中偏移量在小緊湊模式下是4,在中/大/巨模式下是6。C傳遞到匯編的參數(shù)若是基本數(shù)據(jù)類型之一,則該參數(shù)實(shí)際值被拷貝到堆棧中,執(zhí)行匯編語言子程序時(shí),將從堆棧中取出其參數(shù)的值,對于結(jié)構(gòu)類型變量,如數(shù)組等,則將指向該結(jié)構(gòu)變量的地址指針傳送到堆棧中。表13.1指出了各基本數(shù)據(jù)類型在堆棧中所占的字節(jié)數(shù)。,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,2019/7/16,第13章匯編語言與C/C+的混合編程,5,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,表13.1 C語言中各種類型變量在棧中所占的字節(jié)數(shù),2019/7/16,第13章匯編語言與C/C+的混合編程,6,13.1.2 返回參數(shù)傳遞規(guī)則,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,經(jīng)匯編程序處理的結(jié)果通過AX和DX寄存器返回給C主程序。一般情況下只需通過AX寄存器即可將匯編程序的返回值傳遞給C程序,對于長整型數(shù)還需使用DX寄存器。至于結(jié)構(gòu)變量、浮點(diǎn)數(shù)、雙精度數(shù),則存放在一塊靜態(tài)存儲區(qū)內(nèi),用AX和DX返回指向它們的指針。C程序中的接受變量應(yīng)與返回值類型一致,返回值與寄存器的對應(yīng)關(guān)系見表13.2 。,2019/7/16,第13章匯編語言與C/C+的混合編程,7,13.1.2 返回參數(shù)傳遞規(guī)則,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,表13.2 C程序返回值與匯編語言寄存器對應(yīng)關(guān)系,2019/7/16,第13章匯編語言與C/C+的混合編程,8,13.1 C/C+語言參數(shù)調(diào)用協(xié)議,第13章 匯編語言與C/C+的混合編程,13.2 匯編語言與C/C+語言的連接,2019/7/16,第13章匯編語言與C/C+的混合編程,9,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,所謂模塊連接法是指將匯編語言源程序和高級語言源程序分別編譯成目標(biāo)文件,再將目標(biāo)文件進(jìn)行連接,形成可執(zhí)行文件的編程方法。 要使匯編語言模塊和C語言模塊正確地連接到一起,必須做到兩點(diǎn):首先是匯編模塊必須采用和C模塊一致的存儲模式;其次匯編模塊還必須遵守和C語言兼容的命名約定,命名約定包括段組命名約定和函數(shù)變量量命名約定。,2019/7/16,第13章匯編語言與C/C+的混合編程,10,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,1、存儲模式,C語言的存儲模式和匯編語言相同,共有六種不同的存儲模式:微模式(TINY),小模式(SMALL),中模式(MEDIUM ),緊湊模式(COMPACT),大模式(LARGE)和超大模式(HUGE)。在混合編程時(shí)應(yīng)該保持匯編語言和C的存儲模式一致。這里尤其要注意的是:在小模式下所有的指針都是near型的近指針,而數(shù)據(jù)/堆棧和代碼可以各占一個(gè)段空間,這樣運(yùn)算速度快而且可用空間也大,程序運(yùn)行效率最高。所以,應(yīng)該盡量采用小模式進(jìn)行混合編程。,2019/7/16,第13章匯編語言與C/C+的混合編程,11,2、標(biāo)識符命名約定,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,在一般情況下,由C語言編譯器所編譯出的源程序目標(biāo)碼中,缺省時(shí)自動在所有標(biāo)識符前面加一個(gè)下劃線。這一點(diǎn)可以在所有的C語言程序編譯后所產(chǎn)生的匯編碼中清楚地看到。因此,在編寫能被C語言程序調(diào)用的匯編語言程序時(shí),必須將與C語言程序調(diào)用相關(guān)的標(biāo)識符前面也加上下劃線,才能取得和C語言程序的一致性。另外,在使用中還應(yīng)注意以下問題:匯編語言子程序中供C語言程序使用的變量,除了在標(biāo)識符前加下劃線外,還必須用public說明為:public _變量名;匯編語言子程序變量的定義必須與C語言程序中變量的說明一致;在供C語言程序調(diào)用的匯編子程序中,必須用public偽操作指明該子程序是可以供外部模塊調(diào)用的,說明為public _過程名;為了在C語言程序中引用匯編語言子程序和變量,在C程序中應(yīng)使用extern語句聲明。,2019/7/16,第13章匯編語言與C/C+的混合編程,12,3、C程序和匯編程序連接,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,根據(jù)上面的有關(guān)約定,下面給出C程序調(diào)用匯編語言子程序的主要步驟。 匯編語言子程序的編寫和處理 (1)使用和C相同的存儲模式定義各個(gè)段空間,沒有用到的段可以不定義;(2) 在匯編語言源程序中用PUBLIC偽指令聲明C需要引用的子程序和變量;(3)按照C語言調(diào)用協(xié)議從堆棧中取得入口參數(shù);(4)對參數(shù)進(jìn)行處理,實(shí)現(xiàn)相應(yīng)的功能;(5)將返回值送入AX,DX,或者DX:AX中返回;(6)將匯編源程序編譯成目標(biāo)文件(.obj)。 C程序的編寫和處理 (1)在Turbo CC+Borland C+集成開發(fā)環(huán)境中編寫C主程序, 并在主源程序中用extern聲明匯編語言子程序和變量;(2)建立項(xiàng)目文件PRJ,使其包含C主程序和匯編子程序目標(biāo)文件名(.obj);(3)將集成開發(fā)環(huán)境的Project/project name設(shè)為C主程序名.prj,并且將編譯模式子菜單設(shè)為要求的編譯模式;(4)用Compiler/Make EXE file 子菜單或直接按F9,生成可執(zhí)行文件.EXE。,2019/7/16,第13章匯編語言與C/C+的混合編程,13,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,例13.1 匯編語言程序?qū)崿F(xiàn)將C語言程序中的整型變量num加1,并返回給C程序。程序如下: /*C程序*/ int num=0; extern void incnum(void); main() int i; for (i=0;i10;i+) incnum(); printf(“%d”,num); ,;匯編程序 model small EXTERN _num:word PUBLIC _incnum .code _incnum proc inc _num ret _incnum endp end,程序運(yùn)行結(jié)果為:12345678910,2019/7/16,第13章匯編語言與C/C+的混合編程,14,例13.3 C語言程序和采用完整段定義形式實(shí)現(xiàn)的匯編程序的連接。下面的程序?qū)崿F(xiàn)求2個(gè)整數(shù)中的最大數(shù)并輸出。,13.2.1模塊連接法,13.2 匯編語言與C/C+語言的連接,/*C程序*/ extern int max(int,int); main() int a=2,b=6; int maxunm; maxnum= max(a,b); printf(“two numbers are:%d and %d” a,b); printf(“n”); printf(“the max number is:%d”, maxunm); ,;匯編程序 _TEXT SEGMENT BYTE PUBLIC CODE ASSUME CS:_TEXT PUBLIC _max _max PROC NEAR PUSH BP MOV BP,SP MOV AX,BP+4 ;AX=函數(shù)的第一個(gè)參數(shù) CMP AX,BP+6 ;第一個(gè)參數(shù)和第二個(gè)參數(shù)比較 JGE OK MOV AX,BP+6 ;如果第一個(gè)參數(shù)比第二個(gè)參數(shù)小 OK: ;將大數(shù)送AX POP BP RET _max ENDP _TEXT ENDS END,2019/7/16,第13章匯編語言與C/C+的混合編程,15,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,所謂嵌入式匯編是指將匯編語言代碼直接放入C語言程序中的一種混合編程方法。嵌入式匯編提供了一種簡單而又明快的方法,匯編語言代碼的高速性和深層控制能力可以大大改善程序的性能,同時(shí)也避免了C語言與匯編語言的接口所固有的復(fù)雜性。當(dāng)然這也多少比單用匯編語言編寫的模塊多一些開銷,但這比起由嵌入式匯編所帶來的效益是微不足道的。本節(jié)以Turbo C來說明如何在C語言程序中使用嵌入式匯編。,2019/7/16,第13章匯編語言與C/C+的混合編程,16,Turbo C的嵌入式匯編可以滿足用戶的各種愿望,可以將匯編碼直接放入C語言程序的任何位置,嵌入的匯編碼可以全面地訪問C語言程序中的常量、變量、甚至函數(shù),嵌入式匯編可以極大地改善程序的性能,與用嚴(yán)格的匯編語言編寫出的程序幾乎具有同樣強(qiáng)大的功能。在Turbo C的高性能函數(shù)庫中有相當(dāng)一部分的程序代碼是使用嵌入式匯編完成的。,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,2019/7/16,第13章匯編語言與C/C+的混合編程,17,嵌入式匯編的語句格式,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,嵌入式匯編語句的一般格式是: asm 標(biāo)號 ;或者;新語句行 下面對匯編語句格式進(jìn)行以下說明: (1)asm項(xiàng)是每個(gè)嵌入式匯編語句開頭必須的關(guān)鍵字; (2)標(biāo)號項(xiàng)是一個(gè)有效的匯編標(biāo)號,與普通的匯編語言格式一樣,標(biāo)號是可選項(xiàng); (3)指令/偽指令項(xiàng)是任何一條有效的8086指令或者匯編語言偽指令; (4)操作數(shù)項(xiàng)是CPU內(nèi)部寄存器或者C源程序中定義的變量、常量或標(biāo)號; (5);或者;新語句行項(xiàng)表示嵌入式匯編語句的結(jié)束,可選項(xiàng)。嵌入式匯編語句結(jié)束的方法有兩種,一是象普通的C語句一樣以分號“;”結(jié)束;也可以采用匯編語言指令一樣直接以換行符結(jié)束。在同一水平行內(nèi)可有多條嵌入式匯編語句匯編語句,這時(shí)語句間必須以分號“;”分隔,但是一條嵌入式匯編語句不能被分割為多行文本。還應(yīng)注意不能再用分號“;”來表示匯編注釋的開始,注釋應(yīng)采用C語言的標(biāo)準(zhǔn)注釋* . *來表示。,第13章匯編語言與C/C+的混合編程,18,2.嵌入式匯編的編譯,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,使用嵌入式匯編的C程序,編譯時(shí)需要使用B(大寫)選擇項(xiàng),在Turbo C中,進(jìn)行編譯命令的格式為TCCB。若不使用一B選擇項(xiàng),編譯器一遇到嵌入式匯編代碼,就給出警告信息,并以B選擇項(xiàng)重新進(jìn)行編譯,在C程序中加上即#pragma inline語句,作用與B選擇項(xiàng)等價(jià)。編譯時(shí)嵌入式匯編語句中操作碼和操作數(shù)將直接復(fù)制到由C源程序產(chǎn)生的匯編文件,其中涉及的C符號用適當(dāng)?shù)牡葍r(jià)匯編符號代替。另外,必須有Turbo As sember(TASM)程序,C編譯器首先產(chǎn)生匯編源文件,然后調(diào)用TASM產(chǎn)生目標(biāo)文件(.obj),進(jìn)一步生成.EXE文件。,2019/7/16,第13章匯編語言與C/C+的混合編程,19,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,3.嵌入式匯編的舉例,例13.5 實(shí)現(xiàn)下列函數(shù),0 x 0 1 x0,y=,函數(shù)表達(dá)式中x,y均為整數(shù),用嵌入式匯編實(shí)現(xiàn)。,2019/7/16,第13章匯編語言與C/C+的混合編程,20,13.2.2嵌入式匯編法,13.2 匯編語言與C/C+語言的連接,程序如下: #pragma inline main()
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 白酒回購合同協(xié)議合同書
- 景觀綠化工程服務(wù)合同
- 購銷合同貨物清單
- 邊坡防護(hù)工程勞務(wù)合同
- 用圖形進(jìn)行編碼(教學(xué)設(shè)計(jì))2024-2025學(xué)年四年級上冊信息技術(shù)蘇科版
- 8 比尾巴(教學(xué)設(shè)計(jì))2024-2025學(xué)年語文一年級上冊統(tǒng)編版
- 人教版初中歷史與社會七年級下冊 6.3.2草原風(fēng)情 教學(xué)設(shè)計(jì)
- 浙江工商大學(xué)杭州商學(xué)院《供應(yīng)鏈管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南經(jīng)貿(mào)外事職業(yè)學(xué)院《生物技術(shù)專業(yè)文獻(xiàn)檢索與科技論文寫作》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國藥科大學(xué)《單片機(jī)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 《教育強(qiáng)國建設(shè)規(guī)劃綱要(2024-2035年)》解讀與專題培訓(xùn)
- 2024年湖南公務(wù)員考試申論試題(省市卷)
- 2025年春新人教版化學(xué)九年級下冊課件 第九單元 溶液 1-課題1 溶液及其應(yīng)用 第1課時(shí) 溶液的形成
- 2024-2025學(xué)年高中物理第十二章機(jī)械波4波的衍射和干涉課時(shí)作業(yè)含解析新人教版選修3-4
- 2025年新華師大版數(shù)學(xué)七年級下冊全冊導(dǎo)學(xué)案
- 《供熱工程》課件
- 倉管員業(yè)務(wù)技能培訓(xùn)
- 安全管理人員七大職責(zé)
- 《國民經(jīng)濟(jì)行業(yè)分類與代碼》
- 音樂教育國際化進(jìn)程-洞察分析
- 江蘇省中小學(xué)生金鑰匙科技競賽(初中組)考試題及答案
評論
0/150
提交評論