




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章匯編語(yǔ)言與C/C++的混合編程教學(xué)重點(diǎn)第7章介紹實(shí)際應(yīng)用當(dāng)中,常見(jiàn)的混合編程問(wèn)題,重點(diǎn)是參數(shù)傳遞方法混合編程的兩種方式模塊連接的約定規(guī)則模塊連接的參數(shù)傳遞方法C++代碼優(yōu)化2什么是混合編程多種程序設(shè)計(jì)語(yǔ)言間,通過(guò)相互調(diào)用、參數(shù)傳遞、共享數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)信息而形成程序的過(guò)程就是混合編程程序的大部分采用高級(jí)語(yǔ)言編寫(xiě),以提高程序的開(kāi)發(fā)效率;在某些部分,利用匯編語(yǔ)言編寫(xiě),以提高程序的運(yùn)行效率混合編程方法嵌入式匯編——在C/C++語(yǔ)言中直接使用匯編語(yǔ)言語(yǔ)句,簡(jiǎn)潔直觀、功能較弱模塊連接——兩種語(yǔ)言分別編寫(xiě)?yīng)毩⒌某绦蚰K,分別產(chǎn)生目標(biāo)代碼OBJ文件,然后進(jìn)行連接,形成一個(gè)完整的程序使用靈活、功能強(qiáng),要解決參數(shù)傳遞問(wèn)題混合編程的關(guān)鍵問(wèn)題建立不同語(yǔ)言之間的接口在不同格式的兩種語(yǔ)言間提供有效的通訊方式,作出符合兩種語(yǔ)言調(diào)用約定的某種形式說(shuō)明,實(shí)現(xiàn)兩種語(yǔ)言間的程序模塊互相調(diào)用、變量的相互傳送以及參數(shù)和返回值的正確使用7.1TurboC嵌入式匯編方式格式
asm
操作碼
操作數(shù)
<;或換行>舉例
asm
mov
ax,ds;
asmpopax;asmpopds;asmret;
asmpushds
/*asm語(yǔ)句是C程序中唯一可以用換行結(jié)尾的語(yǔ)句*/
若干注意事項(xiàng)操作碼支持8086/8087指令或若干偽指令:db/dw/ddextern操作數(shù)是操作碼可接受的數(shù)據(jù):立即數(shù)、寄存器名,還可以是C語(yǔ)言程序中的常量、變量和標(biāo)號(hào)等內(nèi)嵌的匯編語(yǔ)句可以用分號(hào)“;”結(jié)束,也可以用換行符結(jié)束使用C的注釋,如
/*…*/正確運(yùn)用通用寄存器、標(biāo)號(hào)等7訪問(wèn)C語(yǔ)言的數(shù)據(jù)嵌入的匯編語(yǔ)句除可以使用指令允許的立即數(shù)、寄存器名外,還可以使用C語(yǔ)言程序中的任何符號(hào)(標(biāo)識(shí)符),包括變量、常量、標(biāo)號(hào)、函數(shù)名、寄存器變量、函數(shù)參數(shù)等;C編譯程序自動(dòng)將它們轉(zhuǎn)換成相應(yīng)匯編語(yǔ)言指令的操作數(shù),并在標(biāo)識(shí)符名前加下劃線。對(duì)于具有內(nèi)嵌匯編語(yǔ)句的C程序,C編譯器要調(diào)用匯編程序進(jìn)行匯編。匯編程序在分析一條嵌入式匯編指令的操作數(shù)時(shí),若遇到了一個(gè)標(biāo)識(shí)符,它將在C程序的符號(hào)表中搜索該標(biāo)識(shí)符;但8086寄存器名不在搜索范圍之內(nèi),而且大小寫(xiě)形式的寄存器名都可以使用。8訪問(wèn)C語(yǔ)言的數(shù)據(jù)例7.1:用嵌入?yún)R編方式實(shí)現(xiàn)取兩數(shù)較小值的函數(shù)min
/*LT701.C*/int
min(intvar1,intvar2)/*用嵌入?yún)R編語(yǔ)句實(shí)現(xiàn)的求較小值*/{ asm
movax,var1
asm
cmpax,var2
asm
jle
minexit
asm
movax,var2minexit:return(_AX);/*將寄存器AX的內(nèi)容作為函數(shù)的返回值*/}main()
/*C語(yǔ)言主程序*/{
min(100,200);}注意事項(xiàng)9嵌入?yún)R編的編譯過(guò)程C語(yǔ)言程序中含有嵌入式匯編語(yǔ)言語(yǔ)句時(shí)C編譯器首先將C代碼的源程序(.c)編譯成匯編語(yǔ)言源文件(.asm)然后激活匯編程序TurboAssembler將產(chǎn)生的匯編語(yǔ)言源文件編譯成目標(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語(yǔ)言定義的標(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
/*小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)*/copy: asm
stosb
asmandal,al/*C語(yǔ)言中,字符串用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ǔ)言過(guò)程應(yīng)采用C語(yǔ)言類型
聲明約定寄存器使用約定存儲(chǔ)模式約定:采用相同的存儲(chǔ)模式參數(shù)傳遞是關(guān)鍵通過(guò)堆棧傳遞入口參數(shù)通過(guò)寄存器返回出口參數(shù)7.2.1混合編程的約定規(guī)則13;匯編語(yǔ)言子程序:lt703s.asm .modelsmall,c
;小型存儲(chǔ)模式
.datamsg db’Hello,CandAssembly!$’ .code
PUBLICdisplay display proc
movah,9 ;小型模式不必設(shè)置DS
mov
dx,offset
msg
;寄存器AX和DX無(wú)須保護(hù)
int21h retdisplay endp
end例7.3-1/27.2.2編譯和連接過(guò)程/*C語(yǔ)言程序:lt703.c*/externvoiddisplay(void);
/*說(shuō)明display是外部函數(shù)*/main(){display();}利用匯編程序編譯匯編語(yǔ)言程序成目標(biāo)代碼文件:
ML/clt703s.asm或masmlt703s.asm利用C編譯程序編譯C程序、連接目標(biāo)代碼文件:
TCC-clt703.c例7.3-2/2DEMO編譯和連接過(guò)程利用連接程序?qū)⒏鱾€(gè)目標(biāo)代碼文件連接在一起,得到可執(zhí)行程序文件,例如:
TLINKlib\c0slt703lt703s,lt703.exe,,lib\cs注意:直接使用TurboC的連接程序TLINK進(jìn)行連接時(shí),用戶必須指定要連接的與存儲(chǔ)模式一致的初始化模塊和函數(shù)庫(kù)文件,并且初始化模塊必須是第一個(gè)文件。編譯和連接也可以利用命令行一次完成,一般格式為:TCC-mx-I包含文件路徑-L庫(kù)文件路徑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;匯編語(yǔ)言子程序:lt704s.asm
.modelsmall,c
PUBLICmin
.codemin
proc
;小型模式,為近過(guò)程
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;匯編語(yǔ)言子程序: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語(yǔ)言程序: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匯編語(yǔ)言在VisualC++中的應(yīng)用VisualC++逐漸將MASM融合進(jìn)去嵌入?yún)R編語(yǔ)言指令調(diào)用匯編語(yǔ)言過(guò)程VisualC++集成開(kāi)發(fā)環(huán)境編譯匯編語(yǔ)言程序調(diào)試匯編語(yǔ)言程序應(yīng)用之一:優(yōu)化C++代碼7.3.1嵌入?yún)R編語(yǔ)言指令格式
__asm{指令}舉例intpower2(intnum,intpower){
__asm {
mov
eax,num
mov
ecx,power
shl
eax,cl } //返回EAX=EAX×(2^CL)}7.3.2調(diào)用匯編語(yǔ)言過(guò)程必須遵循共同的約定規(guī)則命名約定聲明約定寄存器使用約定存儲(chǔ)模式約定參數(shù)傳遞約定采用一致的調(diào)用規(guī)范聲明共用函數(shù)和變量正確傳遞入口參數(shù)和返回參數(shù)32位匯編語(yǔ)言過(guò)程用.386p等處理器偽指令說(shuō)明采用的指令集32位邏輯段環(huán)境有些指令在32位段與16位段有差別采用平展模式(flat)匯編時(shí)采用選項(xiàng)/coff;匯編語(yǔ)言子程序: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;匯編語(yǔ)言子程序: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++語(yǔ)言程序:lt714.cpp#include<iostream.h>extern“c”{intpower2(int,int);}voidmain(void){
cout<<“2的6次方乘5等于:\t”;
cout<<power2(5,6)<<endl;}將匯編語(yǔ)言程序匯編成目標(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<<"請(qǐng)輸入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;匯編語(yǔ)言子程序:LT715F.ASM .386p .modelflat,c .code;32位有符號(hào)數(shù)據(jù)的求和過(guò)程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將匯編語(yǔ)言程序匯編成目標(biāo)代碼文件:
ML/c/cofflt715f.asm在VisualC++6.0編譯環(huán)境下創(chuàng)建項(xiàng)目
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保潔與員工合同范本
- 住宅加裝電梯工程合同范例
- 出售尼龍水箱合同范本
- 與政府合作合同范本
- 內(nèi)控合同范本
- 協(xié)商撤銷合同范例
- 勞動(dòng)合同范本 病假
- 單位租住房合同范本
- 個(gè)人蓋房合同范本
- 中醫(yī)醫(yī)聯(lián)體合同范本
- 染廠公司簡(jiǎn)介(4個(gè)范本)
- PPT用中國(guó)地圖(可編輯)
- 基于德育的農(nóng)村中小學(xué)校園欺凌現(xiàn)象的解決對(duì)策優(yōu)秀獲獎(jiǎng)科研論文
- 鐵路工程概預(yù)算-工程經(jīng)濟(jì)管理培訓(xùn)-課件
- 小學(xué)英語(yǔ)一般現(xiàn)在時(shí)-(演示)課件
- 面部激素依賴性皮炎的管理課件
- 盧卡奇教學(xué)講解課件
- 智慧環(huán)衛(wèi)項(xiàng)目建設(shè)方案
- 焊接作業(yè)現(xiàn)場(chǎng)環(huán)境溫度濕度記錄
- 長(zhǎng)期護(hù)理保險(xiǎn)待遇資格申請(qǐng)表
- 馬克思主義基本原理教案:第一章+教案
評(píng)論
0/150
提交評(píng)論