10353|10

2787

帖子

23

TA的资源

至上芯片

楼主
 

【转】如何用keil在C中嵌入汇编 [复制链接]

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑

有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编 比较常用的keil中嵌入汇编的方法如下所示: 如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。 在有加入汇编的文件中,还要设置编译该文件时的选项 Generate Assembler SRC File 生成汇编SRC文件  Assemble SRC File 封装汇编文件  (如图三的状态为选中)   选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。 为了能对汇编进行封装还要在项目中加入相应的封装库文件, 在笔者的项目中编译模式是小模式所以选用C51S.LIB。这也是最常用的。这些库文件是中KEIL安装目录下的LIB目录中。 加好后就可以顺利编译了。(注:我只在7.0以上版本使用过) 汇编与C语言混合编程的关键问题 1 C程序变量与汇编程序变量的共用 为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量: .ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff 在汇编程序中引用而在C程序可直接定义的变量: unsigned char to_dte_buff[BUFF_SIZE]; //DSP发向PC机的数据 int to_dte_num; //缓冲区中存放的有效字节数 int to_dte_store; //缓冲区的存放指针 int to_dte_read; //缓冲区的读取指针 这样经过链接就可以完成对应。 2 程序入口问题 在C程序中,程序的入口是main()函数。而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为 main _start。这样,混合汇编出来的程序得不到正确结果。因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。这些工作包括初始化变量、设置栈指针等,相当于系统壳不能跨越。这时可在*.cmd文件中去掉语句:-e main_start。如仍想执行某些汇编程序,可以C函数的形式执行,如: main_start(); //其中含有其他汇编程序 但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即.ref _main_start。 3 移位问题 在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。解决的办法是在C程序中,把移位结果再用0X00FF去“与”一下即可。 4 堆栈问题 在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。而C编译器无法检查程序运行时堆栈能否溢出。 5 程序跑飞问题 编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件与memory map图对比,看是否超出范围。如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。如果在中断程序中调用了C程序,则要查汇编后的C程序中是否用到了没有被保护的寄存器并提供保护(在C程序的编译中是不对A、B等寄存器进行保护的)。

 

此帖出自电子竞赛论坛

最新回复

在汇编程序中怎么引用与C程序共享的变量呀,能不能指教一下?多谢!  详情 回复 发表于 2011-11-7 10:20
点赞 关注
个人签名我追求崇本务实,我追求完美第一!我选择低调做人,我选择高调做事!
 
 

回复
举报

28

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
本帖最后由 paulhyde 于 2014-9-15 03:44 编辑

我试了怎么不行啊

 

此帖出自电子竞赛论坛
个人签名你们这帮人,勤奋约等于零,智慧等于零,加在一起恒等于零
 
 
 

回复

375

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

顶!!!!!!!!!!!!!!!!!!!!

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑

顶!!!!!!!!!!!!!!!!!!!!

 

此帖出自电子竞赛论坛
个人签名我可以做的更好
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
本帖最后由 paulhyde 于 2014-9-15 03:44 编辑

学习一下!

 

此帖出自电子竞赛论坛
 
 
 

回复

2955

帖子

0

TA的资源

纯净的硅(初级)

5
 
本帖最后由 paulhyde 于 2014-9-15 03:44 编辑

我的提示错误: main.src(333): error A9: SYNTAX ERROR 是怎么回事啊?

 

此帖出自电子竞赛论坛
 
 
 

回复

375

帖子

0

TA的资源

五彩晶圆(高级)

6
 

真是好人 认真负责

真是好人 认真负责
此帖出自电子竞赛论坛
个人签名我可以做的更好
 
 
 

回复

324

帖子

0

TA的资源

五彩晶圆(高级)

7
 
学习啦,这个今后可能用得着!
此帖出自电子竞赛论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 楼主 open82977352 的帖子

我还正愁着这不到解决的办法呢,谢谢楼主了啊,先试下,呵呵。
此帖出自电子竞赛论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习了
此帖出自电子竞赛论坛
 
 
 

回复

153

帖子

0

TA的资源

一粒金砂(高级)

10
 
经验之谈,非常感谢!
此帖出自电子竞赛论坛
个人签名希望在论坛中答疑解惑、得到启示,找到互惠的朋友。
 
 
 

回复

153

帖子

0

TA的资源

一粒金砂(高级)

11
 
在汇编程序中怎么引用与C程序共享的变量呀,能不能指教一下?多谢!
此帖出自电子竞赛论坛
个人签名希望在论坛中答疑解惑、得到启示,找到互惠的朋友。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表