打印

请问C如何实现INC DPRT

[复制链接]
3417|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dudongdao|  楼主 | 2010-12-25 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠你们好~   请问如何让C语言生成 INC DPRT 这条汇编指令呢?

我再C中要嵌入汇编,用编译器在C中嵌入汇编,限制条件很多~
如果能一句C对应一句汇编就不用考虑这些了~~   

下面是我用C写的串口发送时的奇偶校验

    ACC = m_st_UartTx.u8pBuf[m_st_UartTx.u8ReadPos];//读取一个数据
    if(m_bOddEven == 0)//判断是校验还是偶校验
    {
     P = ~P;
    }
    TB8 = P;//装入校验值
    SBUF = ACC; //发送

这样省去了C中用命令嵌入汇编的麻烦。

请问各位大侠  C中生成 INC DPRT  这句怎么表达~ 才能让KEIL C 生成

相关帖子

沙发
dudongdao|  楼主 | 2010-12-25 19:42 | 只看该作者
顶~

使用特权

评论回复
板凳
airwill| | 2010-12-25 20:01 | 只看该作者
使用数据指针时, 是有机会生成 INC DPTR 的指令的。
但是,直接生成这条指令的 C 写法,我也没有找到。

使用特权

评论回复
地板
xwj| | 2010-12-25 20:07 | 只看该作者
只用C语句的话基本上没机会直接编译出 INC DPTR ,如果很计较速度,只能嵌入汇编

使用特权

评论回复
5
dudongdao|  楼主 | 2010-12-27 14:16 | 只看该作者
如果一句C对应一句汇编,那就不用嵌入汇编了~  因为嵌入汇编还是有些麻烦的,比如被嵌入汇编的那个文件不能是被别人包含的等等,还有汇编中用到C中变量,与C的接口等~~     不是任何地方加一句ASM()就可以嵌入汇编了~~      对KEIL的C嵌入汇编没有用太熟悉~

使用特权

评论回复
6
mohanwei| | 2010-12-27 14:27 | 只看该作者
非常简单,单独建一个C文件,用C编好一个函数,实现功能。
然后用#pragma SRC命令得到汇编代码,优化后加到工程里,并移除对应的C文件即可。
这样的优点是不用你关心接口

使用特权

评论回复
7
dudongdao|  楼主 | 2010-12-27 14:39 | 只看该作者
mohanwei能说的具体些吗~~
我明白你的意思是,把要实现的功能单独写一个C文件~  然后如何得到汇编代码?
“#pragma SRC命令得到汇编代码” 这句具体如何操作~~
谢谢~~

使用特权

评论回复
8
ayb_ice| | 2010-12-27 15:17 | 只看该作者
本帖最后由 ayb_ice 于 2010-12-27 16:39 编辑

sfr16 DP = 0x82;

DP++;

不过DPTR是寄存器,完全由编译器来维护使用,这样的操作其实是不正规的...

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dudongdao + 1
9
dudongdao|  楼主 | 2010-12-27 16:04 | 只看该作者
多谢ayb_ice~~
我也是选择性的使用,保证没有问题的前提下使用~~   
谢谢~~

使用特权

评论回复
10
dudongdao|  楼主 | 2010-12-27 16:11 | 只看该作者
sfr16 DP = 0x82;


翻译成了这样
0032 0582              INC     DPL
0034 E582              MOV     A,DPL
0036 7002              JNZ     ?C0166
0038 0583              INC     DPH

使用特权

评论回复
11
coody| | 2010-12-27 20:43 | 只看该作者
除非插入汇编,否则不要用汇编的思想使用C...

使用特权

评论回复
12
古道热肠| | 2010-12-27 23:26 | 只看该作者
呵呵,楼上网友的这句"不要用汇编的思想指导C的编程"很在理呀。汇编呢,研究透了后也要把必不可少的功能打成库函数,让C语言上层主调函数不必关心它的实现。

使用特权

评论回复
13
古道热肠| | 2010-12-27 23:27 | 只看该作者
其实用汇编写的硬件底层驱动函数,相当省内存。

使用特权

评论回复
14
dudongdao|  楼主 | 2010-12-29 13:36 | 只看该作者
古道热肠大侠~~   嵌入汇编要单独独立出啦一个文件是这样吗?
还有汇编中调用C函数的变量等~ 有些麻烦~ 我去搞些资料看看,谢谢~

使用特权

评论回复
15
dudongdao|  楼主 | 2010-12-30 09:00 | 只看该作者
淘到了一个C与汇编接口的办法~  可以实现汇编中调用C变量等功能。

step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
       分别导入两个文件,不要在mian.c中包含另一个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 SRCFile”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

step3. 根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件;

step4. build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。

step5. 检查main.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效则点击使检查框变成无效状态;再次build这个工程,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

413

帖子

1

粉丝