[讨论] 【转】如何用keil在C中嵌入汇编

open82977352   2009-7-9 09:39 楼主


有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编 比较常用的keil中嵌入汇编的方法如下所示: 如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。 1.gif 在有加入汇编的文件中,还要设置编译该文件时的选项 2.gif Generate Assembler SRC File 生成汇编SRC文件  Assemble SRC File 封装汇编文件  (如图三的状态为选中)   选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。 3.gif 为了能对汇编进行封装还要在项目中加入相应的封装库文件, 在笔者的项目中编译模式是小模式所以选用C51S.LIB。这也是最常用的。这些库文件是中KEIL安装目录下的LIB目录中。 加好后就可以顺利编译了。(注:我只在7.0以上版本使用过) 4.gif 5.gif 6.gif 汇编与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等寄存器进行保护的)。

 

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑
我追求崇本务实,我追求完美第一!我选择低调做人,我选择高调做事!

回复评论 (10)



我试了怎么不行啊

 

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑
你们这帮人,勤奋约等于零,智慧等于零,加在一起恒等于零
点赞  2009-7-9 15:56

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



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

 

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑
我可以做的更好
点赞  2009-7-17 20:50


学习一下!

 

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑
点赞  2009-8-5 02:45


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

 

本帖最后由 paulhyde 于 2014-9-15 03:44 编辑
点赞  2009-8-6 16:58

真是好人 认真负责

真是好人 认真负责
我可以做的更好
点赞  2009-8-8 16:14
学习啦,这个今后可能用得着!
点赞  2009-8-9 14:48

回复 楼主 open82977352 的帖子

我还正愁着这不到解决的办法呢,谢谢楼主了啊,先试下,呵呵。
点赞  2009-8-10 19:45
学习了
点赞  2011-7-28 10:28
经验之谈,非常感谢!
希望在论坛中答疑解惑、得到启示,找到互惠的朋友。
点赞  2011-11-7 09:25
在汇编程序中怎么引用与C程序共享的变量呀,能不能指教一下?多谢!
希望在论坛中答疑解惑、得到启示,找到互惠的朋友。
点赞  2011-11-7 10:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复