㈠ 匯編和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 結 束 語
採用兩種或兩種以上的編程語言組合編程,彼此相互調用,進行參數傳遞,是一種有效的程序設計方法。這種方法可以充分發揮各種語言的優勢,充分利用現有的實用程序,是當前程序介面技術的一個重要研究和應用領域
㈡ 單片機。分別使用c語言和匯編語言編寫一個程序
#include<reg52.h>
unsignedcharaa_at_0x30;
voidmain()
{
IE=0x81;
IT0=1;
aa=0;
while(1);
}
X0_INT()interrupt0
{
aa++;
aa%=100;
}
//====================
ORG0000H
LJMPSTART
INC30H
MOVA,#100
CJNEA,30H,EXIT
MOV30H,#0
EXIT:
RETI
START:
MOVIE,#81H
SETBIT0
MOV30H,#0
SJMP$
END
上面兩個程序,均經過試驗,可以滿足題目要求。
㈢ 我主程序是用匯編語言編寫的,現在我要調用一段用C語言編寫的子程序我該怎麼調用用什麼語句
你可以把C語言編寫的子程序放在一個lib庫中,然後include進匯編源文件中,加以調用
㈣ 51單片機編程時匯編和C語言如何結合
在keil工程欄中右鍵.c文件選擇OptionsforFile
然後把這2個勾上
㈤ 在kei里,用C語言編寫了主程序,怎麼調用用匯編編寫的延時子程序
對於問題我想說以下幾點:
1.Proteus模擬時需要載入的是經過匯編(由匯編語言編寫的源程序文件時)或編譯與匯編(由C或其他高級語言編寫的源程序文件要先編譯成匯編語言,再匯編成hex、bin文件)的hex文件(稱為目標文件)。
2.Proteus與C語言沒有必然關系,要的只是hex文件,可以經過編譯生成hex文件的語言一大堆。
3.學好Proteus沒有成就感,Proteus只適合一些小的設計,上不了正堂,而且Proteus模擬過的,實物不一定行的通,Proteus只適合理論上的初步驗證,當然學了還是多多益善。
4.匯編語言比C語言等在生成hex文件時形成指令的效率更高,比如,匯編語言幾乎每一句都有用,都會生成有效的二進制指令(除偽指令外),而C語言在生成二進制指令時有好多多餘的語句(比如函數調用時的不必要的入堆棧保護)。
5.匯編簡練,不易移植,不適合大一點的工程;C的編譯效率低,但是可移植性好,總之各有優勢,你現在看的應該是一些學習性的單片機程序,當然是小程序,經常遇到匯編就正常。
6.建議既要會C也要會匯編,這樣在以後用C等編寫的大工程中調試程序時,也可以知道某條語句其實現的原理,以便更好發現問題,解決問題。
㈥ 求一個在C語言裡面嵌套匯編語言的程序!(懸賞分可以再加,只有給得好)
建議你先了解__asm{ }的作用,
__asm
{
MOV eax 0x12345678
MOV ecx eax
}
注意VC編譯器要打補丁(SP6),不然編譯器會死。我這是在機房,剛要運行就死了。所以不好意思沒有檢查是否有誤。匯編就是對三個對象做操作寄存器(Register),內存(Memory),立即數(immediate),希望對你有幫助
㈦ c語言中調用匯編程序問題
C語言裡面的語句found(i,&j,&k,s);
翻譯為匯編語言是下面這樣的:
PUSH
[I]
PUSH
J
PUSH
K
PUSH
[S]
CALL
_found
現在看_FOUND的入口代碼:
PUSH
BP
MOV
BP,SP
你現在明白[BP]是什麼了嗎?是原來的BP
[BP+2]是CALL處的IP
[BP+4]是什麼知道嗎?就是實際參數S的值
現在明白了吧。
㈧ c語言中如何調用匯編程序
匯編語言的基本格式為: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SPMOV CX,[BP+4]DEC CXMOV SI,[BP+10]LODSWMOV DX,1 MOV BX,0 COMP: CMP AX,[SI]JA BIGGERMOV AX,[SI]MOV BX,DXBIGGER: INC SIINC SIINC DXLOOP COMPMOV DI,[BP+6] MOV [DI],AX MOV DI,[BP+8] MOV [DI],BXPOP BPRET_FOUND ENDP_TEXT ENDSEND為了看得更清楚,我們把代碼去掉,留下基本框架: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SP ......... ;從這里開始加入匯編代碼 POP BPRET_FOUND ENDP_TEXT ENDSEND這是在samll(小模式)下的匯編語言介面框架,在加入代碼處,寫上你所要完成一定功能的匯編代碼,就成為一個可供TC調用的匯編模塊。 可以看出,代碼段是以帶下劃線的標識符開頭的。 代碼段的標識為_TEXT,由C程序中調用的函數found在這里也是以下劃線標出:_FOUND。 下面是代碼段的組成: _TEXT SEGMENT BYTE PUBLIC 'CODE' _TEXT ENDS下面是函數的組成: _FOUND PROC NEAR _FOUND ENDP 在small(小模式下,只要按照以上的格式書寫匯編代碼,就一定能成功地被C程序調用。 這個格式是TC編譯程序所定好了的,如果不按照這個格式書寫匯編代碼,調用就不會成功。
㈨ 在匯編程序中怎麼調用C語言子程序
匯編程序調用C程序。
匯編程序的設置要遵循ATPCS規則,保證程序調用時參數的正確傳遞。匯編程序調用C程序的方法如下:
在匯編程序中使用IMPORT偽指令聲明將要調用的C程序函數;
在調用C程序時,要正確設置入口參數,然後使用BL指令調用
㈩ C語言中如何調用匯編子程序給個例子講解下
你是指內聯匯編吧?比如下面這個例子:
#include<stdio.h>
intfunc(inta,intb)
{
returna-b;
}
intmain()
{
//計算12-5
inta=12,b=5;//給定兩個數
intres;//用來記錄結果
__asm{//內聯匯編
pushb;//b壓棧
pusha;//a壓棧,注意C中函數接受參數的時候入棧是反著的
callfunc;//調用函數func,返回值保存在eax里
movres,eax;//將eax里的值賦給res
}
printf("%d ",res);//輸出結果,得到7
return0;
}