有关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了。