談?wù)刅isual C++ 和匯編語言混合編程上的優(yōu)化


 1   Visual C++ 調(diào)用匯編語言的常用方法混合編程的關(guān)鍵是解決好高級語言與匯編語言的接口問題, 可采用兩種方法: 一是使用嵌入式匯編, 即在高級語言的語句中直接使用匯編語句, 這種方法比較簡潔直觀,但功能較弱; 另一種方法是獨立編程,分別產(chǎn)生各自的目標文件,然后經(jīng)過連接, 形成一個完整的程序。采用這種方法比較靈活而且還具有很強的功能, 其關(guān)鍵是如何解決好匯編語言與高級語言的數(shù)據(jù)通訊。本文就以在凌陽 16 位單片機SPCE061A [ 2],采用Visual C++ 與匯編語言獨立編程的方式實現(xiàn)混合編程的具體方法并給出實例。

1. 1   VC++ 中嵌入?yún)R編語句的方法

嵌入式匯編又稱行內(nèi)匯編, Visual C++ 提供了嵌入式匯編功能, 允許在VC++ 源程序中直接插入?yún)R編語言指令的語句, 可以直接訪問VC++ 語言程序中定義的常量、 變量和函數(shù),而不用考慮二者之間的接口,從而避免了匯編語言和VC++ 語言之間復(fù)雜的接口問題, 提高了程序設(shè)計效率。

嵌入?yún)R編語言指令采用- - asm 關(guān)鍵字, 嵌入?yún)R編格式: - - asm{指令} , 采用花括號的匯編語言程序段形式。具體應(yīng)用通常采用兩種方式, 第一種方式: - - 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++ 編譯環(huán)境中VC++ 語言程序含有嵌入式匯編語言語句時, 編譯器首先將VC++ 代碼的源程序( . cpp)編譯成匯編語言源程序( . asm)。然后激活匯編程序, Turbo Assembler 將產(chǎn)生的匯編語言源文件編譯成目標文件( . obj) , 最后激活Tlink 將目標文件鏈接成可執(zhí)行文件( . exe)Visual C++ 直接支持嵌入?yún)R編方式, 不需要獨立的匯編系統(tǒng)和另外的連接步驟。所以Visual C++ 中嵌入?yún)R編比Tur -bo C 中嵌入?yún)R編進行編譯連接更為簡單方便。

以下是在VC++ 中調(diào)用匯編程序的實例:

P P Visual C++ 語言主函數(shù)main ( )

void F- Sub ( void) ; P P 聲明要調(diào)用的函數(shù)的函數(shù)原型,此函數(shù)無參數(shù)傳遞

intmain ( void) {

    while ( 1)

      F- Sub ( ) ; P P 調(diào)用匯編函數(shù)

return 0;

}

P P 匯編子函數(shù)F- Sub( )

. CODE

. PUBL IC- F- Sub

- F- Sub:

NOP

RETF

以上程序在凌陽公司提供的集成開發(fā)環(huán)境下編譯連接后即可運行。

1. 2   采用模塊調(diào)用的方法

采用模塊調(diào)用方式, 要協(xié)調(diào)命名、 調(diào)用、 參數(shù)傳遞和返回等進行約定。

( 1) 采用一致的調(diào)用協(xié)議

Visual C++ 語言具有三種調(diào)用協(xié)議: - cdecl,- stdcall- fastcal lMASM 匯編語言利用/ 語言類型0確定調(diào)用協(xié)議和命名約定, 支持的語言類型有:C, SYSCALL, STDCALL,PASCAL, BASIC FOR TRAN。Visual C++ 與匯編語言混合編程通常利用堆棧進行參數(shù)傳遞,調(diào)用協(xié)議決定利用堆棧的方法和命名約定, 兩者要一致, 通常Visual C++ 采用- cdecl調(diào)用協(xié)議, MASN 匯編語言采用Visual C++ 語言調(diào)用協(xié)議。

( 2) 入口參數(shù)和返回參數(shù)的約定

不論何種整數(shù)類型進行參數(shù)傳遞時都擴展成32,Visual C++ 中沒有遠、 近調(diào)用之分, 所有調(diào)用都是 32 位的偏移地址, 所有的地址參數(shù)也都是32位偏移地址, 在堆棧中占4 個字節(jié)。圖1 給出了采用Visual C++ 語言調(diào)用協(xié)議的堆棧示意圖。參數(shù)返回時,對于小于等于32 位的數(shù)據(jù)擴展為32 ,存放在EAX 寄存器中返回; 4- 8 個字節(jié)的返回值存放在EDX, EAX 寄存器中返回;更大字節(jié)數(shù)據(jù)則將它們的地址指針存放在EAX 中返回。

( 3) 聲明公用函數(shù)名和變量名

Visual C++ 和匯編語言使用的公用函數(shù)和變量應(yīng)該進行聲明, 并且標識符應(yīng)該一致, C++ 語言對標識符區(qū)分字母的大小寫,而匯編不區(qū)分大小寫。在Visual C++ 語言程序中, 采用extern / C0{ }對所調(diào)用的函數(shù)和變量給予說明。說明形式如下:對函數(shù)的說明: extern / C0 { 返回值類型 調(diào)用協(xié)議 函數(shù)名稱(參數(shù)類型表) ; }對變量的說明: extern / C0 { 變量類型變量名; }匯編語言程序中供外部使用的標識符應(yīng)該標識P UBLIC 屬性,使用外部標識符應(yīng)該用 e xtern 說明。

1. 3   模塊調(diào)用混合編程的實現(xiàn)步驟

采用模塊調(diào)用方式進行混合編程一般執(zhí)行的步驟如下: ( 1)建立Visual C++ 源程序( . cpp) ; ( 2)建立匯編語言源程序, 并把匯編語言匯編成. obj 文件;( 3)建立工程文件. prj, Visual C++ 源程序和. obj文件放入該工程項目; ( 4) 對工程文件進行編譯、 連接, 生成可執(zhí)行文件. exe

在與Visual C++ 混合編程的匯編語言過程中,編程環(huán)境是32位的,應(yīng)該注意與16 MS -DOS 環(huán)境的區(qū)別。在這種環(huán)境下的寄存器是32位的, (下轉(zhuǎn)第160)(上接第 124 )因此匯編語言過程存取堆棧應(yīng)該使用32 位寄存器EBP 進行相對尋址, 而不是采用 BP。匯編語言簡化段定義的格式應(yīng)該采用flat 模式, 并且匯編時采用選項P coff, ML命令的選項P coff 使得產(chǎn)生的. obj 文件采用32位的格式。

2   Visual C++ 中調(diào)用匯編語言的

第三種方法

通常以上兩種方法就能夠?qū)崿F(xiàn) Visual C++ 語言與匯編語言混合編程, 但是在一些特殊的情況下,用這兩種方法卻不能滿足功能的需要, 本文提出了一種新的方法) ) ) 通過數(shù)組借助指針實現(xiàn)二者的混合編程。下面結(jié)合所開發(fā)的課題) ) ) 數(shù)控系統(tǒng)邏輯控制系統(tǒng)軟件開發(fā), 來進行具體說明[ 3 ]

該課題是在Visual C++ 6. 0 的環(huán)境下進行開發(fā)的,上層采用VC++ 語言, 最底層采用了匯編語言,VC++ 語言中要調(diào)用匯編語言的編譯結(jié)果, 并進行回填,用通用的混合編程方法無法實現(xiàn)二者的調(diào)用,因為底層匯編語言是把所有的邏輯運算功能指令匯編在一起, 而在VC++ 語言中根據(jù)需要在需要的地方調(diào)用匯編語言中的某一功能模塊, 因此對匯編語言編譯后的. obj 文件無法進行控制。具體實現(xiàn)方法如下:

( 1)把包括所有的邏輯指令的匯編語句編成一個匯編模塊程序,在匯編編譯器(masm 6. x)中將匯編程序編譯成. obj文件。

(2) 將匯編生成的機代碼放在一個數(shù)組中, 例如定義一個數(shù)組變量unsigned char OBJMOD[ 1241]。

( 3)定義多個指針類型變量指向OBJMOD 數(shù)組元素的地址,該地址對應(yīng)每個匯編功能模塊的首地址,如定義一個指針變量 unsigned char * LIBC21=&OBJMOD[ 869]。

( 4) 經(jīng)過函數(shù)COPILE( * pModal) 模塊, 例如編譯匯編 LIBC21 功能模塊時, 經(jīng)過調(diào)用 COPI LE( LIBC21)函數(shù),把匯編編譯生成的機代碼分別傳遞到作業(yè)區(qū)域WKAREA ,經(jīng)過 WKAREA[ POSIRR]= BUFRIS[ PTRIS] 來完成二次填充,把匯編機代碼中改寫的內(nèi)容改寫成需求的地址或值,最后經(jīng)過調(diào)用一系列函數(shù), 把成果保存到文件中[ 4 ]。

3   寄存器的使用約定

在所有寄存器中, BP 應(yīng)首先引起注意,因為一旦進入?yún)R編程序, BP 的內(nèi)容在子程序入口處被壓入棧內(nèi),并且棧指針( SP)的當前值必須放在BP ,在子程序出口處BP 被彈出,恢復(fù)原來的值。

4   結(jié)束語

采用兩種或兩種以上的編程語言混合編程, 彼此相互調(diào)用,進行參數(shù)傳遞, 是一種有效的程序設(shè)計方法。這種方法可以充分發(fā)揮各種語言的優(yōu)勢,充分利用現(xiàn)有的實用程序,是當前編程技術(shù)的一個重要研究和應(yīng)用領(lǐng)域。

本課題采用該方法實現(xiàn)了Visual C++ 和匯編語言的混合編程,從而實現(xiàn)Visual C++ 語言與匯編語言的無縫結(jié)合。

本文由 伯特利數(shù)控文章 整理發(fā)表,文章來自網(wǎng)絡(luò)僅參考學(xué)習(xí),本站不承擔任何法律責(zé)任。

http://www.bethel-cnc.com/bethel/news/

標簽: 編程  加工中心  
上一篇學(xué)生在數(shù)控車實際操作教學(xué)的四個要點
下一篇如何將數(shù)控系統(tǒng)技術(shù)搭配在單片機上

編程  加工中心  相關(guān)內(nèi)容

——

11

2024-12

U600S五軸加工中心視頻

此視頻詳細介紹了U600S高性能五軸加工中心各種參數(shù)及說明!… [了解更多]

05

2024-11

六角亭五軸加工工藝

本文以組合式六角亭模型為實例,分析工藝難點與加工可行性,指出該模型的加工難點是模型形狀不規(guī)則和整體剛性差,并通過設(shè)計新的工藝方案解決加工難點,完成了模型整體的加工。新的加工工藝有助于提高加工效率和精度,為五軸數(shù)控加工提供了一個典型案例,對于五軸加工中心數(shù)控加工也具有指導(dǎo)作用和重要… [了解更多]

05

2024-11

自適應(yīng)控制方法在混聯(lián)五軸加工中心中的應(yīng)用

宇匠數(shù)控 備注:為保證文章的完整度,本文核心內(nèi)容由PDF格式顯示,如未有顯示請刷新或轉(zhuǎn)換瀏覽器嘗試,手機瀏覽可能無法正常使用!本文摘要:通過對混聯(lián)五軸加工中心自適應(yīng)深度學(xué)習(xí)控制方法的 研 究,可 知 此 方 法 的 創(chuàng) 新 之 處 在 于:1)建 立 了 機 床 的 運 動 學(xué) … [了解更多]

05

2024-11

五軸加工中心和五軸鉆攻中心在機測量探頭補

在機測量技術(shù)由于其成本低、檢測效率高、無需二次裝夾等優(yōu)勢被廣泛用于零件加工測量當中,使得五軸加工中心和五軸鉆攻中心,同時又兼具測量功能。在機測量系統(tǒng)的構(gòu)成如圖1所示,硬件部分主要是由高精度探頭、信號接收器、機床整個本體,軟件部分由機床控制系統(tǒng)、測量軟件等組成[8]。待零件加工完成… [了解更多]

05

2024-11

五軸加工中心進給系統(tǒng)動態(tài)誤差影響因素

?加工精度是影響機床性能和產(chǎn)品質(zhì)量的主要難題,也是制約國家精密制造能力的重要因素。本文以五軸加工中心為對象,針對提升機床精度進行了研究。并且隨著科技的發(fā)展,精密的儀器和零件在生產(chǎn)實踐中占據(jù)的分量逐漸增加,在數(shù)控機床這種精密機器精度不斷提高的同時,必須控制內(nèi)外界環(huán)境的隨機影響因素在… [了解更多]


產(chǎn)品中心

——