資源描述:
《匯編語言和C語言.docx》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、第12章匯編語言和C語言C/C++語言是一個被廣泛使用的程序設(shè)計語言,它不僅具有良好的高級語言特征,而且還具有一些低級語言的特點,如:寄存器變量、位操作等。所以,C語言的程序與匯編語言程序之間能很平滑地銜接。另外,目前主要的C語言程序開發(fā)環(huán)境,如:TurboC/C++、BorlandC/C++等,也都提供了很好的混合編程手段。本章主要介紹匯編語言和C語言的混合編程和調(diào)用方法。雖然其它高級語言,如:Pascal、Basic等,也可與匯編語言混合使用,但出于其應(yīng)用范圍的考慮,不再對它們進行介紹,感興趣的讀者可參閱有關(guān)技術(shù)資料。12.
2、1匯編指令的嵌入為了提高C語言程序內(nèi)某特殊功能段的處理效率,我們可以在其源程序中嵌入一段匯編語言程序段。這樣做,雖然能達到提高了程序處理效率的目的,但它無疑以喪失源程序的可移植性為代價。所以,當想用C語言和匯編語言混合編程時,程序員需要權(quán)衡采用這種方法的利與弊。在C語言中,嵌入?yún)R編語言的語法如下(*):asm<;ornewline>注意:這里的分號';'不是匯編語言中起注釋作用的分號,而是作為語句的分隔符。若C語言源程序中嵌入一條匯編語句,則可按下列方式來做:asmmovax,data若要嵌入
3、一組匯編語句,則需要用括號'{'和'}'把它們括起來。asm{ mov ax,data1 xchg ax,data2 mov data1,ax //實現(xiàn)整型變量data1和data2之值的交換}例12.1在C語言源程序中嵌入?yún)R編語言語句實現(xiàn)賦值語句A=A+B+C,其中:A、B、C都是整型變量。解:……asm{pushax //實現(xiàn)整型變量A=A+B+C?mov ax,A?add ax,B?add ax,C?mov A,ax?pop ax}12.2C語言程序的匯編輸出在TurboC++或BorlandC++
4、編程環(huán)境下,我們可TCC或BCC行命令把一個C語言的源程序轉(zhuǎn)換成匯編語言的源程序。通過閱讀匯編語言程序可以很準確地知道C語言語句的功能是如何實現(xiàn)的,這樣,可為將來學(xué)習(xí)《編譯原理》課程中的"寄存器調(diào)度"和"代碼生成"等相關(guān)知識打下良好的基礎(chǔ)。C語言源程序轉(zhuǎn)換的命令格式如下:TCC-St1.cpp或BCC-St1.cpp ;假設(shè)其文件名為t1.cpp若命令TCC/BCC不帶參數(shù)的話,則將顯示其使用方法。下面是C語言程序及其相對應(yīng)的匯編語言程序,希望讀者能逐行對照理解它們語句之間的轉(zhuǎn)換關(guān)系,這將能進一步理解高級語言的語句功能。1、
5、C語言程序清單#includeintsum(inta,intb,intc) { return(a+b+c); }voidmain(){inta,b,c;?a=b=12;?c=32;?printf("%d",sum(a,b,c));}2、生成的匯編語言程序清單…… ;一系列輔助說明信息_TEXT segmentbytepublic'CODE' ;代碼段的開始;intsum(inta,intb,intc) ;C語言語句 assume?c
6、s:_TEXT@sum$qiii proc near ;過程說明,對應(yīng)于C語言sum過程 push bp ;為讀取堆棧中的參數(shù)作準備,可參見第7.3.3節(jié)內(nèi)容 mov bp,sp;{ ;return(a+b+c); mov ax,wordptr[bp+4] add ax,wordptr[bp+6] add ax,wordptr[bp+8] jmp short@1@58@1@58:;} pop bp
7、 ;sum子程序結(jié)束的代碼 ret@sum$qiii endp;voidmain() assume?cs:_TEXT_main proc near ;過程說明,對應(yīng)于C語言中的主函數(shù)main() push bp mov bp,sp sub sp,6;{inta,b,c; ;局部變量是用堆棧來存儲的,請見第7.5.10節(jié);a=b=12; ;給局部變量賦值 mov ax,12
8、 ;用給堆棧單元賦值來實現(xiàn)對局部變量的賦值 mov wordptr[bp-4],ax mov wordptr[bp-2],ax;c=32; mov wordptr[bp-6],32;printf("%d",su