C51和汇编混合编程的问题

[复制链接]
2888|10
 楼主| juginhine 发表于 2010-9-20 14:24 | 显示全部楼层 |阅读模式
因为要考虑到效率和资源的合理用用。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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
pidcy 发表于 2010-9-20 17:10 | 显示全部楼层
LS可否说明详细下?文件中需要的一般头文件我都有包含进去。
 楼主| 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到汇编主文件是会报错呢?
冷漠 发表于 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
冷漠 发表于 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"
 楼主| juginhine 发表于 2010-9-21 17:03 | 显示全部楼层
重复定义是可以解决问题的。关键是如果我需要修改程序中需要使用的函数的时候,那样就必须修改两个地方了。我的意思是做一个头文件,只要在头文件里面修改一下就可以了。
至于LS提到的去掉函数的声明。因为我程序其他的地方需要使用这里写的函数,所以在其他地方我只需要将我的头文件包含进去就可以了。所以函数的声明我也放在头文件里面。
我的头文件只有两个作用,一个是定义预编译条件,还有一个就是函数声明,以便要用的地方可以直接使用。
可是就是这样导致C头文件和汇编主文件不能很好的配合。还是需要大家指教。谢谢!
冷漠 发表于 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 )

  
 楼主| juginhine 发表于 2010-9-22 23:59 | 显示全部楼层
是的,我也知道将C头文件包含到汇编里面就是LS所说的问题。可是我又不想分开定义而要修改的时候两个地方修改。正因为找不到解决方法,所以才在这里请教大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

180

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部