安徽理工大學(xué)計(jì)算機(jī)匯編教程-匯編語言與CC的混合編程.ppt
《安徽理工大學(xué)計(jì)算機(jī)匯編教程-匯編語言與CC的混合編程.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《安徽理工大學(xué)計(jì)算機(jī)匯編教程-匯編語言與CC的混合編程.ppt(22頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
2020 2 22 第13章匯編語言與C C 的混合編程 1 8086 8088和ARM核匯編語言程序設(shè)計(jì) 第13章匯編語言與C C 的混合編程 2020 2 22 第13章匯編語言與C C 的混合編程 2 13 1C C 語言參數(shù)調(diào)用協(xié)議 13 2匯編語言與C C 語言的連接 第13章匯編語言與C C 的混合編程 2020 2 22 第13章匯編語言與C C 的混合編程 3 調(diào)用協(xié)議是指在進(jìn)行了程序調(diào)用時(shí) 主程序向子程序傳遞參數(shù)以及從子程序獲得返回值的方式 通常使用系統(tǒng)堆棧向子程序傳遞入口參數(shù) 而使用CPU內(nèi)部寄存器來保存子程序的返回值 采用C C 語言調(diào)用協(xié)議調(diào)用一個(gè)子程序時(shí) 是按照調(diào)用參數(shù)表自右向左的順序?qū)⒆映绦蛉肟趨?shù)壓入堆棧的 13 1 1入口參數(shù)傳遞規(guī)則 13 1C C 語言參數(shù)調(diào)用協(xié)議 2020 2 22 第13章匯編語言與C C 的混合編程 4 例如在C語言源程序中有子程序max a b c 則是參數(shù)c最先入棧 然后是參數(shù)b入棧 最后是參數(shù)a入棧 且位于棧頂 堆棧的地址變化是向下增長的 最后一個(gè)進(jìn)入堆棧的參數(shù)總在內(nèi)存的低端 它的地址 BP 偏移量 其中偏移量在小 緊湊模式下是4 在中 大 巨模式下是6 C傳遞到匯編的參數(shù)若是基本數(shù)據(jù)類型之一 則該參數(shù)實(shí)際值被拷貝到堆棧中 執(zhí)行匯編語言子程序時(shí) 將從堆棧中取出其參數(shù)的值 對于結(jié)構(gòu)類型變量 如數(shù)組等 則將指向該結(jié)構(gòu)變量的地址指針傳送到堆棧中 表13 1指出了各基本數(shù)據(jù)類型在堆棧中所占的字節(jié)數(shù) 13 1 1入口參數(shù)傳遞規(guī)則 13 1C C 語言參數(shù)調(diào)用協(xié)議 2020 2 22 第13章匯編語言與C C 的混合編程 5 13 1 1入口參數(shù)傳遞規(guī)則 13 1C C 語言參數(shù)調(diào)用協(xié)議 表13 1C語言中各種類型變量在棧中所占的字節(jié)數(shù) 2020 2 22 第13章匯編語言與C C 的混合編程 6 13 1 2返回參數(shù)傳遞規(guī)則 13 1C C 語言參數(shù)調(diào)用協(xié)議 經(jīng)匯編程序處理的結(jié)果通過AX和DX寄存器返回給C主程序 一般情況下只需通過AX寄存器即可將匯編程序的返回值傳遞給C程序 對于長整型數(shù)還需使用DX寄存器 至于結(jié)構(gòu)變量 浮點(diǎn)數(shù) 雙精度數(shù) 則存放在一塊靜態(tài)存儲區(qū)內(nèi) 用AX和DX返回指向它們的指針 C程序中的接受變量應(yīng)與返回值類型一致 返回值與寄存器的對應(yīng)關(guān)系見表13 2 2020 2 22 第13章匯編語言與C C 的混合編程 7 13 1 2返回參數(shù)傳遞規(guī)則 13 1C C 語言參數(shù)調(diào)用協(xié)議 表13 2C程序返回值與匯編語言寄存器對應(yīng)關(guān)系 2020 2 22 第13章匯編語言與C C 的混合編程 8 13 1C C 語言參數(shù)調(diào)用協(xié)議 第13章匯編語言與C C 的混合編程 13 2匯編語言與C C 語言的連接 2020 2 22 第13章匯編語言與C C 的混合編程 9 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 所謂模塊連接法是指將匯編語言源程序和高級語言源程序分別編譯成目標(biāo)文件 再將目標(biāo)文件進(jìn)行連接 形成可執(zhí)行文件的編程方法 要使匯編語言模塊和C語言模塊正確地連接到一起 必須做到兩點(diǎn) 首先是匯編模塊必須采用和C模塊一致的存儲模式 其次匯編模塊還必須遵守和C語言兼容的命名約定 命名約定包括段組命名約定和函數(shù)變量量命名約定 2020 2 22 第13章匯編語言與C C 的混合編程 10 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 1 存儲模式 C語言的存儲模式和匯編語言相同 共有六種不同的存儲模式 微模式 TINY 小模式 SMALL 中模式 MEDIUM 緊湊模式 COMPACT 大模式 LARGE 和超大模式 HUGE 在混合編程時(shí)應(yīng)該保持匯編語言和C的存儲模式一致 這里尤其要注意的是 在小模式下所有的指針都是near型的近指針 而數(shù)據(jù) 堆棧和代碼可以各占一個(gè)段空間 這樣運(yùn)算速度快而且可用空間也大 程序運(yùn)行效率最高 所以 應(yīng)該盡量采用小模式進(jìn)行混合編程 2020 2 22 第13章匯編語言與C C 的混合編程 11 2 標(biāo)識符命名約定 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 在一般情況下 由C語言編譯器所編譯出的源程序目標(biāo)碼中 缺省時(shí)自動(dòng)在所有標(biāo)識符前面加一個(gè)下劃線 這一點(diǎn)可以在所有的C語言程序編譯后所產(chǎn)生的匯編碼中清楚地看到 因此 在編寫能被C語言程序調(diào)用的匯編語言程序時(shí) 必須將與C語言程序調(diào)用相關(guān)的標(biāo)識符前面也加上下劃線 才能取得和C語言程序的一致性 另外 在使用中還應(yīng)注意以下問題 匯編語言子程序中供C語言程序使用的變量 除了在標(biāo)識符前加下劃線外 還必須用public說明為 public 變量名 匯編語言子程序變量的定義必須與C語言程序中變量的說明一致 在供C語言程序調(diào)用的匯編子程序中 必須用public偽操作指明該子程序是可以供外部模塊調(diào)用的 說明為public 過程名 為了在C語言程序中引用匯編語言子程序和變量 在C程序中應(yīng)使用extern語句聲明 2020 2 22 第13章匯編語言與C C 的混合編程 12 3 C程序和匯編程序連接 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 根據(jù)上面的有關(guān)約定 下面給出C程序調(diào)用匯編語言子程序的主要步驟 匯編語言子程序的編寫和處理 1 使用和C相同的存儲模式定義各個(gè)段空間 沒有用到的段可以不定義 2 在匯編語言源程序中用PUBLIC偽指令聲明C需要引用的子程序和變量 3 按照C語言調(diào)用協(xié)議從堆棧中取得入口參數(shù) 4 對參數(shù)進(jìn)行處理 實(shí)現(xiàn)相應(yīng)的功能 5 將返回值送入AX DX 或者DX AX中返回 6 將匯編源程序編譯成目標(biāo)文件 obj C程序的編寫和處理 1 在TurboC C BorlandC 集成開發(fā)環(huán)境中編寫C主程序 并在主源程序中用extern聲明匯編語言子程序和變量 2 建立項(xiàng)目文件 PRJ 使其包含C主程序和匯編子程序目標(biāo)文件名 obj 3 將集成開發(fā)環(huán)境的Project projectname設(shè)為C主程序名 prj 并且將編譯模式子菜單設(shè)為要求的編譯模式 4 用Compiler MakeEXEfile子菜單或直接按F9 生成可執(zhí)行文件 EXE 2020 2 22 第13章匯編語言與C C 的混合編程 13 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 例13 1匯編語言程序?qū)崿F(xiàn)將C語言程序中的整型變量num加1 并返回給C程序 程序如下 C程序 intnum 0 externvoidincnum void main inti for i 0 i 10 i incnum printf d num 匯編程序modelsmallEXTERN num wordPUBLIC incnum code incnumprocinc numret incnumendpend 程序運(yùn)行結(jié)果為 12345678910 2020 2 22 第13章匯編語言與C C 的混合編程 14 例13 3C語言程序和采用完整段定義形式實(shí)現(xiàn)的匯編程序的連接 下面的程序?qū)崿F(xiàn)求2個(gè)整數(shù)中的最大數(shù)并輸出 13 2 1模塊連接法 13 2匯編語言與C C 語言的連接 C程序 externintmax int int main inta 2 b 6 intmaxunm maxnum max a b printf twonumbersare dand d a b printf n printf themaxnumberis d maxunm 匯編程序 TEXTSEGMENTBYTEPUBLIC CODE ASSUMECS TEXTPUBLIC max maxPROCNEARPUSHBPMOVBP SPMOVAX BP 4 AX 函數(shù)的第一個(gè)參數(shù)CMPAX BP 6 第一個(gè)參數(shù)和第二個(gè)參數(shù)比較JGEOKMOVAX BP 6 如果第一個(gè)參數(shù)比第二個(gè)參數(shù)小OK 將大數(shù)送AXPOPBPRET maxENDP TEXTENDSEND 2020 2 22 第13章匯編語言與C C 的混合編程 15 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 所謂嵌入式匯編是指將匯編語言代碼直接放入C語言程序中的一種混合編程方法 嵌入式匯編提供了一種簡單而又明快的方法 匯編語言代碼的高速性和深層控制能力可以大大改善程序的性能 同時(shí)也避免了C語言與匯編語言的接口所固有的復(fù)雜性 當(dāng)然這也多少比單用匯編語言編寫的模塊多一些開銷 但這比起由嵌入式匯編所帶來的效益是微不足道的 本節(jié)以TurboC來說明如何在C語言程序中使用嵌入式匯編 2020 2 22 第13章匯編語言與C C 的混合編程 16 TurboC的嵌入式匯編可以滿足用戶的各種愿望 可以將匯編碼直接放入C語言程序的任何位置 嵌入的匯編碼可以全面地訪問C語言程序中的常量 變量 甚至函數(shù) 嵌入式匯編可以極大地改善程序的性能 與用嚴(yán)格的匯編語言編寫出的程序幾乎具有同樣強(qiáng)大的功能 在TurboC的高性能函數(shù)庫中有相當(dāng)一部分的程序代碼是使用嵌入式匯編完成的 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 2020 2 22 第13章匯編語言與C C 的混合編程 17 嵌入式匯編的語句格式 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 嵌入式匯編語句的一般格式是 asm 標(biāo)號 或者 新語句行 下面對匯編語句格式進(jìn)行以下說明 1 asm項(xiàng)是每個(gè)嵌入式匯編語句開頭必須的關(guān)鍵字 2 標(biāo)號項(xiàng)是一個(gè)有效的匯編標(biāo)號 與普通的匯編語言格式一樣 標(biāo)號是可選項(xiàng) 3 指令 偽指令項(xiàng)是任何一條有效的8086指令或者匯編語言偽指令 4 操作數(shù)項(xiàng)是CPU內(nèi)部寄存器或者C源程序中定義的變量 常量或標(biāo)號 5 或者 新語句行 項(xiàng)表示嵌入式匯編語句的結(jié)束 可選項(xiàng) 嵌入式匯編語句結(jié)束的方法有兩種 一是象普通的C語句一樣以分號 結(jié)束 也可以采用匯編語言指令一樣直接以換行符結(jié)束 在同一水平行內(nèi)可有多條嵌入式匯編語句匯編語句 這時(shí)語句間必須以分號 分隔 但是一條嵌入式匯編語句不能被分割為多行文本 還應(yīng)注意不能再用分號 來表示匯編注釋的開始 注釋應(yīng)采用C語言的標(biāo)準(zhǔn)注釋 來表示 2020 2 22 第13章匯編語言與C C 的混合編程 18 2 嵌入式匯編的編譯 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 使用嵌入式匯編的C程序 編譯時(shí)需要使用 B 大寫 選擇項(xiàng) 在TurboC中 進(jìn)行編譯命令的格式為TCC B 若不使用一B選擇項(xiàng) 編譯器一遇到嵌入式匯編代碼 就給出警告信息 并以 B選擇項(xiàng)重新進(jìn)行編譯 在C程序中加上即 pragmainline語句 作用與 B選擇項(xiàng)等價(jià) 編譯時(shí)嵌入式匯編語句中操作碼和操作數(shù)將直接復(fù)制到由C源程序產(chǎn)生的匯編文件 其中涉及的C符號用適當(dāng)?shù)牡葍r(jià)匯編符號代替 另外 必須有TurboAssember TASM 程序 C編譯器首先產(chǎn)生匯編源文件 然后調(diào)用TASM產(chǎn)生目標(biāo)文件 obj 進(jìn)一步生成 EXE文件 2020 2 22 第13章匯編語言與C C 的混合編程 19 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 3 嵌入式匯編的舉例 例13 5實(shí)現(xiàn)下列函數(shù) 0 x 01x 0 y 函數(shù)表達(dá)式中x y均為整數(shù) 用嵌入式匯編實(shí)現(xiàn) 2020 2 22 第13章匯編語言與C C 的混合編程 20 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 程序如下 pragmainlinemain intx y scanf d 2020 2 22 第13章匯編語言與C C 的混合編程 21 例13 6用嵌入式匯編實(shí)現(xiàn)求兩個(gè)數(shù)的最大值的函數(shù) 程序如下 intmax inta intb asmmovax aasmcmpax basmjgeexitasmmovax bexit return AX 13 2 2嵌入式匯編法 13 2匯編語言與C C 語言的連接 2020 2 22 第13章匯編語言與C C 的混合編程 22 第6章作業(yè) 6 16 2- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 安徽理工 大學(xué)計(jì)算機(jī) 匯編 教程 匯編語言 CC 混合 編程
鏈接地址:http://www.820124.com/p-6296884.html