淺淡匯編語言在Visual C++ 中常用編程方法及設計優化
0 引言在平常編寫程序時, 一般都希望選擇VC++ 、Visual Basic 等這樣的可視化高級語言來編寫, 這些語言工具可以實現可視化編程和支持面向對象的編程技術,同時它們的語法更接近于自然語言, 表達能力強, 使用靈活,具有強大的庫函數, 更重要的是與機器無關, 可移植性好, 這樣程序開發周期比較短,省時省力。但在某些部分,例如程序的關鍵部分、 運行次數很多的部分、 運行速度要求很高的部分或直接訪問硬件的部分等利用匯編語言編寫, 可以提高程序的運行效率和速度, 但如果只用匯編語言編程的話是比較繁瑣的, 對于一個比較大的程序來說編寫起來將非常耗時, 開發周期較長。為了滿足既能縮短程序開發周期, 又能保證程序的執行效率兩方面的要求, 采用VC++ 語言和匯編語言混合編程的技術,即程序的框架或主體部分用Visual C++ 語言編寫,而要求執行效率高的部分用匯編語言編寫。加工中心請選擇 海天精工1 Visual C++ 調用匯編語言的常用方法混合編程的關鍵是解決好高級語言與匯編語言的接口問題, 可采用兩種方法: 一是使用嵌入式匯編, 即在高級語言的語句中直接使用匯編語句, 這種方法比較簡潔直觀,但功能較弱; 另一種方法是獨立編程,分別產生各自的目標文件,然后經過連接, 形成一個完整的程序。采用這種方法比較靈活而且還具有很強的功能, 其關鍵是如何解決好匯編語言與高級語言的數據通訊。本文就以在凌陽 16 位單片機SPCE061A 中,采用Visual C++ 與匯編語言獨立編程的方式實現混合編程的具體方法并給出實例。鉆攻中心請選擇 海天精工1. 1 VC++ 中嵌入匯編語句的方法嵌入式匯編又稱行內匯編, Visual C++ 提供了嵌入式匯編功能, 允許在VC++ 源程序中直接插入匯編語言指令的語句, 可以直接訪問VC++ 語言程序中定義的常量、 變量和函數,而不用考慮二者之間的接口,從而避免了匯編語言和VC++ 語言之間復雜的接口問題, 提高了程序設計效率。嵌入匯編語言指令采用- - asm 關鍵字, 嵌入匯編格式: - - asm{指令} , 采用花括號的匯編語言程序段形式。具體應用通常采用兩種方式, 第一種方式: - - asm{匯編程序段} ,如下所示: - - asm{ mov ea x, 5h mov ec x, 7h add eax, ecx}另一種方式:每一條匯編語句前添加/ - - asm0標記,格式: - - asm 匯編語句,如下所示:- - asm mov ea x, 5h- - asm mov ec x, 7h- - asm add eax, ec x在Visual C++ 編譯環境中VC++ 語言程序含有嵌入式匯編語言語句時, 編譯器首先將VC++ 代碼的源程序( . cpp)編譯成匯編語言源程序( . asm)。然后激活匯編程序, Turbo Assembler 將產生的匯編語言源文件編譯成目標文件( . obj) , 最后激活Tlink 將目標文件鏈接成可執行文件( . exe)。Visual C++ 直接支持嵌入匯編方式, 不需要獨立的匯編系統和另外的連接步驟。所以Visual C++ 中嵌入匯編比Tur -bo C 中嵌入匯編進行編譯連接更為簡單方便。以下是在VC++ 中調用匯編程序的實例:// Visual C++ 語言主函數main ( )void F- Sub ( void) ; // 聲明要調用的函數的函數原型,此函數無參數傳遞intmain ( void) { while ( 1) F- Sub ( ) ; // 調用匯編函數return 0;}// 匯編子函數F- Sub( ). CODE. PUBL IC- F- Sub- F- Sub:NOPRETF以上程序在凌陽公司提供的集成開發環境下編譯連接后即可運行。1. 2 采用模塊調用的方法采用模塊調用方式, 要協調命名、 調用、 參數傳遞和返回等進行約定。( 1) 采用一致的調用協議Visual C++ 語言具有三種調用協議: - cdecl,- stdcall和- fastcal l。MASM 匯編語言利用/ 語言類型0確定調用協議和命名約定, 支持的語言類型有:C, SYSCALL, STDCALL,PASCAL, BASIC 和FOR TRAN。Visual C++ 與匯編語言混合編程通常利用堆棧進行參數傳遞,調用協議決定利用堆棧的方法和命名約定, 兩者要一致, 通常Visual C++ 采用- cdecl調用協議, MASN 匯編語言采用Visual C++ 語言調用協議。( 2) 入口參數和返回參數的約定不論何種整數類型進行參數傳遞時都擴展成32位,Visual C++ 中沒有遠、 近調用之分, 所有調用都是 32 位的偏移地址, 所有的地址參數也都是32位偏移地址, 在堆棧中占4 個字節。圖1 給出了采用Visual C++ 語言調用協議的堆棧示意圖。參數返回時,對于小于等于32 位的數據擴展為32 位,存放在EAX 寄存器中返回; 4- 8 個字節的返回值存放在EDX, EAX 寄存器中返回;更大字節數據則將它們的地址指針存放在EAX 中返回。( 3) 聲明公用函數名和變量名對Visual C++ 和匯編語言使用的公用函數和變量應該進行聲明, 并且標識符應該一致, C++ 語言對標識符區分字母的大小寫,而匯編不區分大小寫。在Visual C++ 語言程序中, 采用extern / C0{ }對所調用的函數和變量給予說明。說明形式如下:對函數的說明: extern / C0 { 返回值類型 調用協議 函數名稱(參數類型表) ; }對變量的說明: extern / C0 { 變量類型變量名; }匯編語言程序中供外部使用的標識符應該標識P UBLIC 屬性,使用外部標識符應該用 e xtern 說明。CNC加工中心 請選擇 海天精工1. 3 模塊調用混合編程的實現步驟采用模塊調用方式進行混合編程一般執行的步驟如下: ( 1)建立Visual C++ 源程序( . cpp) ; ( 2)建立匯編語言源程序, 并把匯編語言匯編成. obj 文件;( 3)建立工程文件. prj, 將Visual C++ 源程序和. obj文件放入該工程項目; ( 4) 對工程文件進行編譯、 連接, 生成可執行文件. exe。在與Visual C++ 混合編程的匯編語言過程中,編程環境是32位的,應該注意與16 位MS -DOS 環境的區別。在這種環境下的寄存器是32位的,因此匯編語言過程存取堆棧應該使用32 位寄存器EBP 進行相對尋址, 而不是采用 BP。匯編語言簡化段定義的格式應該采用flat 模式, 并且匯編時采用選項P coff, ML命令的選項P coff 使得產生的. obj 文件采用32位的格式。2 在 Visual C++ 中調用匯編語言的第三種方法通常以上兩種方法就能夠實現 Visual C++ 語言與匯編語言混合編程, 但是在一些特殊的情況下,用這兩種方法卻不能滿足功能的需要, 本文提出了一種新的方法) ) ) 通過數組借助指針實現二者的混合編程。下面結合所開發的課題) ) ) 精工系統邏輯控制系統軟件開發, 來進行具體說明。該課題是在Visual C++ 6. 0 的環境下進行開發的,上層采用VC++ 語言, 最底層采用了匯編語言,在VC++ 語言中要調用匯編語言的編譯結果, 并進行回填,用通用的混合編程方法無法實現二者的調用,因為底層匯編語言是把所有的邏輯運算功能指令匯編在一起, 而在VC++ 語言中根據需要在需要的地方調用匯編語言中的某一功能模塊, 因此對匯編語言編譯后的. obj 文件無法進行控制。具體實現方法如下:( 1)把包括所有的邏輯指令的匯編語句編成一個匯編模塊程序,在匯編編譯器(如masm 6. x)中將匯編程序編譯成. obj文件。(2) 將匯編生成的機代碼放在一個數組中, 例如定義一個數組變量unsigned char OBJMOD[ 1241]。( 3)定義多個指針類型變量指向OBJMOD 數組元素的地址,該地址對應每個匯編功能模塊的首地址,如定義一個指針變量 unsigned char * LIBC21=&OBJMOD[ 869]。( 4) 通過函數COPILE( * pModal) 模塊, 例如編譯匯編 LIBC21 功能模塊時, 通過調用 COPI LE( LIBC21)函數,把匯編編譯生成的機代碼分別傳遞到工作區域WKAREA 中, 通過 WKAREA[ POSIRR]= BUFRIS[ PTRIS] 來實現二次填充,把匯編機代碼中改寫的內容改寫成需要的地址或值,最后通過調用一系列函數, 把結果保存到文件中[ 4 ]。高速加工中心 請選擇 海天精工3 寄存器的使用約定在所有寄存器中, BP 應首先引起注意,因為一旦進入匯編程序, BP 的內容在子程序入口處被壓入棧內,并且棧指針( SP)的當前值必須放在BP 中,在子程序出口處BP 被彈出,恢復原來的值。4 結束語采用兩種或兩種以上的編程語言混合編程, 彼此相互調用,進行參數傳遞, 是一種有效的程序設計方法。這種方法可以充分發揮各種語言的優勢,充分利用現有的實用程序,是當前編程技術的一個重要研究和應用領域。本課題采用該方法實現了Visual C++ 和匯編語言的混合編程,從而實現Visual C++ 語言與匯編語言的無縫結合。本文由海天精工整理發表,文章來自網絡僅參考學習,本站不承擔任何法律責任。http://www.dyliao.com/加工中心 高速加工中心 鉆攻中心 CNC加工中心 請選擇 海天精工
- 相關文章
- 發表留言
-
◎歡迎參與討論,請在這里發表您的看法、交流您的觀點。
主站蜘蛛池模板:
延吉市|
万山特区|
佛冈县|
卢氏县|
滦平县|
彩票|
彭山县|
兰坪|
上高县|
清河县|
唐海县|
独山县|
会理县|
肃宁县|
积石山|
昭苏县|
珲春市|
义马市|
新蔡县|
乌恰县|
烟台市|
枞阳县|
五华县|
于田县|
杭锦后旗|
扶绥县|
德江县|
于田县|
安平县|
凉城县|
岫岩|
宝清县|
象山县|
柏乡县|
宣汉县|
香港
|
山阴县|
三明市|
南陵县|
南丰县|
五家渠市|