程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 匯編語言與C語言的接口技術

匯編語言與C語言的接口技術

編輯:匯編語言

  匯編語言沒有高級語言要占用較大的存儲空間和較長的運行時間等缺點,它的運行速度快是高級語言所不能比擬的。可以說高級語言與匯編語言各有千秋。有時我們采用高級語言編程速度達不到要求,全部采用匯編語言編程工作量又大,此時可以采用"混合"編程,彼此相互調用,進行參數傳遞,共享數據結構及數據信息,是一種有效的編程方法。這種方法可以發揮各種語言的優勢和特點,充分利用現有的多種實用程序、庫程序等使軟件的開發周期大大縮短。
1 高級語言與匯編語言的接口需要解決的問題
  1、需要說明和建立調用者與被調用者間的關系被調用的過程或函數應預先說明為外部類型,如匯編子程序,應用PUBLIC說明其可被外部模塊引用;調用程序則應預先說明要引用的外部模塊名。
2、參數傳遞問題在匯編子程序之間通常采用寄存器作為參數傳遞的工具,匯編語言與高級語言程序間的參數傳遞,一般采用堆棧來傳遞,即調用程序將參數依次壓入堆棧中,當被轉調用程序後,再從堆棧中依次彈出參數作為操作數使用。為此,必須了解各種語言的堆棧結構、生成方式和入棧方式等。BASIC、FORTRAN、PASCAL等語言其參數進棧順序是與參數在參數表中出現的順序相同,即從右到左;而C語言則相反。
2 C語言與匯編語言的接口
2.1 C語言調用匯編子程序
●在C程序中使用關鍵字"ExTERn"對函數作顯式說明。
●參數傳遞順序是按其在參數表中出現的順序的反序被壓入堆棧中,即第一個參數最後進入堆棧,它在棧中的地址最低。
●對不同的存儲模式(極小、小、緊湊、中、大和巨)要選用不同的匯編語言格式,如C程序為小模式,匯編用近過程,C程序為大模式,匯編用遠過程。
●匯編程序取C的參數。遠過程返回地址占四個字節,BP壓入占二字節,所以第一個參數在BP+6所指向的單元。對於近過程第一個參數在BP+4所指向的單元。
●匯編程序中寄存器的保護。TuRboC允許子過程使用SI和DI存放局部變量,當寄存器變量多於二個時,多余部分會自動轉到堆棧中存儲。因此,匯編過程的格式為:
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI
……….
語 句
………….
POP SI
POP DI
POP BP
RET
●返回值。每種C數據類型都有一個標准的返回位置,一般在AX中(極小、小、中模式),DX:AX(緊湊、大、巨模式),如:chaR,unSignEdchaR,Enum,ShoRTinT等,返回值位置為AX,且返回數據必須放置在RET指令之前。匯編子程序要定義為遠過程,並用PUBLIC偽指令把過程名定義為公共。例
:#includE″STdio.h″
#includE″STdlib.h″
chaRMESSagE[]=″MESSagE″;
inTfaRREVSTR(chaRfaR STR);
Voidmain(Void)
{ REVSTR((chaRfaR )MESSagE);
printf(″%S″,MESSagE);
}
REVSTR.asm

PUBLIC-REVSTR-
  REVSTR PROC
PUSH BP
MOVBP,SP
PUSH DS
PUSH SI
PUSH DI

POP SI
POP AX
MOV DS,AX
POP BP
MOV AX,CX
RET
REVSTR ENDP
END
2.2 C語言嵌入匯編
在C程序中允許直接編寫匯編語言代碼,這稱作嵌入匯編。C程序中嵌入匯編後可以無分號(C語言的語句以分號結束,匯編語句是C語言中唯一以換行結束的語句),以關鍵詞ASM張一個嵌入匯編指令,如需多個ASM語句,可以將它們放在花括號內。如,
ASMMOVAX,DX/ 注釋 /
ASM
PUSHAX}/ 注釋 /
C語言允許嵌入四類匯編命令:一般指令、串指令、跳轉指令、數據分配和定義指令,嵌入匯編比調用匯編子程序更方便、靈活、功能也更強。但嵌入匯編不是一個完整的匯編程序,所以許多錯誤不能馬上檢查出來。
3 結 束 語
采用兩種或兩種以上的編程語言組合編程,彼此相互調用,進行參數傳遞,是一種有效的程序設計方法。這種方法可以充分發揮各種語言的優勢,充分利用現有的實用程序,是當前程序接口技術的一個重要研究和應用領域。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved