c中如何嵌入汇编

c中如何嵌入汇编

ID:35787634

大小:12.90 KB

页数:4页

时间:2019-04-18

c中如何嵌入汇编_第1页
c中如何嵌入汇编_第2页
c中如何嵌入汇编_第3页
c中如何嵌入汇编_第4页
资源描述:

《c中如何嵌入汇编》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C中如何嵌入汇编由于C语言在定时方面的缺陷,在某些场合下,C程序中需要嵌入汇编代码,以弥补C的缺陷。通常,在C语言程序中嵌入汇编的方法,无外乎两种在C程序中填入#asm和#endasm的编译命令,在之中填入汇编代码编写汇编函数,通过链接定位器和特殊的编译方式链接方式加入到所有程序的目标代码中但这两种方法都存在实现困难的问题,对刚起步经验不足的程序员来说,基本上很难弄懂和编译成功。而我想到的办法是:将汇编代码定义成一数组,然后使C程序以代码方式运行数组。其实,这就是我们所知的蠕虫病毒的原理。具体方法是这样的

2、,要知道,汇编代码其实也是一常数,8位CPU中,一句代码是用8位二进制表示,16位CPU中,一句代码是用16位二进制表示,所以,以51单片机(8位)为例,其一系列的汇编程序代码,在C程序中就是一个unsignedchar类型的数组。那么,我们可以把想嵌入的汇编代码在C程序中定义成一个数组:unsignedcharcodehuibian[n]={,,};然后的问题就是如何启动它了。我们知道,C语言中,无返回类型函数指针的定义为void(*name_of_function)();另外C语言中强制类型转换为(t

3、ype)variable;所以,基于上面两个语句,我们就可以把huibian这个数组指针(数组名就是一指针)转化为函数指针(void(*)())huibian;那么,既然都是函数指针了,直接运行就行了(*(void(*)())huibian)();这样就大功告成了。再有,这方法的缺点就是,一开始得先把汇编代码译制成数组,这工作代码短还凑活,长了就不好办了,可以的话,编一个译码的工具程序。//#ifdefASMunsignedlongshiftR1(registerunsignedlong);

4、#elseexternunsignedlongshiftR1(registerunsignedlong);#endif//endofasm.h//#defineASM#include#include#pragmaOT(4,speed)unsignedlongshiftR1(registerunsignedlongx){#pragmaasmclrcmova,r4rrcamovr4,amova,r5rrcamovr5,amova,r6rrcamovr6,amova

5、,r7rrcamovr7,a#pragmaendasmreturn(x);}//endofasm.c将此源文件加入要编译的工程文件,将光标指向此文件,选择右键菜单“optionforfile'asm.c'”,将属性单“properties”中的“GenerateAssemblerSRCFile”“AssembleSRCFile”两项设置成黑体的“√”将“LinkPublicOnly”的“√”去掉,再编译即可。用此方法可以在c源代码的任意位置用#pragmaasm和#pragmaendasm嵌入汇编语句。但

6、要注意的是在直接使用形参时要小心,在不同的优化级别下产生的汇编代码有所不同,可以察看对应的.lst文件看一看,得到正确的优化级别后,#pragmaOT(x,speed)锁定优化级别(这里的值是0-9)。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。