打印

C51和汇编混合编程的问题

[复制链接]
2144|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因为要考虑到效率和资源的合理用用。c51程序里面需要嵌入汇编.现在出现的问题是这样的:我在c头文件定义的几个预编译常数在汇编文件里面总是提示出错。如下:
在c头文件里面定义:
#define _HEX8BCD_       1
#define _BCD8HEX_       0

如果在汇编实现文件里面想根据前面c头文件定义的预编译常数来编译的话,
IF(_HEX8BCD_)
。。。。
ENDIF
就会提示出错等。

我想请教大家在C和51混合编程的时候,这种预编译常数如何在两种文件里面互相传递使用?

相关帖子

沙发
ayb_ice| | 2010-9-20 14:45 | 只看该作者
汇编要包含相关的头文件

使用特权

评论回复
板凳
juginhine|  楼主 | 2010-9-20 15:50 | 只看该作者
LS可否说明详细下?文件中需要的一般头文件我都有包含进去。

使用特权

评论回复
地板
ayb_ice| | 2010-9-20 16:09 | 只看该作者
xx

未命名1.JPG (84.31 KB )

未命名1.JPG

未命名2.JPG (80.9 KB )

未命名2.JPG

使用特权

评论回复
5
pidcy| | 2010-9-20 17:10 | 只看该作者
LS可否说明详细下?文件中需要的一般头文件我都有包含进去。

使用特权

评论回复
6
juginhine|  楼主 | 2010-9-21 11:07 | 只看该作者
我的头文件如下:
#ifndef _RADIXCONVERT_H_
#define _RADIXCONVERT_H_

#define _HEX8BCD_       1
#define _BCD8HEX_       0

#ifdef  _HEX8BCD_
    extern  uint16  HEX8BCD(uint8 iHex);
#endif
#ifdef  _BCD8HEX_
    extern  uint8   BCD8HEX(uint8 iBCD);
#endif

#endif

我的汇编主文件如下:
INCLUDE ".\Source\RadixConvert.h"

IF(_HEX8BCD_)
?PR?_HEX8BCD?RADIXCONVERT   SEGMENT CODE
PUBLIC  _HEX8BCD
RSEG    ?PR?_HEX8BCD?RADIXCONVERT
_HEX8BCD:
    MOV     A,  R7
    MOV     B,  #100
    DIV     AB
    MOV     R6, A
    MOV     A,  B
    MOV     B,  #10
    DIV     AB
    SWAP    A
    ORL     A,  B
    MOV     R7, A
    RET
ENDIF


可是报错了5个地方,第一个地方就是include地方,然后就是条件编译部分。
我想我的头文件是按照c语言格式写的。而我的主文件是按照汇编写的。是不是将c头文件include到汇编主文件是会报错呢?

使用特权

评论回复
7
冷漠| | 2010-9-21 12:31 | 只看该作者
重复定义!

#define _HEX8BCD_       1
#define _BCD8HEX_       0

IF(_HEX8BCD_)

?PR?_HEX8BCD?RADIXCONVERT   SEGMENT CODE
PUBLIC  _HEX8BCD
RSEG    ?PR?_HEX8BCD?RADIXCONVERT
_HEX8BCD:
    MOV     A,  R7
    MOV     B,  #100
    DIV     AB
    MOV     R6, A
    MOV     A,  B
    MOV     B,  #10
    DIV     AB
    SWAP    A
    ORL     A,  B
    MOV     R7, A
    RET
ENDIF
        END

使用特权

评论回复
8
冷漠| | 2010-9-21 12:43 | 只看该作者
本帖最后由 冷漠 于 2010-9-21 13:37 编辑

头文件RadixConvert.h 这么写:

#ifndef __RADIXCONVERT_H__
#define __RADIXCONVERT_H__

#define _HEX8BCD_       1
#define _BCD8HEX_       0
#endif

然后:
#include ".\Source\RadixConvert.h"

使用特权

评论回复
9
juginhine|  楼主 | 2010-9-21 17:03 | 只看该作者
重复定义是可以解决问题的。关键是如果我需要修改程序中需要使用的函数的时候,那样就必须修改两个地方了。我的意思是做一个头文件,只要在头文件里面修改一下就可以了。
至于LS提到的去掉函数的声明。因为我程序其他的地方需要使用这里写的函数,所以在其他地方我只需要将我的头文件包含进去就可以了。所以函数的声明我也放在头文件里面。
我的头文件只有两个作用,一个是定义预编译条件,还有一个就是函数声明,以便要用的地方可以直接使用。
可是就是这样导致C头文件和汇编主文件不能很好的配合。还是需要大家指教。谢谢!

使用特权

评论回复
10
冷漠| | 2010-9-21 17:35 | 只看该作者
本帖最后由 冷漠 于 2010-9-21 17:56 编辑

LZ在同一个模块里下面的写法行吗?矛盾呀:

#ifdef  _HEX8BCD_
    extern  uint16  HEX8BCD(uint8 iHex);
#endif


?PR?_HEX8BCD?RADIXCONVERT   SEGMENT CODE
PUBLIC  _HEX8BCD
RSEG    ?PR?_HEX8BCD?RADIXCONVERT
_HEX8BCD:
    MOV     A,  R7
……

除非有第三方函数
EXTRN    CODE ( HEX8BCD_1 )

  

使用特权

评论回复
11
juginhine|  楼主 | 2010-9-22 23:59 | 只看该作者
是的,我也知道将C头文件包含到汇编里面就是LS所说的问题。可是我又不想分开定义而要修改的时候两个地方修改。正因为找不到解决方法,所以才在这里请教大家了。

使用特权

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

本版积分规则

16

主题

180

帖子

0

粉丝