




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
13.3匯編語言和高級語言程序的連接 由于使用高級語言編寫及調(diào)試程序比匯編語言的開發(fā)效率高,可移植性好,所以,高級語言比匯編語言使用更廣泛。但是在要求實(shí)時(shí)性高、占用空間少或要求直接控制硬件的場合,仍然要用到匯編語言,實(shí)現(xiàn)對硬件直接控制和更快的控制速度。但匯編語言編程復(fù)雜、表達(dá)能力也差,因此比較好的解決辦法是C語言與匯編語言混合編程。 目前主要的語言程序開發(fā)環(huán)境有:urbo 、orland C/C+,Visual C+等,都支持與匯編語言的混合編程。語言與匯編語言的混合編程方法一般有兩種方法可以實(shí)現(xiàn),即在C語言中嵌入?yún)R編語言,也稱嵌入式編程和用 語言調(diào)用匯編語言模塊,即多模塊混合編程。,1.匯編語言的嵌入式編程 1內(nèi)嵌匯編語句格式,在urbo 中,C程序中嵌入的匯編語句前必須以關(guān)鍵字ASM開頭,其格式為: ASM /*注釋*/ 其中ASM為關(guān)鍵字,操作碼可以是處理器指令也可以是偽指令,操作數(shù)是操作碼可以接受的數(shù)據(jù),可以是指令允許的立即數(shù),寄存器名,也可以是C程序中的常量、變量和標(biāo)號。C程序中嵌入?yún)R編代碼后可以有分號也可無分號,如果匯編代碼后無分號則必須以換行符結(jié)束(嵌入的匯編語句是C語言中唯一可以換行結(jié)束的語句),如果匯編代碼后有分號,則一行中可以有多條嵌入的匯編語句,但一條匯編指令不能跨越兩行。 特別要注意的是,嵌入的匯編語句的注釋方式須采用C語言的注釋方式,即必須用/*/來標(biāo)記注釋。而不能像純匯編那樣用(;)作為一條注釋的開始。如:,ASM MOV AX,DX; /*單個(gè)語句*/ ASM PUSH AX;ASM POP AX;ASM MOV BX, AX;/*多個(gè)語句寫在一行 */ 如果在C語言程序中要嵌入多個(gè)ASM語句,可以將它們放在花括號內(nèi)。如: ASM MOV AX,DX PUSH AX /*注釋*/ 在C程序中,函數(shù)內(nèi)部的匯編語句都是一條可執(zhí)行的語句,它被編進(jìn)程序的代碼段,在函數(shù)外部的匯編語句是一個(gè)外部說明,在編譯時(shí)放在程序的數(shù)據(jù)段中。這些外部數(shù)據(jù)可以被其他程序引用。,2轉(zhuǎn)移指令的執(zhí)行 內(nèi)嵌匯編指令可以使用轉(zhuǎn)移指令和LOOP循環(huán)指令,但是它們只能在函數(shù)體內(nèi)有效,不允許進(jìn)行段間轉(zhuǎn)移。由于ASM語句中不能給出標(biāo)號,因而轉(zhuǎn)移指令只能使用C語言程序中GOTO語句使用的標(biāo)號。例如: int fun1( ) label: asm jmp label ,3.直接嵌入?yún)R編代碼的C語言程序示例,例 編寫一個(gè)三個(gè)整數(shù)的求和的C函數(shù),用在C語言中嵌入?yún)R編語言方法實(shí)現(xiàn)。 int Sum ( int X, int Y, int Z) ASM PUSH AX; /*保護(hù)現(xiàn)場,否則可能影響前面的程序執(zhí)行*/ ASM MOV AX, X; ASM ADD AX, Y; ASM ADD AX, Z; ASM MOV X , AX; ASM POP AX; /*恢復(fù)現(xiàn)場*/ return (X) ,例 .用嵌入?yún)R編的方法編寫實(shí)現(xiàn)求兩個(gè)整數(shù)中的最小值的C語言函數(shù)。 int min(int v1,int v2) ASM MOV AX,v1 ASM CMP AX,v2 ASM JLE over; ASM MOV AX,v2 over: return(_AX); /*_AX為AX寄存器*/ ,內(nèi)嵌匯編指令的C程序只能采用TCC命令行的編譯連接方法。用TCC命令行實(shí)現(xiàn)的編譯連接的方法是: TCC -B-L: LIB 文件名 庫文件名 其中-L選擇項(xiàng)指定了連接所需的庫文件路徑,文件名指有內(nèi)嵌匯編指令的C程序名,庫文件指程序重要用到的庫函數(shù)所在的庫文件(Turbo C標(biāo)準(zhǔn)庫可省略)。 內(nèi)嵌匯編指令的C程序進(jìn)行編譯時(shí),必須要有-B選擇項(xiàng),否則編譯時(shí),一旦遇到匯編代碼,便立即給出警告信息,并以-B選項(xiàng)重新進(jìn)行編譯,若在C程序中加上#program inline預(yù)處理語句,則可省略-B選擇,2.在C程序中直接調(diào)用匯編子程序,在C語言中直接嵌入?yún)R編語句的方法限制較多,不能充分發(fā)揮匯編語言的功能。一種更好的方法是把需要用匯編實(shí)現(xiàn)的工作設(shè)計(jì)成匯編子程序,然后由C語言調(diào)用。 在設(shè)計(jì)能被C調(diào)用的匯編子程序時(shí),可以使用完整的段定義或者簡化的段定義結(jié)構(gòu)。 2.1編寫匯編子程序注意的問題 (1)變量和函數(shù)的使用 (2)參數(shù)傳遞 (3)寄存器使用規(guī)則 (4).存儲模式規(guī)則,(1)變量和函數(shù)的使用,C程序中可以調(diào)用匯編子程序及定義的變量,匯編子程序也可以調(diào)用C語言書寫的函數(shù)和定義的變量。但是,C語言編譯系統(tǒng)在編譯C語言源程序時(shí),要在其中的變量名、過程名、函數(shù)名等標(biāo)識符前面加下劃線“_”。 例如,在C語言程序中變量name,在編譯以后變量變?yōu)開name。依次在匯編語言中調(diào)用C語言的函數(shù)和變量時(shí),應(yīng)在函數(shù)名和變量名前面加上下劃線“_”。并在匯編語言程序的開始部分,應(yīng)對調(diào)用的函數(shù)和變量用EXTERN加以說明。 其格式為: EXTERN_函數(shù)名:函數(shù)類型 EXTERN_函數(shù)名:變量類型,其中,函數(shù)類型指明該函數(shù)是一個(gè)近程或遠(yuǎn)程函數(shù)(NEAR或FAR),變量類型為變量的數(shù)據(jù)類型。 其對應(yīng)關(guān)系: C語言 匯編語言 數(shù)據(jù)長度(字節(jié)) Char DB(BYTE) 1 int short DW(WORD) 2 long DD(DWORD) 4 float double DQ(QWORD) 8 例如調(diào)用C程序中名為myfunc( )的函數(shù)和變量mem等,則在C語言程序中說明為: int myfunc(vido); int mem; char ch; long result,在調(diào)用它的匯編子程序中說明為: extern _ myfunc:char extrn_mem:word,ch:byte,result:dword 若C程序調(diào)用匯編語言中的子程序或變量,則在匯編語言中用public進(jìn)行說明,且函數(shù)名和變量名前用下劃線。如: public _myfunc01 public_num 而在C語言中則應(yīng)將其說明為extern,即: extern myfunc01( ); extern num; 要注意此處不能帶有下劃線,同時(shí)要注意C語言對大小寫敏感的問題。,(2)參數(shù)傳遞 C語言調(diào)用匯編子程序時(shí),參數(shù)是通過堆棧傳遞給匯編子程序的,要注意C語言程序參數(shù)入棧的的順序是從右到左,在執(zhí)行匯編子程序前還要將返回地址壓入堆棧。由于堆棧是向下生長的,故每入棧一次。棧指針都相應(yīng)減少;而在出棧時(shí)相反。 例如,在C程序中說明一個(gè)用匯編書寫的函數(shù),若在小內(nèi)存模式下編譯,則表示為: void abc(char*p1,int p2); 在大內(nèi)存模式下編譯,則要說明為遠(yuǎn)程的,如下所示: void far abc(char*p1,int p2); 在大內(nèi)存模式下,要將相應(yīng)的段地址和便移地址入棧。,3.寄存器使用規(guī)則 在C語言中調(diào)用的匯編語言模塊中,通常匯編程序可以任意使用計(jì)算機(jī)內(nèi)部的通用寄存器,如AX、BX、CX、DX、ES等。這些通用寄存器的值在調(diào)用后可以發(fā)生改變,標(biāo)志寄存器的值也可以發(fā)生改變。但有些寄存器如:DS、CS、SS、BP、SP等,如果在調(diào)用的匯編語言程序中有用到,則必須先進(jìn)行保護(hù)(入棧),退出前加以恢復(fù)(出棧)。變址寄存器SI和DI如在調(diào)用匯編語言程序中使用到也要加以保護(hù)。,4.存儲模式規(guī)則 在TURBO C中提供了6種不同的存儲模式,分別對應(yīng)6種不同的匯編語言存儲模式。即對不同的C語言存儲模式(極小、小、緊湊、中、大和巨)要選用相應(yīng)的匯編語言存儲模式,如C程序?yàn)樾∧J?匯編程序也用小模式,C程序?yàn)榇竽J?匯編也用大模式等。 設(shè)定匯編語言的存儲模式可采用.MODEL偽指令,設(shè)定TUBRO C的存儲模式可利用TCC命令行的選項(xiàng)-m。 下面是一個(gè)C語言程序調(diào)用匯編語言子程序的例子,假定C語言主程序存放在文件c_main.c和masm_sub.asm中,c_main.c文件: extern int divs(int,int); /*聲明divs為外部函數(shù)*/ main ( ) printf(“%dn”,divs(16,3);/*調(diào)用外部函數(shù)*/ ,masm_sub.asm文件 .MODEL SMALL ;采用小模式 .CODE PUBLIC divs ;指明該過程可被外部調(diào)用 divs proc PUSH BP ;保護(hù)bp MOV BP,SP MOV AX,BP+4 ;參數(shù) MOV CX,BP+6 ;另一個(gè)參數(shù) SHR AX,CL POP BP ;恢復(fù)bp RET divs ENDP END,其中偽指令model small 對應(yīng)C的小模式編譯;code 標(biāo)志一個(gè)代碼段的開始,這是MASM 5.0的簡化段格式;puplic divs 說明divs是公用的,可以由外部其它單獨(dú)編譯模塊調(diào)用。 將C源程序以文件名c_main.c存盤,匯編語言源程序以文件名masm_sub.asm 存盤;再分別用各自的編譯系統(tǒng),編譯成目標(biāo)程序c_main.obj和masm_sub.obj;最后用link連接程序,將兩個(gè)目標(biāo)程序連 接成可執(zhí)行程序c_main.exe。 其實(shí),匯編語言與C語言混合編程時(shí),除了可以在C語言中調(diào)用匯編語言子程序,也可以在匯編語言代碼中調(diào)用C語言函數(shù),但在調(diào)用時(shí)要注意函數(shù)參數(shù)的傳遞方法。詳情請參見有關(guān)文獻(xiàn)資料。,3使用C和匯編語言混合編程的編譯及連接 對于用C語言和匯編語言分別獨(dú)立編寫的符合以上要求的程序,要想使它們最終形成一個(gè)系統(tǒng),需要對他們進(jìn)行編譯和連接,以便生成一個(gè)可執(zhí)行文件。 在混合編程時(shí)要注意,C程序和匯編語言子程序所采用的內(nèi)存模式,當(dāng)都是小/微/緊湊模式時(shí),在C程序的說明部分是需要說明為EXTERN即可,否則必須說明為FAR型,下面是在Turbo C環(huán)境下同為小內(nèi)存模式的混合編程的例子。 例 : 從6個(gè)數(shù)中找出其中的最大數(shù)并顯示。要求查找最大數(shù)的功能由匯編語言子程序max-num實(shí)現(xiàn)。,(1)編寫源程序 匯編子程序使用簡化的段格式編寫。C程序調(diào)用該子程序時(shí),共傳遞7個(gè)參數(shù),第一個(gè)為數(shù)據(jù)的個(gè)數(shù),其余為數(shù)據(jù)部分。 源程序如下: #include /*program name :c_max.c*/ int extern max_num(int count,int v1,int v2,int v3,int v4,int v5,int v6); main () int i; i=max_num(6,-35,17,0,63.121,112); printf(“n the maximum of the 6 numbers %d,i); ,對應(yīng)的匯編程序如下: .model small ;program name :asm_max.asm .code public _max_num _max_num proc near push bp mov bp,sp mov cx,bp+4 ;取數(shù)據(jù)個(gè)數(shù) jcxz exit mov ax,bp+6 ;取第一個(gè)數(shù)據(jù) comp: add bp,2 ;修改地址指針 cmp ax,bp+6 ;兩數(shù)比較 jge gtest mov ax,bp+6 ;大數(shù)放在AX中 gtest: loop comp exit: pop bp ret _max_num endp end,(2)編譯和連接 在DOS環(huán)境下,用TASM或MASM將匯編語言子程序(asm_max_asm)編譯生成目標(biāo)文件.obj(asm_max.obj)。例如:tasm asm_max. 在TC主界面下,單擊主菜單中的project項(xiàng),選中子項(xiàng)project name,輸入一個(gè)后綴為為.prj的工程文件(例如max.prj)該文件包含需要編譯連接的C語言源程序和它調(diào)用的匯編語言子程序的目標(biāo)文件名,對于本例,其內(nèi)容為: c_max.c asm_max.obj,關(guān)閉大小寫敏感開關(guān),即把Options選項(xiàng)的Linker的Case-sensitive Link置成OFF。 按F9鍵對工程文件進(jìn)行編譯連接,生成一個(gè).exe文件,本例為max.exe. 在DOS環(huán)境下輸入MAX運(yùn)行該可執(zhí)行程序。 對于不是小/微/緊湊內(nèi)存模式下的混合編程,C程序必須把被調(diào)用的匯編子程序說明為遠(yuǎn)程函數(shù),若有函數(shù)參數(shù)為指針類型時(shí),也要說明成FAR型,即它包含段地址和便移地址兩部分。,例:求若干個(gè)16位帶符號數(shù)之和,其和為32位數(shù)。 要求求和程序用匯編語言編寫,而定義數(shù)據(jù)和及顯示用C語言編寫。 參考程序如下: extern long asum(int*,int); int buf5=10000,-20000,30000,6000,0); main( ) long x; x=asum(buf,5); printf(“x=%dn”,x) ,在C函數(shù)中聲明asum是外部函數(shù),并定義了若干個(gè)數(shù)組元素,然后調(diào)用匯編子程序asum求和,最后把結(jié)果顯示在屏幕上。 在匯編程序中首先聲明asum子程序是公用的,然后使用由堆棧傳遞的數(shù)組開始地址及元素個(gè)數(shù),從數(shù)組中取出元素求和,返回的32位結(jié)果在DX:AX中。,4 匯編語言程序調(diào)用C函數(shù) 如同C語言程序調(diào)用匯編語言子程序一樣,在匯編語言中調(diào)用C函數(shù)時(shí)也要按有關(guān)約定編程。 在匯編語言中,對所使用的C函數(shù)和變量名在其名字前均應(yīng)加下劃線。例如,調(diào)用一個(gè)C函數(shù)func(),則在匯編程序中應(yīng)寫作call_func. 對調(diào)用的C函數(shù)用EXTERN偽指令加以說明。若函數(shù)為NEAR型,EXTERN語句可以放在代碼段中,為FAR型,則要放在所有的段之外。 對匯編語句中使用的C函數(shù)變量用“EXTERN變量名:size”說明,其中,SIZE視數(shù)據(jù)類型而定。例如int 型為2。 參數(shù)傳遞有兩種,一種是在C程序中定義變量,在匯編程序中把它說明成EXTERN型,另一種是采用堆棧傳遞,這時(shí)要注意壓入堆棧的順序。,4 MASM6.0匯編語言程序上機(jī) 匯編語言程序上機(jī)過程分為編輯、匯編、連接和調(diào)試4個(gè)步驟。 (1)編輯源程序 編輯源程序是利用文本編輯工具生成一個(gè)由匯編語言語句構(gòu)成的文本文件,文件擴(kuò)展名為.ASM,擴(kuò)展名不能省略。 (2)匯編源程序 匯編語言源程序不能直接執(zhí)行,必須轉(zhuǎn)換為機(jī)器語言程序,這個(gè)過程叫匯編。最常用的匯編工具為MASM軟件,它有很多版本,這里主要介紹MASM6.X。MASM6.X包含了許多文件,最常用的文件有: ML.EXE 匯編程序 LINK.EXE 連接程序 CV.EXE 調(diào)試程序Code View,1.匯編程序ML.EXE(Masm and Link) ML可以自動調(diào)用LINK,實(shí)現(xiàn)對程序的匯編和連接。設(shè)源文件名為MYFILE.ASM,匯編的基本命令格式為: ML/c MYFILE.ASM 其中,源文件的擴(kuò)展名為.ASM。若程序無語法錯(cuò)誤,則匯編后將生成MYFILE.OBJ文件。此外若不帶參數(shù)/c,直接使用命令; ML MYFILE.ASM 則ML將自動調(diào)用連接程序LINK進(jìn)行連接,生成MYFILE.OBJ與MYFILE.EXE,這樣就不需要單獨(dú)使用LINK命令。 ML包含很多命令參數(shù),使用命令/?可以列出ML允許的所有參數(shù)及其說明。ML命令格式如下: ML/選項(xiàng)源文件列表/LINK連接選項(xiàng),其中,方括號中的內(nèi)容為可選項(xiàng)。ML后的參數(shù)是大小寫敏感的?!?選項(xiàng)”是可選的一個(gè)或多個(gè)參數(shù),每
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年江蘇客運(yùn)從業(yè)資格考試題庫及答案
- 2025年廣州出租車從業(yè)資格證考題
- 社工服務(wù)培訓(xùn)課件
- 安檢機(jī)培訓(xùn)課件
- 心電監(jiān)護(hù)的題目及答案
- 小組話題題目大全及答案
- 小學(xué)應(yīng)用題目及答案
- 三角形全等幾何模型-一線三等角模型(基礎(chǔ)篇)
- 江蘇省農(nóng)業(yè)農(nóng)村廳事業(yè)單位真題2024
- 2024年廣西三支一扶考試真題
- (完整版)python學(xué)習(xí)課件
- 聯(lián)塑管材檢驗(yàn)報(bào)告模板
- 高鈉血癥護(hù)理查房
- 小學(xué)數(shù)學(xué)練習(xí)設(shè)計(jì)的有效性研究結(jié)題報(bào)告
- 汕頭市龍湖區(qū)2021年教師招聘《教育公共知識》試題及答案
- 浙江溫州十校2023至2024學(xué)年高二下學(xué)期6月期末聯(lián)考化學(xué)試題附參考答案(解析)
- 語文-山東省淄博市2023-2024學(xué)年高二下學(xué)期7月期末教學(xué)質(zhì)量檢測試題和答案
- 湖南省婁底市漣源市2023-2024學(xué)年六年級下學(xué)期6月期末英語試題
- 上海市徐匯區(qū)市級名校2025屆物理高一第二學(xué)期期末考試模擬試題含解析
- 天一大聯(lián)盟2024屆高一數(shù)學(xué)第二學(xué)期期末統(tǒng)考試題含解析
- 【語文】西安外國語大學(xué)附屬小學(xué)(雁塔區(qū))小學(xué)五年級下冊期末試卷(含答案)
評論
0/150
提交評論