日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]有關(guān)c51調(diào)用匯編的方法已經(jīng)有很多帖子講到,但是一般只講要點,很少有對整個過程作詳細(xì)描述,對于初學(xué)者是不夠的,這里筆者通過一個簡單例子對這個過程進(jìn)行描述,希望能對初學(xué)者有所幫助。幾年來,在這個論壇里筆者得

有關(guān)c51調(diào)用匯編的方法已經(jīng)有很多帖子講到,但是一般只講要點,很少有對整個過程作詳細(xì)描述,對于初學(xué)者是不夠的,這里筆者通過一個簡單例子對這個過程進(jìn)行描述,希望能對初學(xué)者有所幫助。幾年來,在這個論壇里筆者得到很多熱心人指導(dǎo),因此也希望藉此盡一點綿薄之力。

在這個例子里,闡述了編寫c51程序調(diào)用匯編函數(shù)的一種方法,這個外部函數(shù)的入口參數(shù)是一個字符型變量和一個位變量,返回值是

一個整型變量。例中,先用c51寫出這個函數(shù)的主體,然后用SRC控制指令編譯產(chǎn)生asm文件,進(jìn)一步修改這個asm文件就得到我們所要的匯編函數(shù)。該方法讓編譯器自動完成各種段的安排,提高了匯編程序的編寫效率。

step1. 按寫普通c51程序方法,建立工程,在里面導(dǎo)入main.c文件和CFUNC.c文件。

相關(guān)文件如下:

//main.c文件

#include < reg51.h >

#define uchar unsigned char

#define uint unsigned int

extern uint AFUNC(uchar v_achr,bit v_bflag);

void main()

{

bit BFLAG;

uchar mav_chr;

uint mvintrslt;

mav_chr=0xd4; BFLAG=1;

mvintrslt=AFUNC(mav_chr,BFLAG);

}

//CFUNC.c文件

#define uchar unsigned char

#define uint unsigned int

uint AFUNC(uchar v_achr,bit v_bflag)

{

uchar tmp_vchr;

uint tp_vint;

tmp_vchr=v_achr;

tp_vint=(uint)v_bflag;

return tmp_vchr+(tp_vint<<8);

}

step2. 在 Project 窗口中包含匯編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC

File”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態(tài);

step3. 根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如 Small 模式時,是 KeilC51LibC51S.Lib)加入工程中,該文件必須作為工程的最后文件;

step4. build這個工程后將會產(chǎn)生一個CFUNC.SRC的文件,將這個文件改名為CFUNC.A51(也可以通過編譯選項直接產(chǎn)生CFUNC.A51文

件),然后在工程里去掉庫文件(如C51S.Lib)和CFUNC.c,而將CFUNC.A51添加到工程里。

//CFUNC.SRC文件如下

.CFUNC.SRC generated from: CFUNC.c

NAME CFUNC

?PR?_AFUNC?CFUNC SEGMENT CODE

?BI?_AFUNC?CFUNC SEGMENT BIT OVERLAYABLE

PUBLIC ?_AFUNC?BIT

PUBLIC _AFUNC

RSEG ?BI?_AFUNC?CFUNC

?_AFUNC?BIT:

v_bflag?041: DBIT 1

; #define uchar unsigned char

; #define uint unsigned int

;

; uint AFUNC(uchar v_achr,bit v_bflag)

RSEG ?PR?_AFUNC?CFUNC

_AFUNC:

USING 0

; SOURCE LINE # 5

;---- Variable 'v_achr?040' assigned to Register 'R7' ----

; {

; SOURCE LINE # 6

; uchar tmp_vchr;

; uint tp_vint;

;

; tmp_vchr=v_achr;

; SOURCE LINE # 10

;---- Variable 'tmp_vchr?042' assigned to Register 'R5' ----

MOV R5,AR7

; tp_vint=(uint)v_bflag;

; SOURCE LINE # 11

MOV C,v_bflag?041

CLR A

RLC A

;---- Variable 'tp_vint?043' assigned to Register 'R6/R7' ----

; return tmp_vchr+(tp_vint<<8);

; SOURCE LINE # 12

MOV R6,A

MOV R4,#00H

CLR A

ADD A,R5

MOV R7,A

MOV A,R4

ADDC A,R6

MOV R6,A

; }

; SOURCE LINE # 13

?C0001:

RET

; END OF _AFUNC

END

step5. 檢查main.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效則點擊使檢查框變成無效狀態(tài);再次build這個工程,到此你已經(jīng)得到匯編函數(shù)的主體,修改函數(shù)里面的匯編代碼就得到你所需的匯編函數(shù)了。

參考文獻(xiàn):

1.徐愛鈞,彭秀華。單片機(jī)高級語言C51windows環(huán)境編程與應(yīng)用,電子工業(yè)出版社

2.www.c51bbs.com, C51編程:關(guān)于在 KEIL C51 中直接嵌入?yún)R編。。。帖子編號: 83838 發(fā)表用戶:Youth

.................................................................................................................

keil中匯編函數(shù)調(diào)用c51函數(shù) [ycong_kuang]

在keil的寫法可參考89852帖子,具體如下:

與89852帖子相比,第一步在工程里多了一個被匯編調(diào)用的c51的函數(shù)文件(c51func.c),至于匯編函數(shù)還是先用c51編寫出主體(a51func.c),這樣匯編程序接口和段都交給編譯器處理,你只管在編譯成匯編代碼后按你的要求改寫匯編代碼就行了。

例程如下:

//main.c

#include < reg51.h >

#define uchar unsigned char

#define uint unsigned int

extern uint AFUNC(uchar v_achr,bit v_bflag);

void main()

{

bit BFLAG;

uchar mav_chr;

uint mvintrslt;

mav_chr=0xd4; BFLAG=1;

mvintrslt=AFUNC(mav_chr,BFLAG);

}

//a51FUNC.c

#define uchar unsigned char

#define uint unsigned int

extern uint CFUNC(uint);

uint AFUNC(uchar v_achr,bit v_bflag) //c51寫的匯編函數(shù),最終要變成匯編代碼

{

uchar tmp_vchr;

uint tp_vint;

tmp_vchr=v_achr;

tp_vint=(uint)v_bflag;

return CFUNC(tp_vint); //這里調(diào)用一個c51函數(shù)

}

//c51FUNC.c

#define uchar unsigned char

#define uint unsigned int

uint CFUNC(uint v_int) //被匯編函數(shù)調(diào)用c51函數(shù)

{

return v_int<<2;

}

第二步是按89852帖子的step2,3,4把用c51寫的(匯編)函數(shù)變成a51文件(今天我試了一下step3可以不要)例程編譯結(jié)果如下:

; .a51func.SRC generated from: a51func.c

NAME A51FUNC

?PR?_AFUNC?A51FUNC SEGMENT CODE

?DT?_AFUNC?A51FUNC SEGMENT DATA OVERLAYABLE

?BI?_AFUNC?A51FUNC SEGMENT BIT OVERLAYABLE

EXTRN CODE (_CFUNC)

PUBLIC ?_AFUNC?BIT

PUBLIC _AFUNC

RSEG ?DT?_AFUNC?A51FUNC

?_AFUNC?BYTE:

tmp_vchr?042: DS 1

RSEG ?BI?_AFUNC?A51FUNC

?_AFUNC?BIT:

v_bflag?041: DBIT 1

; //a51FUNC.c

;

; #define uchar unsigned char

; #define uint unsigned int

;

; extern uint CFUNC(uint);

;

; uint AFUNC(uchar v_achr,bit v_bflag)

RSEG ?PR?_AFUNC?A51FUNC

_AFUNC: ;c51所寫的函數(shù)產(chǎn)生的匯編代碼從這里開始

USING 0

; SOURCE LINE # 8

;---- Variable 'v_achr?040' assigned to Register 'R7' ----

; {

; SOURCE LINE # 9

; uchar tmp_vchr;

; uint tp_vint;

;

; tmp_vchr=v_achr;

; SOURCE LINE # 13

MOV tmp_vchr?042,R7

; tp_vint=(uint)v_bflag;

; SOURCE LINE # 14

MOV C,v_bflag?041

CLR A

MOV R6,A

RLC A

MOV R7,A

;---- Variable 'tp_vint?043' assigned to Register 'R6/R7' ----

; 這里說明R6,R7內(nèi)容就是tp_vint

; return CFUNC(tp_vint);

; SOURCE LINE # 16

LCALL _CFUNC ;這里調(diào)用了用c51寫的函數(shù)

; }

; SOURCE LINE # 17

?C0001:

RET

; END OF _AFUNC

END

這個文件就是你的匯編函數(shù)所在文件,把函數(shù)里面的匯編代碼修改成你所需的匯編函數(shù)就ok了。

建議參考 徐愛鈞,彭秀華所寫的《單片機(jī)高級語言C51windows環(huán)境編程與應(yīng)用》或馬忠梅所寫的

《單片機(jī)的c語言應(yīng)用程序設(shè)計》有關(guān)混合語言編程有關(guān)章節(jié)

..................

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉