C語(yǔ)言內(nèi)嵌匯編_第1頁(yè)
C語(yǔ)言內(nèi)嵌匯編_第2頁(yè)
C語(yǔ)言內(nèi)嵌匯編_第3頁(yè)
C語(yǔ)言內(nèi)嵌匯編_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

-.z.C語(yǔ)言內(nèi)嵌匯編在C語(yǔ)言中如何使用匯編語(yǔ)言呢?這個(gè)問題在不同的編譯器中,具體實(shí)現(xiàn)方法是不同的。不過在實(shí)現(xiàn)大方上也不過就是有兩種,而且各種編譯器的實(shí)現(xiàn)方法也是**小異。一種是在C語(yǔ)言中嵌入?yún)R編語(yǔ)言代碼,另一種是讓C語(yǔ)言從外部調(diào)用匯編。下面我們就以Borland格式為例來說一說具體用法。但是,GCC與Microsoft的實(shí)現(xiàn)方法的與Borland只在格式上有點(diǎn)區(qū)別。當(dāng)然,GCC的嵌入?yún)R編是AT&T格式的。還好,不管什么格式,只是表達(dá)形式的不同而已,其內(nèi)在含義是一模一樣的。還是那句話各種編譯器的實(shí)現(xiàn)方法是**小異的,并沒有本質(zhì)的區(qū)別。另外在最后還附帶了一篇介紹在GCC中使用內(nèi)嵌匯編的文章。一、兩種實(shí)現(xiàn)方式首先,我們看一看在C語(yǔ)言中如何嵌入?yún)R編語(yǔ)言代碼。在C語(yǔ)言中嵌入?yún)R編語(yǔ)言代碼,也有兩種格式,一種是單句的,一種是模塊的。我們來看看一些簡(jiǎn)單的例子。例子1:?jiǎn)尉涓袷降模簃ain〔〕{asmmovah,2;asmmovbh,0;asmmovdl,20;asmmovdh,10;asmint10h;/*調(diào)用BIOS中斷設(shè)置光標(biāo)位置*/}模塊格式的:main〔〕{asm{movah,2movbh,0movdl,20movdh,10int10h}}在這個(gè)小程序里面并沒有突出"嵌入〞二字。不過從這個(gè)程序中可以看出其根本格式。嵌入的各行代碼前面加上asm關(guān)鍵字或者把匯編語(yǔ)句放入asm代碼塊中,每行以分號(hào)或換行符完畢,而注釋必須是C語(yǔ)言格式的。下面我們來看一個(gè)讓C語(yǔ)言和匯編協(xié)作的例子:例子2:main(){charconst*MESSAGE=〞OutPutfromasm..\n$〞;asm{movah,9movd*,MESSAGEint21h}}上面這個(gè)例子十分的簡(jiǎn)單,它的純C語(yǔ)言版本是:#include<stdio.h>main(){printf("OutPutfromasm..\n$〞);}接下來我們看一看如何讓C語(yǔ)言調(diào)用匯編例程。我們還是看一個(gè)簡(jiǎn)單的小程序:C語(yǔ)言局部如下:e*terncursor(int,int),main(){cursor(15,12);}匯編語(yǔ)言局部如下:.MODELSMALL.CODEPUBLIC_CURSORPROCPUSHBPMOVBP,SPMOVDH,[BP+4]MOVDL,[BP+6]MOVAH,02MOVBH,00INT10HPOPBPRET_CURSORENDP通過上面這個(gè)程序,你會(huì)看到調(diào)用匯編語(yǔ)言的關(guān)鍵就是如何傳遞參數(shù)。事實(shí)上,是通過堆棧來傳遞的但是具體規(guī)則是什么呢?下面我就來看看。二、調(diào)用規(guī)則實(shí)際上,在C語(yǔ)言中使用匯編語(yǔ)言最困難的就是如何平安有效的傳遞參數(shù)。否則在調(diào)用匯編子程序時(shí)就會(huì)從堆棧中取出錯(cuò)誤的參數(shù)。更可惡的是這種錯(cuò)誤在編譯的時(shí)候是不會(huì)發(fā)現(xiàn)錯(cuò)誤提示的。下面是C與MASM匯編語(yǔ)言混合是用的時(shí)候采用的規(guī)則:1、參數(shù)傳遞的次序與它們出現(xiàn)的次序是相反的。例如上例中的cursor(*,y)中,首先傳遞的是y,然后才是*。這與我們的一般想法是不一樣的,所以在這兒容易出現(xiàn)錯(cuò)誤。2、傳遞完參數(shù)后,C程序還將保存〔CS,IP〕。如果C程序是SMALL或PACT存儲(chǔ)模式下編譯的〔或者過程是NEAR型的〕,則只保存IP,而在MEDIUM、LARGE或HUGE模式下編譯的〔或者過程是FAR型的〕,則CS和IP都會(huì)被壓入堆棧,其順序是CS在前,IP在后。不過這個(gè)過程是C語(yǔ)言自動(dòng)進(jìn)展的而不需要我們干預(yù)。這也就是我們?cè)诶?中為什么用MOVDH,[BP+4]而不是MOVDH,[BP]。因?yàn)榍懊媸荂S和IP而不是參數(shù),真正的參數(shù)從[BP+4]開場(chǎng)。3、還有BP也必須保存在堆棧中,然后我們才可以通過BP和偏移地址來訪問參數(shù)。4、最后一條指令應(yīng)當(dāng)是后面不帶數(shù)字的RET,因?yàn)榘讯褩5皆嘉恢玫墓ぷ鲗⒂蒀程序重新獲得控制權(quán)以后才會(huì)執(zhí)行。5、任何于C程序共享的名稱都必須在前面加下劃線,而且C語(yǔ)言只識(shí)別前8個(gè)字符。6、對(duì)于普通的參數(shù)C語(yǔ)言傳遞的是參數(shù)值,而對(duì)于數(shù)組,傳遞的是指針〔也就是數(shù)據(jù)的地址〕。7、如果C程序是在MEDIUM、LARGE或HUGE模式下編譯的,則匯編語(yǔ)言過程應(yīng)該設(shè)為FAR型,C程序是SMALL或PACT存儲(chǔ)模式下編譯的,則匯編語(yǔ)言過程應(yīng)該設(shè)為NEAR型。不過在MASM5.1或TASM1.0以及更高的版本的時(shí)候就不必?fù)?dān)憂偏移地址、在共享名稱前加下劃線以及保存BP這些瑣事了,因?yàn)樗鼈兛梢杂删幾g器自動(dòng)完成了。很顯然例子2是舊格式的。三、把參數(shù)返回C程序當(dāng)C程序需要從匯編過程獲得*個(gè)參數(shù)時(shí),這個(gè)參數(shù)應(yīng)該通過存放器來傳遞。具體使用哪些存放器取決于參數(shù)的大小,請(qǐng)看下表:存放器大小〔字節(jié)〕C數(shù)據(jù)類型AL1Char,shortA*2IntD*:A*4Long四、把匯編語(yǔ)言程序與C語(yǔ)言程序到一起1、確保匯編語(yǔ)言中的過程被定義為PUBLIC,過程名以下劃線開場(chǎng)。例如,在C語(yǔ)言中叫做"sum〞到匯編語(yǔ)言中就應(yīng)該是"_sum〞.2、在C語(yǔ)言程序中過程定義為外部類型,例如在例子2中的e*terncursor(int,int)。3、用匯編器對(duì)匯編語(yǔ)言程序匯編,得到***.obj文件。4、用C語(yǔ)言編譯器編譯C語(yǔ)言程序,得到Y(jié)YY.obj文件。5、用器將它們到一起生成可執(zhí)行文件:link***.obj+YYY.obj以上就是混合使用C語(yǔ)言和匯編語(yǔ)言應(yīng)該注意的幾點(diǎn)問題。關(guān)于在GCC中使用匯編語(yǔ)言大體上是和上面一樣的,只是實(shí)現(xiàn)細(xì)節(jié)上有一點(diǎn)區(qū)別而已。下面的這篇文章對(duì)于在GCC中使用內(nèi)嵌匯編進(jìn)展詳細(xì)的解釋。GCC使用的內(nèi)嵌匯編語(yǔ)法格式小教程本文對(duì)內(nèi)嵌匯編語(yǔ)法,從根本語(yǔ)法、內(nèi)嵌匯編的格式介紹、和擴(kuò)展的內(nèi)嵌匯編格式進(jìn)展了詳細(xì)說明,需要說明的是GCC采用的是AT&T的匯編格式.一、根本語(yǔ)法語(yǔ)法上主要有以下幾個(gè)不同.*存放器命名原則AT&T:%ea*Intel:ea**源/目的操作數(shù)順序AT&T:movl%ea*,%eb*Intel:moveb*,ea**常數(shù)/立即數(shù)的格式AT&T:movl$_value,%eb*Intel:movea*,_value把_value的地址放入ea*存放器AT&T:movl$0*d00d,%eb*Intel:moveb*,0*d00d*操作數(shù)長(zhǎng)度標(biāo)識(shí)AT&T:movw%a*,%b*Intel:movb*,a**尋址方式AT&T:immed32(basepointer,inde*pointer,inde*scale)Intel:[basepointerinde*pointer*inde*scaleimm32]Linu*工作于保護(hù)模式下,用的是32位線性地址,所以在計(jì)算地址時(shí)不用考慮segment:offset的問題.上式中的地址應(yīng)為:imm32basepointerinde*pointer*inde*scale下面是一些例子:*直接尋址AT&T:_booga;_booga是一個(gè)全局的c變量注意加上$是表示地址引用,不加是表示值引用.注:對(duì)于局部變量,可以通過堆棧指針引用.Intel:[_booga]*存放器間接尋址AT&T:(%ea*)Intel:[ea*]*變址尋址AT&T:_variable(%ea*)Intel:[ea*_variable]AT&T:_array(,%ea*,4)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論