版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第10章 匯編語言與C/C++的混合編程,教學(xué)重點(diǎn),第10章介紹實(shí)際應(yīng)用當(dāng)中,常見的混合編程問題,重點(diǎn)是參數(shù)傳遞方法混合編程的兩種方式模塊連接的約定規(guī)則模塊連接的參數(shù)傳遞方法C++代碼優(yōu)化,什么是混合編程,多種程序設(shè)計(jì)語言間,通過相互調(diào)用、參數(shù)傳遞、共享數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)信息而形成程序的過程就是混合編程程序的大部分采用高級(jí)語言編寫,以提高程序的開發(fā)效率;在某些部分,利用匯編語言編寫,以提高程序的運(yùn)行效率,混合編程方法,嵌入式匯
2、編——在C/C++語言中直接使用匯編語言語句,簡潔直觀、功能較弱模塊連接——兩種語言分別編寫?yīng)毩⒌某绦蚰K,分別產(chǎn)生目標(biāo)代碼OBJ文件,然后進(jìn)行連接,形成一個(gè)完整的程序使用靈活、功能強(qiáng),要解決參數(shù)傳遞問題,混合編程的關(guān)鍵問題,建立不同語言之間的接口在不同格式的兩種語言間提供有效的通訊方式,作出符合兩種語言調(diào)用約定的某種形式說明,實(shí)現(xiàn)兩種語言間的程序模塊互相調(diào)用、變量的相互傳送以及參數(shù)和返回值的正確使用,7.1 Turbo C
3、嵌入式匯編方式,格式asm 操作碼 操作數(shù) 舉例asm mov ax,ds;asm pop ax; asm pop ds; asm ret;asm push ds,若干注意事項(xiàng),操作碼支持8086/8087指令或若干偽指令:db/dw/dd和extern 操作數(shù)是操作碼可接受的數(shù)據(jù):立即數(shù)、寄存器名,還可以是C語言程序中的常量、變量和標(biāo)號(hào)等內(nèi)嵌的匯編語句可以用分號(hào)“;”結(jié)束,也可以用換行符結(jié)束 使
4、用C的注釋,如 / * … * /正確運(yùn)用通用寄存器、標(biāo)號(hào)等,例7.2-1/2,/ * LT702.C */#include void upper(char *dest,char *src){asm mov si,src/* dest和src是地址指針 */asm mov di,destasm cldloop:asm lodsb/* C語言定義的標(biāo)號(hào) */asm cmp al,'a'a
5、sm jb copy/* 轉(zhuǎn)移到C的標(biāo)號(hào) */asm cmp al,'z'asm ja copy/* 不是’a’到’z’之間的字符原樣復(fù)制 */,例7.2-2/2,asm sub al,20h /*小寫字母轉(zhuǎn)換成大寫*/copy:asm stosbasm and al,al/* C語言中,字符串用NULL(0)結(jié)尾 */asm jnz loop}main()/* 主程序 */{cha
6、r str[]="This Started Out As Lowercase!";char chr[100];upper(chr,str);printf("Origin string:\n%s\n",str);printf("Uppercase String:\n%s\n",chr);},7.2 Turbo C模塊連接方式,要注意模塊連接的約定規(guī)則命名約定:匯編語言
7、過程應(yīng)采用C語言類型 聲明約定寄存器使用約定存儲(chǔ)模式約定:采用相同的存儲(chǔ)模式參數(shù)傳遞是關(guān)鍵通過堆棧傳遞入口參數(shù)通過寄存器返回出口參數(shù),例7.3-1/2,; 匯編語言子程序:lt703s.asm.model small,c;小型存儲(chǔ)模式.datamsgdb ’Hello, C and Assembly ! $’.codePUBLIC displaydisplayprocmov ah,9;小型模
8、式不必設(shè)置DSmov dx,offset msg;寄存器AX和DX無須保護(hù)int 21hretdisplayendpend,例7.3-2/2,/* C語言程序:lt703.c */extern void display(void);/* 說明display是外部函數(shù) */main(){ display();},利用匯編程序編譯匯編語言程序成目標(biāo)代碼文件:ML /c lt703s.asm利用
9、C編譯程序編譯C程序、連接目標(biāo)代碼文件:TCC -ms -Iinclude -Llib lt703.c lt703s.obj,例7.4-1/3,; 匯編語言子程序:lt704s.asm.model small,cPUBLIC min.codeminproc;小型模式,為近過程push bpmov bp,spmov ax,[bp+4];取第1個(gè)參數(shù)cmp ax,[bp+6] ;與第2個(gè)參數(shù)比較
10、jle minexitmov ax,[bp+6] ;保存返回值minexit: pop bpretminendpend,圖示,例7.4-2/3,; 匯編語言子程序:lt704.asm.model small,cPUBLIC min.codeminproc ,var1:word, var2:wordmov ax,var1;取第1個(gè)參數(shù)cmp ax,var2 ;與第2個(gè)參數(shù)比較jle mi
11、nexitmov ax,var2 ;保存返回值minexit: pop bpretminendpend,例7.4-3/3,/* C語言程序:lt704.c */extern int min(int,int);main(){ printf(“%d”,min(100,200));},小型模式編譯程序和連接:TCC -ms -Iinclude -Llib lt704.c lt704s.obj大型模式編譯程
12、序和連接:TCC -ml -Iinclude -Llib lt704.c lt704l.obj,例7.4的堆棧區(qū),小型模式,大型模式,7.3 匯編語言在Visual C++中的應(yīng)用,Visual C++逐漸將MASM融合進(jìn)去嵌入?yún)R編語言指令調(diào)用匯編語言過程Visual C++集成開發(fā)環(huán)境編譯匯編語言程序調(diào)試匯編語言程序應(yīng)用之一:優(yōu)化C++代碼,7.3.1 嵌入?yún)R編語言指令,格式_ _asm { 指令 }舉例int
13、 power2(int num,int power){_ _asm{mov eax,nummov ecx,powershl eax,cl}// 返回 EAX=EAX×(2^CL)},7.3.2 調(diào)用匯編語言過程,必須遵循共同的約定規(guī)則命名約定聲明約定寄存器使用約定存儲(chǔ)模式約定參數(shù)傳遞約定采用一致的調(diào)用規(guī)范聲明共用函數(shù)和變量正確傳遞入口參數(shù)和返回參數(shù),32位匯編語言過程,用.
14、386p等處理器偽指令說明采用的指令集32位邏輯段環(huán)境有些指令在32位段與16位段有差別采用平展模式(flat)匯編時(shí)采用選項(xiàng)/coff,例7.14-1/3,;匯編語言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.codepower2procpush ebpmov ebp,espmov eax,[ebp+8];取第1個(gè)參數(shù)mov ecx,[bp+
15、12];取第2個(gè)參數(shù)shl eax,clpop ebpret;返回EAXpower2endpend,圖示,例7.14的堆棧區(qū),例7.14-2/3,;匯編語言子程序:lt714f.asm.386p.model flat,cPUBLIC power2.codepower2PROC ,num:dword,power:dwordmov eax,num;獲取參數(shù)mov ecx,powers
16、hl eax,cl;計(jì)算ret;EAX存放返回值power2ENDPend,例7.14-3/3,// C++語言程序:lt714.cpp# include extern “c”{int power2(int,int);}void main(void){ cout<<“2的6次方乘5等于:\t”; cout<<power2(5,6)<<endl;},將匯編語言程序匯
17、編成目標(biāo)代碼文件:ML /c /coff lt714f.asm在Visual C++6.0編譯環(huán)境下創(chuàng)建項(xiàng)目,插入?yún)R編成的目標(biāo)代碼文,然后編譯連接,例7.15-1/4,// C++程序:LT715.CPP #include extern "C" {long isum(int,int *);}int imin(int,int *);void main(void){ const int SIZE=1
18、0; int array[SIZE]; int temp; cout>array[temp]; cout<<endl; cout<<"整數(shù)數(shù)據(jù)之和:\t"<<isum(SIZE,array)<<endl; cout<<"其中最小值為:\t"<<imin(SIZE,array)<<end
19、l;},例7.15-2/4,//求itmp個(gè)元素的數(shù)組iarray的最小數(shù)int imin(int itmp,int iarray[]){__asm {mov ecx,itmpjecxz minexit;個(gè)數(shù)為0,返回dec ecxmov esi,iarraymov eax,[esi]jecxz minexit;個(gè)數(shù)為1,返回minlp:add esi,4cmp eax,[esi];比較兩個(gè)
20、數(shù)據(jù)的大小jle nochangemov eax,[esi];取得較小值nochange:loop minlpminexit: }},例7.15-3/4,;匯編語言子程序:LT715F.ASM.386p.model flat,c.code;32位有符號(hào)數(shù)據(jù)的求和過程isumproc uses ecx esi, \count:dword,darray:PTRmov ecx,cou
21、nt;個(gè)數(shù)為0,和為0xor edx,edxxor eax,eaxjecxz sumexitmov esi,darray;個(gè)數(shù)為1,和為本身mov eax,[esi]dec ecxjecxz sumexit,例7.15-4/4,sumlp:add esi,4add eax,[esi];計(jì)算低32位adc edx,0;計(jì)算高32位loop sumlpsumexit:retisume
22、ndpend,將匯編語言程序匯編成目標(biāo)代碼文件:ML /c /coff lt715f.asm在Visual C++6.0編譯環(huán)境下創(chuàng)建項(xiàng)目,插入?yún)R編成的目標(biāo)代碼文件,然后編譯連接,7.3.3 使用匯編語言優(yōu)化C++代碼,例7.16:在整數(shù)數(shù)組查找一個(gè)數(shù)值,查找過程需要進(jìn)行大量循環(huán)C++代碼(lt716.cpp)Debug調(diào)試版本:81000(0.046 ms)Release發(fā)布版本:31000(0.018 ms)嵌入
23、匯編語言編寫查找函數(shù)使用串操作指令: 41000 (0.023 ms)不使用串操作指令:31000(0.018 ms)在簡單情況下,Visual C++的優(yōu)化技術(shù)已經(jīng)非常有效;但仍然可用匯編代碼進(jìn)行改進(jìn),7.3.4 使用Visual C++開發(fā)匯編語言程序,新建工程項(xiàng)目,選擇32位控制臺(tái)或窗口應(yīng)用程序輸入磁盤目錄,工程名稱,并選擇創(chuàng)建一個(gè)空白工程新建匯編語言源程序文件輸入源程序文件名以及擴(kuò)展名ASM,加入工程項(xiàng)目通過工程菜
24、單的設(shè)置命令展開工程設(shè)置窗口在命令文本框中輸入進(jìn)行匯編的命令在輸出文本框輸入?yún)R編后目標(biāo)模塊文件名調(diào)用創(chuàng)建命令進(jìn)行匯編語言程序的匯編和連接注意在Visual C++環(huán)境確定包含文件的路徑,匯編語言程序的調(diào)試過程,工具菜單的選項(xiàng)命令展開調(diào)試標(biāo)簽頁進(jìn)行設(shè)置通用下選中十六進(jìn)制顯示反匯編窗口下要選中代碼字節(jié)存儲(chǔ)器窗口下選中固定寬度,后面填入數(shù)字16在編輯窗口源程序的語句行,按F9鍵,設(shè)置斷點(diǎn)使用運(yùn)行、單步執(zhí)行等命令進(jìn)行開各種窗
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- msp430_單片機(jī)c語言和匯編語言混合編程
- c51與匯編語言混合編程在單片機(jī)iap中的應(yīng)用
- matlab7.0與c++2005混合編程
- asm04 匯編語言程序格式
- 匯編語言編程題
- C、C++和C#語言中編程實(shí)體的研究.pdf
- 高質(zhì)量編程c++和c語言編程程序設(shè)計(jì)指南
- c++編程規(guī)范
- c++高級(jí)編程
- c++編程規(guī)范
- 基于C++與Matlab聯(lián)合編程的FMT逆向問題研究.pdf
- 匯編語言到C語言翻譯軟件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 內(nèi)核中c++編程
- 匯編語言的編程步驟與調(diào)試方法
- c++編程題題庫
- 單片機(jī)編程實(shí)例____c語言____匯編
- matlab與c混合編程的方法研究與實(shí)現(xiàn)畢業(yè)論文
- 單片機(jī)編程實(shí)例____c語言____匯編
- 匯編語言06-07一學(xué)期期末c
- 基于MATLAB與C-C++的盲處理系統(tǒng)混合編程模式的研究.pdf
評(píng)論
0/150
提交評(píng)論