版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章匯編語言與C/C++的混合編程教學(xué)重點(diǎn)第7章介紹實(shí)際應(yīng)用當(dāng)中,常見的混合編程問題,重點(diǎn)是參數(shù)傳遞方法混合編程的兩種方式模塊連接的約定規(guī)則模塊連接的參數(shù)傳遞方法C++代碼優(yōu)化2什么是混合編程多種程序設(shè)計(jì)語言間,通過相互調(diào)用、參數(shù)傳遞、共享數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)信息而形成程序的過程就是混合編程程序的大部分采用高級(jí)語言編寫,以提高程序的開發(fā)效率;在某些部分,利用匯編語言編寫,以提高程序的運(yùn)行效率混合編程方法嵌入式匯編——在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.1TurboC嵌入式匯編方式格式
asm
操作碼
操作數(shù)
<;或換行>舉例
asm
mov
ax,ds;
asmpopax;asmpopds;asmret;
asmpushds
/*asm語句是C程序中唯一可以用換行結(jié)尾的語句*/
若干注意事項(xiàng)操作碼支持8086/8087指令或若干偽指令:db/dw/ddextern操作數(shù)是操作碼可接受的數(shù)據(jù):立即數(shù)、寄存器名,還可以是C語言程序中的常量、變量和標(biāo)號(hào)等內(nèi)嵌的匯編語句可以用分號(hào)“;”結(jié)束,也可以用換行符結(jié)束使用C的注釋,如
/*…*/正確運(yùn)用通用寄存器、標(biāo)號(hào)等7訪問C語言的數(shù)據(jù)嵌入的匯編語句除可以使用指令允許的立即數(shù)、寄存器名外,還可以使用C語言程序中的任何符號(hào)(標(biāo)識(shí)符),包括變量、常量、標(biāo)號(hào)、函數(shù)名、寄存器變量、函數(shù)參數(shù)等;C編譯程序自動(dòng)將它們轉(zhuǎn)換成相應(yīng)匯編語言指令的操作數(shù),并在標(biāo)識(shí)符名前加下劃線。對(duì)于具有內(nèi)嵌匯編語句的C程序,C編譯器要調(diào)用匯編程序進(jìn)行匯編。匯編程序在分析一條嵌入式匯編指令的操作數(shù)時(shí),若遇到了一個(gè)標(biāo)識(shí)符,它將在C程序的符號(hào)表中搜索該標(biāo)識(shí)符;但8086寄存器名不在搜索范圍之內(nèi),而且大小寫形式的寄存器名都可以使用。8訪問C語言的數(shù)據(jù)例7.1:用嵌入?yún)R編方式實(shí)現(xiàn)取兩數(shù)較小值的函數(shù)min
/*LT701.C*/int
min(intvar1,intvar2)/*用嵌入?yún)R編語句實(shí)現(xiàn)的求較小值*/{ asm
movax,var1
asm
cmpax,var2
asm
jle
minexit
asm
movax,var2minexit:return(_AX);/*將寄存器AX的內(nèi)容作為函數(shù)的返回值*/}main()
/*C語言主程序*/{
min(100,200);}注意事項(xiàng)9嵌入?yún)R編的編譯過程C語言程序中含有嵌入式匯編語言語句時(shí)C編譯器首先將C代碼的源程序(.c)編譯成匯編語言源文件(.asm)然后激活匯編程序TurboAssembler將產(chǎn)生的匯編語言源文件編譯成目標(biāo)文件(.obj)最后激活Tlink將目標(biāo)文件鏈接成可執(zhí)行文件(.exe)。
10/*LT702.C*/#include<stdio.h>voidupper(char*dest,char*src){ asm
mov
si,src /*dest和src是地址指針*/
asm
mov
di,dest
asm
cldloop: asm
lodsb /*C語言定義的標(biāo)號(hào)*/
asm
cmp
al,'a'
asm
jbcopy /*轉(zhuǎn)移到C的標(biāo)號(hào)*/
asm
cmp
al,'z'
asm
jacopy /*不是’a’到’z’之間的字符原樣復(fù)制*/例7.2-1/2
asmsubal,20h
/*小寫字母轉(zhuǎn)換成大寫*/copy: asm
stosb
asmandal,al/*C語言中,字符串用NULL(0)結(jié)尾*/
asm
jnzloop}main() /*主程序*/{charstr[]="ThisStartedOutAsLowercase!";charchr[100];
upper(chr,str);
printf("Originstring:\n%s\n",str);
printf("UppercaseString:\n%s\n",chr);}例7.2-2/2DEMO例7.27.2TurboC模塊連接方式要注意模塊連接的約定規(guī)則命名約定:匯編語言過程應(yīng)采用C語言類型
聲明約定寄存器使用約定存儲(chǔ)模式約定:采用相同的存儲(chǔ)模式參數(shù)傳遞是關(guān)鍵通過堆棧傳遞入口參數(shù)通過寄存器返回出口參數(shù)7.2.1混合編程的約定規(guī)則13;匯編語言子程序:lt703s.asm .modelsmall,c
;小型存儲(chǔ)模式
.datamsg db’Hello,CandAssembly!$’ .code
PUBLICdisplay display proc
movah,9 ;小型模式不必設(shè)置DS
mov
dx,offset
msg
;寄存器AX和DX無須保護(hù)
int21h retdisplay endp
end例7.3-1/27.2.2編譯和連接過程/*C語言程序:lt703.c*/externvoiddisplay(void);
/*說明display是外部函數(shù)*/main(){display();}利用匯編程序編譯匯編語言程序成目標(biāo)代碼文件:
ML/clt703s.asm或masmlt703s.asm利用C編譯程序編譯C程序、連接目標(biāo)代碼文件:
TCC-clt703.c例7.3-2/2DEMO編譯和連接過程利用連接程序?qū)⒏鱾€(gè)目標(biāo)代碼文件連接在一起,得到可執(zhí)行程序文件,例如:
TLINKlib\c0slt703lt703s,lt703.exe,,lib\cs注意:直接使用TurboC的連接程序TLINK進(jìn)行連接時(shí),用戶必須指定要連接的與存儲(chǔ)模式一致的初始化模塊和函數(shù)庫文件,并且初始化模塊必須是第一個(gè)文件。編譯和連接也可以利用命令行一次完成,一般格式為:TCC-mx-I包含文件路徑-L庫文件路徑filename1filename2...例如,上例可以利用如下命令:
TCC-ms-Iinclude-Lliblt703.clt703s.obj167.2.3混合編程的參數(shù)傳遞Lt0701.c的編譯結(jié)果——如教材P218
movax,200
pushax;壓入?yún)?shù)200(第2個(gè)參數(shù))
movax,100
pushax;壓入?yún)?shù)100(第1個(gè)參數(shù))
callnearptr_min;調(diào)用min(100,200)
popcx;兩條出棧指令用于平衡堆棧
popcx17;匯編語言子程序:lt704s.asm
.modelsmall,c
PUBLICmin
.codemin
proc
;小型模式,為近過程
pushbp
mov
bp,sp
movax,
[bp+4]
;取第1個(gè)參數(shù)
cmpax,
[bp+6]
;與第2個(gè)參數(shù)比較
jle
minexit
movax,
[bp+6]
;保存返回值minexit:popbp retmin
endp
end例7.4-1/3圖示large688L;匯編語言子程序:lt704.asm .modelsmall,c PUBLICmin .codemin proc,var1:word,var2:word
movax,var1
;取第1個(gè)參數(shù)
cmpax,var2
;與第2個(gè)參數(shù)比較
jle
minexit
movax,var2
;保存返回值minexit:popbp retmin endp end例7.4-2/3/*C語言程序:lt704.c*/externint
min(int,int); main(){printf(“%d”,min(100,200));}小型模式編譯程序和連接:
TCC-ms-Iinclude-Lliblt704.clt704s.obj大型模式編譯程序和連接:
TCC-ml-Iinclude-Lliblt704.clt704l.obj例7.4-3/3例7.4的堆棧區(qū)堆棧段200+6100+4偏移地址+2BP小型模式堆棧段200+8100+6段地址+4偏移地址+2BPBP=SP大型模式217.3匯編語言在VisualC++中的應(yīng)用VisualC++逐漸將MASM融合進(jìn)去嵌入?yún)R編語言指令調(diào)用匯編語言過程VisualC++集成開發(fā)環(huán)境編譯匯編語言程序調(diào)試匯編語言程序應(yīng)用之一:優(yōu)化C++代碼7.3.1嵌入?yún)R編語言指令格式
__asm{指令}舉例intpower2(intnum,intpower){
__asm {
mov
eax,num
mov
ecx,power
shl
eax,cl } //返回EAX=EAX×(2^CL)}7.3.2調(diào)用匯編語言過程必須遵循共同的約定規(guī)則命名約定聲明約定寄存器使用約定存儲(chǔ)模式約定參數(shù)傳遞約定采用一致的調(diào)用規(guī)范聲明共用函數(shù)和變量正確傳遞入口參數(shù)和返回參數(shù)32位匯編語言過程用.386p等處理器偽指令說明采用的指令集32位邏輯段環(huán)境有些指令在32位段與16位段有差別采用平展模式(flat)匯編時(shí)采用選項(xiàng)/coff;匯編語言子程序:lt714f.asm .386p .modelflat,c PUBLICpower2 .codepower2 proc pushebp
mov
ebp,esp
moveax,[ebp+8] ;取第1個(gè)參數(shù)
movecx,[bp+12] ;取第2個(gè)參數(shù)
shl
eax,cl popebp ret ;返回EAXpower2 endp end例7.14-1/3圖示例7.14的堆棧區(qū)堆棧段6+125+8EIP+4EBPEBP=ESP27;匯編語言子程序:lt714f.asm .386p .modelflat,c PUBLICpower2 .codepower2 PROC,num:dword,power:dword
mov
eax,num
;獲取參數(shù)
mov
ecx,power
shl
eax,cl
;計(jì)算
ret ;EAX存放返回值power2 ENDP end例7.14-2/3//C++語言程序:lt714.cpp#include<iostream.h>extern“c”{intpower2(int,int);}voidmain(void){
cout<<“2的6次方乘5等于:\t”;
cout<<power2(5,6)<<endl;}將匯編語言程序匯編成目標(biāo)代碼文件:
ML/c/cofflt714f.asm在VisualC++6.0編譯環(huán)境下創(chuàng)建項(xiàng)目,插入?yún)R編成的目標(biāo)代碼文,然后編譯連接例7.14-3/3//C++程序:LT715.CPP#include<iostream.h>extern"C"{longisum(int,int*);}int
imin(int,int*);voidmain(void){constintSIZE=10;
int
array[SIZE];
inttemp;
cout<<"請輸入10個(gè)整數(shù):"<<endl;
for(temp=0;temp<SIZE;temp++)
cin>>array[temp];
cout<<endl;
cout<<"整數(shù)數(shù)據(jù)之和:\t"<<isum(SIZE,array)<<endl;
cout<<"其中最小值為:\t"<<imin(SIZE,array)<<endl;}例7.15-1/4//求itmp個(gè)元素的數(shù)組iarray的最小數(shù)int
imin(int
itmp,int
iarray[]){__asm{
mov
ecx,itmp
jecxz
minexit
;個(gè)數(shù)為0,返回
dec
ecx
mov
esi,iarray
mov
eax,[esi]
jecxz
minexit
;個(gè)數(shù)為1,返回minlp: addesi,4
cmp
eax,[esi] ;比較兩個(gè)數(shù)據(jù)的大小
jle
nochange
mov
eax,[esi] ;取得較小值nochange: loopminlpminexit:}}例7.15-2/4;匯編語言子程序:LT715F.ASM .386p .modelflat,c .code;32位有符號(hào)數(shù)據(jù)的求和過程isum procusesecx
esi,\
count:dword,darray:PTR
mov
ecx,count
;個(gè)數(shù)為0,和為0
xor
edx,edx
xor
eax,eax
jecxz
sumexit
mov
esi,darray
;個(gè)數(shù)為1,和為本身
mov
eax,[esi]
dec
ecx
jecxz
sumexit例7.15-3/4sumlp: addesi,4 addeax,[esi] ;計(jì)算低32位
adcedx,0 ;計(jì)算高32位
loopsumlpsumexit: retisum
endp end例7.15-4/4將匯編語言程序匯編成目標(biāo)代碼文件:
ML/c/cofflt715f.asm在VisualC++6.0編譯環(huán)境下創(chuàng)建項(xiàng)目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生鮮配送與冷鏈倉儲(chǔ)管理承包合同3篇
- 2025年度體育場館場地租賃及賽事運(yùn)營管理服務(wù)協(xié)議2篇
- 2024皮鞋品牌代理權(quán)購銷合同范本3篇
- 二零二五年度施工安全風(fēng)險(xiǎn)評(píng)估與管理合同3篇
- 2025年度高科技公司股東退股協(xié)議書3篇
- 2025年度房地產(chǎn)項(xiàng)目成本控制與合同管理協(xié)議3篇
- 二零二五年貓咪寵物保險(xiǎn)代理合同2篇
- 2025年跨境電商項(xiàng)目監(jiān)控與管理服務(wù)合同2篇
- 二零二五年度環(huán)保產(chǎn)業(yè)投資合作合同6篇
- 二零二四年醫(yī)療器械研發(fā)合同
- 廣東佛山生育保險(xiǎn)待遇申請表
- 廣西水功能區(qū)劃報(bào)告-廣西水利信息網(wǎng)
- 機(jī)關(guān)單位檔案業(yè)務(wù)培訓(xùn)課件20170714
- ??怂咕S修保養(yǎng)使用手冊
- 人力資源部各崗位績效考核表
- 原材料試驗(yàn)工作程序與質(zhì)量管理制度
- 人教版八年級(jí)下冊英語單詞默寫(可直接打印)
- 糖廠熱力衡算(6000噸每天)
- 燃?xì)庥邢薰疚kU(xiǎn)作業(yè)安全管理規(guī)定
- 北京市刑事訴訟律師事務(wù)所函(擔(dān)任訴訟代理人適用)格式文書(2020版)
- XX鎮(zhèn)“我為群眾辦實(shí)事”滿意度調(diào)查問卷
評(píng)論
0/150
提交評(píng)論