




已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,1,8086/8088和ARM核匯編語(yǔ)言程序設(shè)計(jì),第13章 匯編語(yǔ)言與C/C+的混合編程,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,2,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,第13章 匯編語(yǔ)言與C/C+的混合編程,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,3,調(diào)用協(xié)議是指在進(jìn)行了程序調(diào)用時(shí),主程序向子程序傳遞參數(shù)以及從子程序獲得返回值的方式。通常使用系統(tǒng)堆棧向子程序傳遞入口參數(shù),而使用CPU內(nèi)部寄存器來(lái)保存子程序的返回值。 采用C/C+語(yǔ)言調(diào)用協(xié)議調(diào)用一個(gè)子程序時(shí),是按照調(diào)用參數(shù)表自右向左的順序?qū)⒆映绦蛉肟趨?shù)壓入堆棧的。,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,4,例如在C語(yǔ)言源程序中有子程序max(a,b,c),則是參數(shù)c最先入棧,然后是參數(shù)b入棧,最后是參數(shù)a入棧,且位于棧頂,堆棧的地址變化是向下增長(zhǎng)的,最后一個(gè)進(jìn)入堆棧的參數(shù)總在內(nèi)存的低端它的地址BP+偏移量。其中偏移量在小緊湊模式下是4,在中/大/巨模式下是6。C傳遞到匯編的參數(shù)若是基本數(shù)據(jù)類型之一,則該參數(shù)實(shí)際值被拷貝到堆棧中,執(zhí)行匯編語(yǔ)言子程序時(shí),將從堆棧中取出其參數(shù)的值,對(duì)于結(jié)構(gòu)類型變量,如數(shù)組等,則將指向該結(jié)構(gòu)變量的地址指針傳送到堆棧中。表13.1指出了各基本數(shù)據(jù)類型在堆棧中所占的字節(jié)數(shù)。,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,5,13.1.1 入口參數(shù)傳遞規(guī)則,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,表13.1 C語(yǔ)言中各種類型變量在棧中所占的字節(jié)數(shù),2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,6,13.1.2 返回參數(shù)傳遞規(guī)則,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,經(jīng)匯編程序處理的結(jié)果通過(guò)AX和DX寄存器返回給C主程序。一般情況下只需通過(guò)AX寄存器即可將匯編程序的返回值傳遞給C程序,對(duì)于長(zhǎng)整型數(shù)還需使用DX寄存器。至于結(jié)構(gòu)變量、浮點(diǎn)數(shù)、雙精度數(shù),則存放在一塊靜態(tài)存儲(chǔ)區(qū)內(nèi),用AX和DX返回指向它們的指針。C程序中的接受變量應(yīng)與返回值類型一致,返回值與寄存器的對(duì)應(yīng)關(guān)系見(jiàn)表13.2 。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,7,13.1.2 返回參數(shù)傳遞規(guī)則,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,表13.2 C程序返回值與匯編語(yǔ)言寄存器對(duì)應(yīng)關(guān)系,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,8,13.1 C/C+語(yǔ)言參數(shù)調(diào)用協(xié)議,第13章 匯編語(yǔ)言與C/C+的混合編程,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,9,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,所謂模塊連接法是指將匯編語(yǔ)言源程序和高級(jí)語(yǔ)言源程序分別編譯成目標(biāo)文件,再將目標(biāo)文件進(jìn)行連接,形成可執(zhí)行文件的編程方法。 要使匯編語(yǔ)言模塊和C語(yǔ)言模塊正確地連接到一起,必須做到兩點(diǎn):首先是匯編模塊必須采用和C模塊一致的存儲(chǔ)模式;其次匯編模塊還必須遵守和C語(yǔ)言兼容的命名約定,命名約定包括段組命名約定和函數(shù)變量量命名約定。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,10,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,1、存儲(chǔ)模式,C語(yǔ)言的存儲(chǔ)模式和匯編語(yǔ)言相同,共有六種不同的存儲(chǔ)模式:微模式(TINY),小模式(SMALL),中模式(MEDIUM ),緊湊模式(COMPACT),大模式(LARGE)和超大模式(HUGE)。在混合編程時(shí)應(yīng)該保持匯編語(yǔ)言和C的存儲(chǔ)模式一致。這里尤其要注意的是:在小模式下所有的指針都是near型的近指針,而數(shù)據(jù)/堆棧和代碼可以各占一個(gè)段空間,這樣運(yùn)算速度快而且可用空間也大,程序運(yùn)行效率最高。所以,應(yīng)該盡量采用小模式進(jìn)行混合編程。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,11,2、標(biāo)識(shí)符命名約定,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,在一般情況下,由C語(yǔ)言編譯器所編譯出的源程序目標(biāo)碼中,缺省時(shí)自動(dòng)在所有標(biāo)識(shí)符前面加一個(gè)下劃線。這一點(diǎn)可以在所有的C語(yǔ)言程序編譯后所產(chǎn)生的匯編碼中清楚地看到。因此,在編寫能被C語(yǔ)言程序調(diào)用的匯編語(yǔ)言程序時(shí),必須將與C語(yǔ)言程序調(diào)用相關(guān)的標(biāo)識(shí)符前面也加上下劃線,才能取得和C語(yǔ)言程序的一致性。另外,在使用中還應(yīng)注意以下問(wèn)題:匯編語(yǔ)言子程序中供C語(yǔ)言程序使用的變量,除了在標(biāo)識(shí)符前加下劃線外,還必須用public說(shuō)明為:public _變量名;匯編語(yǔ)言子程序變量的定義必須與C語(yǔ)言程序中變量的說(shuō)明一致;在供C語(yǔ)言程序調(diào)用的匯編子程序中,必須用public偽操作指明該子程序是可以供外部模塊調(diào)用的,說(shuō)明為public _過(guò)程名;為了在C語(yǔ)言程序中引用匯編語(yǔ)言子程序和變量,在C程序中應(yīng)使用extern語(yǔ)句聲明。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,12,3、C程序和匯編程序連接,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,根據(jù)上面的有關(guān)約定,下面給出C程序調(diào)用匯編語(yǔ)言子程序的主要步驟。 匯編語(yǔ)言子程序的編寫和處理 (1)使用和C相同的存儲(chǔ)模式定義各個(gè)段空間,沒(méi)有用到的段可以不定義;(2) 在匯編語(yǔ)言源程序中用PUBLIC偽指令聲明C需要引用的子程序和變量;(3)按照C語(yǔ)言調(diào)用協(xié)議從堆棧中取得入口參數(shù);(4)對(duì)參數(shù)進(jìn)行處理,實(shí)現(xiàn)相應(yīng)的功能;(5)將返回值送入AX,DX,或者DX:AX中返回;(6)將匯編源程序編譯成目標(biāo)文件(.obj)。 C程序的編寫和處理 (1)在Turbo CC+Borland C+集成開(kāi)發(fā)環(huán)境中編寫C主程序, 并在主源程序中用extern聲明匯編語(yǔ)言子程序和變量;(2)建立項(xiàng)目文件PRJ,使其包含C主程序和匯編子程序目標(biāo)文件名(.obj);(3)將集成開(kāi)發(fā)環(huán)境的Project/project name設(shè)為C主程序名.prj,并且將編譯模式子菜單設(shè)為要求的編譯模式;(4)用Compiler/Make EXE file 子菜單或直接按F9,生成可執(zhí)行文件.EXE。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,13,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,例13.1 匯編語(yǔ)言程序?qū)崿F(xiàn)將C語(yǔ)言程序中的整型變量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章匯編語(yǔ)言與C/C+的混合編程,14,例13.3 C語(yǔ)言程序和采用完整段定義形式實(shí)現(xiàn)的匯編程序的連接。下面的程序?qū)崿F(xiàn)求2個(gè)整數(shù)中的最大數(shù)并輸出。,13.2.1模塊連接法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,/*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章匯編語(yǔ)言與C/C+的混合編程,15,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,所謂嵌入式匯編是指將匯編語(yǔ)言代碼直接放入C語(yǔ)言程序中的一種混合編程方法。嵌入式匯編提供了一種簡(jiǎn)單而又明快的方法,匯編語(yǔ)言代碼的高速性和深層控制能力可以大大改善程序的性能,同時(shí)也避免了C語(yǔ)言與匯編語(yǔ)言的接口所固有的復(fù)雜性。當(dāng)然這也多少比單用匯編語(yǔ)言編寫的模塊多一些開(kāi)銷,但這比起由嵌入式匯編所帶來(lái)的效益是微不足道的。本節(jié)以Turbo C來(lái)說(shuō)明如何在C語(yǔ)言程序中使用嵌入式匯編。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,16,Turbo C的嵌入式匯編可以滿足用戶的各種愿望,可以將匯編碼直接放入C語(yǔ)言程序的任何位置,嵌入的匯編碼可以全面地訪問(wèn)C語(yǔ)言程序中的常量、變量、甚至函數(shù),嵌入式匯編可以極大地改善程序的性能,與用嚴(yán)格的匯編語(yǔ)言編寫出的程序幾乎具有同樣強(qiáng)大的功能。在Turbo C的高性能函數(shù)庫(kù)中有相當(dāng)一部分的程序代碼是使用嵌入式匯編完成的。,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,17,嵌入式匯編的語(yǔ)句格式,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,嵌入式匯編語(yǔ)句的一般格式是: asm 標(biāo)號(hào) ;或者;新語(yǔ)句行 下面對(duì)匯編語(yǔ)句格式進(jìn)行以下說(shuō)明: (1)asm項(xiàng)是每個(gè)嵌入式匯編語(yǔ)句開(kāi)頭必須的關(guān)鍵字; (2)標(biāo)號(hào)項(xiàng)是一個(gè)有效的匯編標(biāo)號(hào),與普通的匯編語(yǔ)言格式一樣,標(biāo)號(hào)是可選項(xiàng); (3)指令/偽指令項(xiàng)是任何一條有效的8086指令或者匯編語(yǔ)言偽指令; (4)操作數(shù)項(xiàng)是CPU內(nèi)部寄存器或者C源程序中定義的變量、常量或標(biāo)號(hào); (5);或者;新語(yǔ)句行項(xiàng)表示嵌入式匯編語(yǔ)句的結(jié)束,可選項(xiàng)。嵌入式匯編語(yǔ)句結(jié)束的方法有兩種,一是象普通的C語(yǔ)句一樣以分號(hào)“;”結(jié)束;也可以采用匯編語(yǔ)言指令一樣直接以換行符結(jié)束。在同一水平行內(nèi)可有多條嵌入式匯編語(yǔ)句匯編語(yǔ)句,這時(shí)語(yǔ)句間必須以分號(hào)“;”分隔,但是一條嵌入式匯編語(yǔ)句不能被分割為多行文本。還應(yīng)注意不能再用分號(hào)“;”來(lái)表示匯編注釋的開(kāi)始,注釋應(yīng)采用C語(yǔ)言的標(biāo)準(zhǔn)注釋* . *來(lái)表示。,第13章匯編語(yǔ)言與C/C+的混合編程,18,2.嵌入式匯編的編譯,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,使用嵌入式匯編的C程序,編譯時(shí)需要使用B(大寫)選擇項(xiàng),在Turbo C中,進(jìn)行編譯命令的格式為TCCB。若不使用一B選擇項(xiàng),編譯器一遇到嵌入式匯編代碼,就給出警告信息,并以B選擇項(xiàng)重新進(jìn)行編譯,在C程序中加上即#pragma inline語(yǔ)句,作用與B選擇項(xiàng)等價(jià)。編譯時(shí)嵌入式匯編語(yǔ)句中操作碼和操作數(shù)將直接復(fù)制到由C源程序產(chǎn)生的匯編文件,其中涉及的C符號(hào)用適當(dāng)?shù)牡葍r(jià)匯編符號(hào)代替。另外,必須有Turbo As sember(TASM)程序,C編譯器首先產(chǎn)生匯編源文件,然后調(diào)用TASM產(chǎn)生目標(biāo)文件(.obj),進(jìn)一步生成.EXE文件。,2019/7/16,第13章匯編語(yǔ)言與C/C+的混合編程,19,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,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章匯編語(yǔ)言與C/C+的混合編程,20,13.2.2嵌入式匯編法,13.2 匯編語(yǔ)言與C/C+語(yǔ)言的連接,程序如下: #pragma inline main()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 南通理工學(xué)院《空間數(shù)據(jù)庫(kù)與數(shù)據(jù)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安市戶縣2024-2025學(xué)年小升初復(fù)習(xí)數(shù)學(xué)模擬試卷含解析
- 天津渤海職業(yè)技術(shù)學(xué)院《管理級(jí)案例》2023-2024學(xué)年第二學(xué)期期末試卷
- 計(jì)算機(jī)科學(xué)基礎(chǔ)知識(shí)2025年考試試卷及答案
- 2025年網(wǎng)絡(luò)安全管理考試試卷及答案
- 西安建筑科技大學(xué)《高等代數(shù)方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年物流管理師考試試題及答案
- 平頂山文化藝術(shù)職業(yè)學(xué)院《中西醫(yī)臨床診療技術(shù)預(yù)防醫(yī)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省南京市玄武區(qū)2025年高三下學(xué)期期末五校聯(lián)考試題含解析
- 內(nèi)蒙古北京八中學(xué)烏蘭察布分校2025屆中考第三次模擬考試物理試題含解析
- (三模)合肥市2025屆高三年級(jí)5月教學(xué)質(zhì)量檢測(cè)政治試卷(含答案解析)
- 陜西、山西省天一大聯(lián)考2024-2025學(xué)年高中畢業(yè)班階段性測(cè)試(七)語(yǔ)文試題及答案
- 運(yùn)動(dòng)素質(zhì)知到課后答案智慧樹章節(jié)測(cè)試答案2025年春浙江大學(xué)
- 租房合同范本下載(可直接打印)
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 2024年上海市普通高中學(xué)業(yè)水平等級(jí)性考試化學(xué)試卷(含答案)
- 駕照體檢表完整版本
- 高考語(yǔ)文作文素材:《典籍里的中國(guó)》課件33張
- 2022年道路交通安全防汛工作應(yīng)急預(yù)案
- 思政課社會(huì)實(shí)踐報(bào)告1500字6篇
- 電池PCBA規(guī)格書
評(píng)論
0/150
提交評(píng)論