历史上的今天
返回首页

历史上的今天

今天是:2025年04月16日(星期三)

正在发生

2021年04月16日 | c51程序调用汇编函数的一种方法

2021-04-16 来源:eefocus

简介:在这个例子里,阐述了编写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 模式时,是 KeilC51LibC51S.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这个工程,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了。


参考文献:

1.徐爱钧,彭秀华。单片机高级语言C51windows环境编程与应用,电子工业出版社

2.www.c51bbs.com, C51编程:关于在KEILC51 中直接嵌入汇编。。。帖子编号: 83838 发表用户:Youth

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

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


建议参考 徐爱钧,彭秀华所写的《单片机高级语言C51windows环境编程与应用》或马忠梅所写的

《单片机的c语言应用程序设计》有关混合语言编程有关章节


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

关于在 KEIL C51 中直接嵌入汇编。。。 [Youth]

有时在C51程序中需要嵌入一些汇编代码,这时当然可以用通常的作法:

按照 C51 与汇编的接口写一个汇编函数,然后在 C51 程序中调用该函数。


下面介绍直接嵌入汇编代码的方法:


1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:

#pragma ASM

; Assembler Code Here

#pragma ENDASM


2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”

和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;


3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib)加入工程中, 该文件必须作为工程的最

后文件;


4、编译,即可生成目标代码


推荐阅读

史海拾趣

Bel Fuse公司的发展小趣事

进入XXXX年代,电子行业经历了深刻的变革,新兴技术的涌现给传统企业带来了挑战。Bel Fuse也面临着市场需求的变化和竞争压力的增加。为了应对这些变革,公司进行了战略调整,将重点放在了连接器、电源、磁性元件和电路保护产品等领域。通过加大研发力度和市场推广,Bel Fuse成功实现了产品升级和市场拓展。

昆泰芯微电子(CONNTEK)公司的发展小趣事

为了加快产品国产化进程,昆泰芯微电子与世强先进(深圳)科技股份有限公司签订了授权代理合作协议。通过这一战略合作,昆泰芯微电子成功将旗下高端传感器产品触达至终端市场,实现了市场的快速扩张。同时,这一合作也进一步提升了昆泰芯微电子在行业中的知名度和影响力。

AINFO Inc公司的发展小趣事

随着技术的不断进步,AINFO Inc公司不断推出创新产品,满足市场的多样化需求。公司注重产品的质量和性能,通过优化设计和生产工艺,提高了产品的竞争力。同时,公司积极开拓国内外市场,与多家知名企业建立了合作关系,实现了产品的广泛应用。

Cygnal Integrated Products Inc公司的发展小趣事

随着市场的不断变化和技术的不断进步,Cygnal意识到需要持续创新以保持竞争力。因此,公司投入大量资源进行研发,成功开发出了基于32位架构的新型微控制器。这款微控制器不仅性能强大,而且功耗极低,非常适合用于便携式设备和物联网应用。这一技术突破使Cygnal在行业中获得了领先地位。

BENCENT公司的发展小趣事

随着国内市场的饱和,BENCENT公司开始将目光投向海外市场。公司制定了详细的国际化战略,包括在海外市场设立分支机构、拓展销售渠道、加强与当地企业的合作等。通过一系列的努力,公司成功打入多个海外市场,实现了业务的多元化和国际化。

ADLINK公司的发展小趣事

BENCENT公司在成立之初,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。创始人带领团队夜以继日地研发,通过不断尝试和改进,终于成功开发出了一款具有竞争力的电子产品。这款产品凭借其高性能和创新性,在市场上获得了初步认可,为公司的后续发展奠定了基础。

问答坊 | AI 解惑

开关电源设计知识介绍(中文)[分享]

开关电源设计 1 电子产品,特别是军用稳压电源的设计是一个系统工程,不但要考虑电源本身参数设 计,还要考虑电气设计、电磁兼容设计、热设计、安全性设计、三防设计等方面。因为任何 方面那怕是最微小的疏忽,都可能导致整个电源的崩溃,所 ...…

查看全部问答>

集成电路导论(1)

集成电路导论[1].part1…

查看全部问答>

破解密码

谁能介绍一种破解无线路由器密码的软件啊 还有它的使用方法 我搞了好久都没弄明白 …

查看全部问答>

求助:关于OPA842替代原件的问题

最近再做一个宽带放大器,其中有一个运放选用的是opa842,但在市场上找不到现货。请高手们指教一下有没有其替代原件?谢!…

查看全部问答>

windows7,VC2005编译的张帆《驱动程序开发详解》的例子不能安装

编译能够成功,我把HelloWDM.inf拷到HelloWDM.sys目录下,使用EzDriverInstaller安装的时候最后总是无法成功,提示: the driver was enable successfully。 用Windows硬件管理器来手动安装。也一样的无法成功安装? 请问是和缘故? 谢谢…

查看全部问答>

波特率如何提高

我用LPC2214中集成的串口芯片UART0进行通讯,却发现终端只能处理到9600偶校验,再提高波特率数据收发就不正常了,哪位大侠帮忙指点下…

查看全部问答>

嵌入式指纹识别系统

有人做过嵌入式指纹识别吗?可否把相关资料发到我的邮箱collegeml@gmail.com 网上找了半天,没有头绪,在此先谢过了。…

查看全部问答>

温馨提示:McuIsp软件更新

今天本人观察源代码时,发现McuIsp StmIsp存在一个问题:如果你的代码长度刚好为64的整数倍加1,则最后一个字节不会下载。McuIspV0.975已经改正该问题,请及时下载。STM32手持下载机不存在该Bug。…

查看全部问答>

什么是DC/DC模块,DC/AC模块?

什么是DC/DC模块,DC/AC模块? 没有概念 就是电源模块吗?…

查看全部问答>

求介绍DSP具体型号

求介绍DSP具体型号   我的需求如下: 1.主频50M+; 2.ADC通道数8+,精度8-12位(最好可调,像MSP430),内阻希望尽量高点,因为我是要用分压法测电阻的,被测电阻阻值为100M--10K;   速度希望能有4Msps+; 3.I/O口数量50+个; 4.通 ...…

查看全部问答>