第7章-匯編語言與C/C++的混合編程_第1頁
第7章-匯編語言與C/C++的混合編程_第2頁
第7章-匯編語言與C/C++的混合編程_第3頁
第7章-匯編語言與C/C++的混合編程_第4頁
第7章-匯編語言與C/C++的混合編程_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論