您的位置 首页 制造

如安在c51程序中调用汇编函数

如何在c51程序中调用汇编函数-一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。

有关c51调用汇编的办法现已有许多帖子讲到,可是一般只讲关键,很少有对整个进程作详细描绘,关于初学者是不行的,这儿笔者经过一个简略比如对这个进程进行描绘,期望能对初学者有所协助。几年来,在这个论坛里笔者得到许多热心人辅导,因而也期望藉此尽一点绵薄之力。

在这个比如里,论述了编写c51程序调用汇编函数的一种办法,这个外部函数的进口参数是一个字符型变量和一个位变量,返回值是

一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译发生asm文件,进一步修正这个asm文件就得到咱们所要的汇编函数。该办法让编译器主动完结各种段的组织,提高了汇编程序的编写功率。

step1. 按写一般c51程序办法,树立工程,在里边导入main.c文件和CFUNC.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);

}

//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”,使查看框由灰色变成黑色(有用)状况;

step3. 依据挑选的编译形式,把相应的库文件(如 Small 形式时,是 Keil\C51\Lib\C51S.Lib)参加工程中,该文件有必要作为工程的终究文件;

step4. build这个工程后将会发生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也能够经过编译选项直接发生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”是否有用,若是有用则点击使查看框变成无效状况;再次build这个工程,到此你现已得到汇编函数的主体,修正函数里边的汇编代码就得到你所需的汇编函数了。


 

keil中汇编函数调用c51函数 [ycong_kuang]

在keil的写法可参阅89852帖子,详细如下:

与89852帖子比较,第一步在工程里多了一个被汇编调用的c51的函数文件(c51func.c),至于汇编函数仍是先用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写的汇编函数,终究要变成汇编代码

{

uchar tmp_vchr;

uint tp_vint;

tmp_vchr=v_achr;

tp_vint=(uint)v_bflag;

return CFUNC(tp_vint); //这儿调用一个c51函数

}

//c51FUNC.c

#define uchar unsigned char

#define uint unsigned int

uint CFUNC(uint v_int) //被汇编函数调用c51函数

{

return v_int《《2;

}

第二步是按89852帖子的step2,3,4把用c51写的(汇编)函数变成a51文件(今日我试了一下step3能够不要)例程编译成果如下:

; 。\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所写的函数发生的汇编代码从这儿开端

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内容便是tp_vint

; return CFUNC(tp_vint);

; SOURCE LINE # 16

LCALL _CFUNC ;这儿调用了用c51写的函数

; }

; SOURCE LINE # 17

?C0001:

RET

; END OF _AFUNC

END

这个文件便是你的汇编函数地点文件,把函数里边的汇编代码修正成你所需的汇编函数就ok了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/346998.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部