匯編語(yǔ)言程序設(shè)計(jì)-課件 第八章 輸入、輸出和中斷程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件 第八章 輸入、輸出和中斷程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件 第八章 輸入、輸出和中斷程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件 第八章 輸入、輸出和中斷程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件 第八章 輸入、輸出和中斷程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第八章輸入、輸出和中斷程序設(shè)計(jì)8.1混合編程概述一、什么是混合編程

混合編程是指在軟件開(kāi)發(fā)過(guò)程中,結(jié)合使用兩種或多種不同的編程語(yǔ)言、技術(shù)或框架來(lái)構(gòu)建應(yīng)用程序。這種編程方式可以充分利用每種語(yǔ)言或技術(shù)的優(yōu)勢(shì),彌補(bǔ)單一語(yǔ)言或技術(shù)的不足,從而實(shí)現(xiàn)更高效、更靈活、更強(qiáng)大的軟件系統(tǒng)。比如說(shuō),Python的執(zhí)行效率偏低,可以將核心模塊用C編寫(xiě),然后在Python中調(diào)用C代碼。比如在龍芯開(kāi)發(fā)中,對(duì)于一些需要對(duì)硬件進(jìn)行精細(xì)操作的場(chǎng)景,如初始化硬件設(shè)備、設(shè)置系統(tǒng)時(shí)鐘、配置中斷控制器等,使用匯編語(yǔ)言可以實(shí)現(xiàn)最直接、最有效的控制。在龍芯的啟動(dòng)代碼中,通常會(huì)用匯編來(lái)完成CPU寄存器的初始化、內(nèi)存映射的設(shè)置等底層操作,為后續(xù)高級(jí)語(yǔ)言程序的運(yùn)行搭建好基礎(chǔ)環(huán)境。二、混合編程的必要性

混合編程通過(guò)結(jié)合不同語(yǔ)言和工具的優(yōu)勢(shì),可以實(shí)現(xiàn)更高效、更靈活、更強(qiáng)大的軟件系統(tǒng)。它在性能優(yōu)化、功能擴(kuò)展、硬件控制、開(kāi)發(fā)效率、兼容性和可移植性等方面都有顯著的優(yōu)勢(shì)。通過(guò)合理選擇混合編程的方式,可以充分發(fā)揮各種技術(shù)的優(yōu)勢(shì),滿足復(fù)雜的應(yīng)用需求,提高軟件開(kāi)發(fā)的質(zhì)量和效率。1.性能優(yōu)化2.功能擴(kuò)展3.硬件控制4.開(kāi)發(fā)效率5.兼容性和可移植性三、混合編程的困難

從表面上來(lái)看,混合編程有兩個(gè)問(wèn)題需要解決:如何找到并調(diào)用另一種語(yǔ)言編寫(xiě)的程序;如何從被調(diào)用語(yǔ)言中返回調(diào)用者繼續(xù)執(zhí)行。對(duì)于匯編語(yǔ)言來(lái)說(shuō),這是一次典型的CALL指令和RET指令。但是,匯編語(yǔ)言中的CALL有三種:short,near,far。同樣,ret也有兩種:near和far。如何確定調(diào)用和返回的目標(biāo)位置的屬性,是首先需要解決的問(wèn)題。

由于匯編語(yǔ)言模塊可以非常自如地設(shè)置目標(biāo)位置的屬性,因此在這方面完全可以滿足任何語(yǔ)言的調(diào)用要求。反過(guò)來(lái),單從這一點(diǎn)上看,從理論上說(shuō),匯編語(yǔ)言也可能調(diào)用任意其它編譯型語(yǔ)言編寫(xiě)的模塊。

其實(shí),調(diào)用的問(wèn)題相對(duì)來(lái)說(shuō)比較容易解決,更重要的原因不同語(yǔ)言的編譯器在內(nèi)存框架、命名規(guī)范、調(diào)用規(guī)則等方面都有所不同。而在匯編語(yǔ)言中,匯編器對(duì)這些完全不做設(shè)定,開(kāi)發(fā)者可以任意設(shè)置內(nèi)存框架、命名規(guī)范、調(diào)用規(guī)則等。所以這種自由設(shè)置的匯編語(yǔ)言程序,無(wú)法被其它語(yǔ)言的程序所調(diào)用。同樣,在匯編語(yǔ)言中調(diào)用其它語(yǔ)言編寫(xiě)的程序時(shí),必須遵守(至少是在調(diào)用的這一個(gè)模塊中遵守)被調(diào)用程序語(yǔ)言的各種規(guī)范。四、混合編程過(guò)程

混合編程是為了實(shí)現(xiàn)更高效、靈活或功能更強(qiáng)大的軟件開(kāi)發(fā),一般分為5個(gè)階段:需求分析、環(huán)境搭建、代碼實(shí)現(xiàn)、測(cè)試與優(yōu)化、部署與維護(hù)。1.需求分析

在開(kāi)始混合編程之前,首先要清楚地了解軟件需要實(shí)現(xiàn)的功能,確定項(xiàng)目中哪些部分對(duì)性能要求極高、需要直接操作硬件,哪些部分注重開(kāi)發(fā)效率、處理復(fù)雜的業(yè)務(wù)邏輯,分析哪些功能適合用哪種語(yǔ)言或技術(shù)實(shí)現(xiàn)。比如,在嵌入式系統(tǒng)開(kāi)發(fā)中,底層的硬件驅(qū)動(dòng)和對(duì)性能敏感的算法用匯編語(yǔ)言實(shí)現(xiàn);而對(duì)于復(fù)雜的數(shù)據(jù)處理,Python或C++可能更合適。2.環(huán)境搭建

配置開(kāi)發(fā)環(huán)境,安裝必要的工具和庫(kù)。如果是在Windows系統(tǒng)上,對(duì)于匯編與C的混合編程,可安裝MinGW或VisualStudio,在Linux系統(tǒng)上,通常自帶GCC編譯器,可直接使用。設(shè)置編譯器的路徑和相關(guān)選項(xiàng),確保編譯器能夠正確識(shí)別和處理不同語(yǔ)言的代碼。3.代碼實(shí)現(xiàn)

確定采用內(nèi)聯(lián)匯編還是外部調(diào)用的方式編寫(xiě)代碼,遵循各語(yǔ)言和框架的編碼規(guī)范。如果是外部調(diào)用,要確保高級(jí)語(yǔ)言和匯編代碼使用相同的調(diào)用約定,如

cdecl、stdcall

等,以保證參數(shù)傳遞和棧的清理方式一致。將編寫(xiě)好的代碼進(jìn)行編譯和鏈接,生成可執(zhí)行程序。4.測(cè)試與優(yōu)化

使用調(diào)試工具(如GDB)對(duì)混合編程代碼進(jìn)行調(diào)試,先檢查程序的執(zhí)行流程、變量的值和內(nèi)存使用情況等,找出潛在的錯(cuò)誤,再對(duì)整個(gè)系統(tǒng)進(jìn)行集成測(cè)試,確保各個(gè)模塊之間能夠正確協(xié)同工作。分析程序的性能瓶頸,對(duì)代碼進(jìn)行優(yōu)化,提高代碼效率。例如,在Python中,可以使用列表推導(dǎo)式代替循環(huán)來(lái)提高代碼的執(zhí)行效率。5.部署與維護(hù)

根據(jù)系統(tǒng)的需求和架構(gòu),選擇合適的部署方案。配置服務(wù)器環(huán)境,確保不同語(yǔ)言和框架能夠正常運(yùn)行。定期更新系統(tǒng),修復(fù)已知的漏洞和問(wèn)題。8.2C與匯編的混合編程

通常情況下,有兩種方法實(shí)現(xiàn)C與匯編語(yǔ)言的混合編程,一種方法是嵌入式匯編,一種是外部調(diào)用。嵌入式匯編也稱為內(nèi)聯(lián)匯編(InlineAssembly),即在C語(yǔ)言的源代碼中直接插入?yún)R編代碼,不需要將匯編代碼單獨(dú)保存在一個(gè)文件中。內(nèi)聯(lián)匯編的優(yōu)點(diǎn)是代碼集成度高,可以減少函數(shù)調(diào)用的額外開(kāi)銷(xiāo),提高程序的運(yùn)行速度,適合于對(duì)性能要求高的少量關(guān)鍵代碼。另一種方法是外部調(diào)用,是指將匯編代碼保存在一個(gè)單獨(dú)的文件(

.s

.asm

)中,這個(gè)單獨(dú)的匯編文件包含了可以獨(dú)立編譯的匯編語(yǔ)言函數(shù)和數(shù)據(jù),在C語(yǔ)言代碼中像調(diào)用普通C函數(shù)一樣調(diào)用匯編函數(shù)。還有一種外部調(diào)用就是匯編代碼種調(diào)用C函數(shù),在編寫(xiě)C函數(shù)時(shí)確保其遵循與匯編代碼一致的調(diào)用約定,在匯編代碼中聲明C函數(shù)的外部引用,然后在需要的地方調(diào)用C函數(shù)。外部調(diào)用主要適用于實(shí)現(xiàn)復(fù)雜的算法或功能,例如實(shí)現(xiàn)加密算法、操作系統(tǒng)內(nèi)核部分、設(shè)備驅(qū)動(dòng)程序等。C與匯編混合編程的兩種方法,主要內(nèi)容:

了解決早期x86實(shí)模式環(huán)境下內(nèi)存尋址的限制問(wèn)題,C語(yǔ)言規(guī)定了六種內(nèi)存模式,分別是Tiny、Small、Medium、Compact、Large、Huge,這些內(nèi)存模式規(guī)定了程序如何使用內(nèi)存,包括代碼段、數(shù)據(jù)段和堆棧段的大小和組織方式,不同的內(nèi)存模式會(huì)影響程序的性能、可訪問(wèn)的內(nèi)存范圍以及編程的復(fù)雜度。一、內(nèi)聯(lián)匯編C語(yǔ)言中的內(nèi)聯(lián)匯編就是允許開(kāi)發(fā)者在C代碼中直接插入?yún)R編指令,從而實(shí)現(xiàn)對(duì)硬件的低級(jí)操作和優(yōu)化性能,不需要額外的匯編和連接步驟。1.

GCC(GNUCompilerCollection)GCC是一個(gè)廣泛使用的開(kāi)源編譯器集合,支持多種編程語(yǔ)言,包括C、C++、Objective-C、Fortran、Ada等。GCC可以在多種操作系統(tǒng)上運(yùn)行,如Linux、macOS、Windows(通過(guò)MinGW或Cygwin等環(huán)境)等。C語(yǔ)言教學(xué)中經(jīng)常用到的Dev-C++默認(rèn)使用MinGW作為編譯器,支持GCC環(huán)境,這里對(duì)GCC作重點(diǎn)介紹。GCC的開(kāi)源性帶來(lái)了很多優(yōu)勢(shì),但在使用和修改時(shí)要遵守GPL許可證的相關(guān)規(guī)定,同時(shí),遵守相關(guān)的法律法規(guī),避免開(kāi)發(fā)惡意程序。2.ClangClang是一個(gè)開(kāi)源的C、C++和Objective-C編譯器,它是LLVM(Low-LevelVirtualMachine)項(xiàng)目的一部分。Clang的編譯速度通常比GCC更快,占用的內(nèi)存更少,Clang支持多種操作系統(tǒng),包括Linux、macOS、Windows等。Clang在大多數(shù)情況下與GCC高度兼容,語(yǔ)法相似,尤其是對(duì)于標(biāo)準(zhǔn)C、C++、Objective-C等語(yǔ)言的基本語(yǔ)法支持,在一些細(xì)節(jié)和擴(kuò)展方面,兩者可能會(huì)有不同。3.MSVC(MicrosoftVisualC++)MSVC(MicrosoftVisualC++)是微軟公司開(kāi)發(fā)的C和C++編譯器,是VisualStudio集成開(kāi)發(fā)環(huán)境(IDE)的一部分。MSVC廣泛用于Windows平臺(tái)上的軟件開(kāi)發(fā),提供了強(qiáng)大的編譯器功能、優(yōu)化技術(shù)以及與Windows系統(tǒng)的深度集成。MSVC的內(nèi)聯(lián)匯編使用__asm關(guān)鍵字,分為單行內(nèi)聯(lián)匯編和多行內(nèi)聯(lián)匯編兩種。4.KeilC51KeilC51是一款專為8051微控制器系列設(shè)計(jì)的集成開(kāi)發(fā)環(huán)境(IDE),廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)。使用#pragmaasm和#pragmaendasm來(lái)標(biāo)記內(nèi)聯(lián)匯編代碼的開(kāi)始和結(jié)束。5.IARCIARC是IARSystems公司開(kāi)發(fā)的集成開(kāi)發(fā)環(huán)境(IDE),廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā),在IARC中,使用

__asm

關(guān)鍵字來(lái)引入內(nèi)聯(lián)匯編代碼塊。

內(nèi)聯(lián)匯編代碼的調(diào)試和維護(hù)通常比純C代碼更復(fù)雜,尤其是當(dāng)匯編代碼量較大時(shí),匯編代碼的錯(cuò)誤更難以發(fā)現(xiàn)和修復(fù),而且內(nèi)聯(lián)匯編代碼通常與特定平臺(tái)的匯編語(yǔ)法緊密相關(guān),難以在不同平臺(tái)上復(fù)用。如果需要編寫(xiě)大量復(fù)雜的匯編代碼,或者需要在多個(gè)平臺(tái)上復(fù)用匯編代碼,或者需要進(jìn)行復(fù)雜的性能優(yōu)化,建議使用外部調(diào)用。二、外部調(diào)用

在C語(yǔ)言和匯編語(yǔ)言混合編程中,外部調(diào)用是指在C代碼里調(diào)用匯編代碼,或者在匯編代碼里調(diào)用C代碼。1.C語(yǔ)言調(diào)用匯編代碼調(diào)用匯編模塊的過(guò)程:先把匯編代碼編寫(xiě)成獨(dú)立的子程序,再在C語(yǔ)言里聲明這個(gè)子程序的原型,最后像調(diào)用普通C函數(shù)一樣調(diào)用該匯編子程序。在這個(gè)過(guò)程中,要注意在不同平臺(tái)(如Windows、Linux、macOS等)上,C語(yǔ)言外部調(diào)用匯編代碼存在一些差異,主要體現(xiàn)在匯編語(yǔ)法、調(diào)用約定、編譯工具和鏈接方式等方面,2.匯編代碼調(diào)用C代碼

與C語(yǔ)言調(diào)用匯編代碼類(lèi)似,在Windows平臺(tái)使用MinGW編譯器實(shí)現(xiàn)匯編代碼調(diào)用C語(yǔ)言函數(shù)進(jìn)行加法運(yùn)算。

3.調(diào)用約定(CallingConvention)

在C和匯編的混合編程中,不管是內(nèi)聯(lián)匯編還是外部調(diào)用,都需要解決幾個(gè)關(guān)鍵問(wèn)題:當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),如何將參數(shù)傳遞給函數(shù)?函數(shù)調(diào)用后,如何清理堆棧?函數(shù)返回時(shí),如何將返回值傳遞給調(diào)用者?為了確保函數(shù)調(diào)用過(guò)程中能夠正確地傳遞參數(shù)、處理返回值,此外,還需要注意棧的平衡,避免出現(xiàn)棧溢出等問(wèn)題,在C和匯編的混合編程時(shí),要遵循特定的調(diào)用約定。

調(diào)用約定規(guī)定了函數(shù)調(diào)用時(shí)參數(shù)傳遞方式、寄存器使用、返回值的處理和棧管理的規(guī)則。常見(jiàn)的調(diào)用約定有cdecl、stdcall和fastcall三種,cdecl是C語(yǔ)言默認(rèn)約定,由調(diào)用者清理?xiàng)?,效率比較低,但是支持可變參數(shù)函數(shù)(如printf),因?yàn)檎{(diào)用者可以根據(jù)實(shí)際參數(shù)數(shù)量清理堆棧;stdcall是WindowsAPI常用,由被調(diào)用者清理?xiàng)#瑴p輕調(diào)用者負(fù)擔(dān),效率較cdecl高,但是不支持可變參數(shù)函數(shù);fastcall性能最高,因?yàn)椴糠謪?shù)通過(guò)寄存器傳遞,減少了堆棧操作。

在x86架構(gòu)下,三種調(diào)用約定都使用EBP寄存器作為棧幀指針,用于訪問(wèn)參數(shù)和局部變量。32位系統(tǒng)的返回值存儲(chǔ)在EAX寄存器中,64位系統(tǒng)返回值存儲(chǔ)在RAX寄存器中。8.3JAVA程序調(diào)用匯編程序JAVA是典型的面向?qū)ο笳Z(yǔ)言,而且是跨平臺(tái)運(yùn)行的,“WriteOnce,RunEverywhere(一次編程,處處運(yùn)行)”是JAVA語(yǔ)言的目標(biāo)。就是說(shuō),JAVA程序可以在各種平臺(tái)上運(yùn)行,包括不同的操作系統(tǒng)、不同的CPU等等,都可以統(tǒng)一運(yùn)行。面向?qū)ο蠛涂缙脚_(tái),是匯編語(yǔ)言不具備的高級(jí)特性,是JAVA程序調(diào)用匯編代碼的巨大障礙。要讓JAVA程序調(diào)用本地的匯編代碼,必須通過(guò)JNI(JAVANativeInterface,JAVA本地接口)。JNI是JAVA為使用本地資源而提供的,使跨平臺(tái)的JAVA語(yǔ)言以規(guī)范的方式使用本地計(jì)算機(jī)系統(tǒng)中的軟硬件資源。因而通過(guò)JNI,就可以在JAVA程序中調(diào)用本地的匯編語(yǔ)言模塊。本小節(jié)以調(diào)用Windows的MessageBox顯示一個(gè)字符串為例,說(shuō)明JNI調(diào)用匯編語(yǔ)言的過(guò)程。一、JNI環(huán)境

事實(shí)上,JNI是一套標(biāo)準(zhǔn)化的接口,與語(yǔ)言無(wú)關(guān)。為了使跨平臺(tái)的JAVA和本地操作系統(tǒng)環(huán)境之間能夠相互溝通,JAVA使用一種稱為“JNIEnv”(JNIEnvironment,JNI環(huán)境)的機(jī)制,這是JAVA程序與本地代碼之間的基本通信方式,JAVA的數(shù)據(jù)格式和本地?cái)?shù)據(jù)格式之間就通過(guò)這一環(huán)境進(jìn)行轉(zhuǎn)換。二、后期聯(lián)編

在Windows下,JNI調(diào)用是通過(guò)dll實(shí)現(xiàn)的。就是說(shuō)被調(diào)用的代碼要編譯鏈接成不同于exe的另一種可執(zhí)行文件格式,并在運(yùn)行時(shí)被JAVA程序調(diào)用。和C語(yǔ)言調(diào)用匯編模塊的情形不同的是,C語(yǔ)言中的調(diào)用過(guò)程其實(shí)是在鏈接(link)過(guò)程中實(shí)現(xiàn)的,匯編程序以目標(biāo)模塊的形式在鏈接階段和C語(yǔ)言模塊合成一體。但JAVA是面向?qū)ο蟮恼Z(yǔ)言,調(diào)用在運(yùn)行時(shí)才會(huì)發(fā)生。在運(yùn)行開(kāi)始之后,才能聯(lián)編(Binding)到本地代碼,所以稱為后期聯(lián)編。對(duì)應(yīng)地,C語(yǔ)言中的那種鏈接在運(yùn)行之前發(fā)生,可以稱為“前期聯(lián)編”。匯編程序不是以待鏈接的目標(biāo)模塊的形式提供給JAVA程序調(diào)用,而是以鏈接之后生成的可執(zhí)行文件形式,以供JAVA程序在運(yùn)行過(guò)程中調(diào)用。只不過(guò)這種可執(zhí)行文件不是exe格式

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論