汇编中的变量在C中当指针用报错

[复制链接]
1867|20
 楼主| huzhiyang 发表于 2015-10-15 11:20 | 显示全部楼层 |阅读模式
现在我的项目是汇编和C要相互调用,举个例子吧
在汇编中定义:                 var DATA 10H
同时在汇编中声明         EXTERN DATA var
然后在c中这么声明:            extern unsigned char data *var
就这么声明,链接的时候就报错了:
***ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
ayb_ice 发表于 2015-10-15 11:23 | 显示全部楼层
汇编中要公有声明
public var

 楼主| huzhiyang 发表于 2015-10-15 12:31 | 显示全部楼层
ayb_ice 发表于 2015-10-15 11:23
汇编中要公有声明
public var

汇编中有PUBLIC  var的
ayb_ice 发表于 2015-10-15 13:32 | 显示全部楼层
huzhiyang 发表于 2015-10-15 12:31
汇编中有PUBLIC  var的

有了就不能要
EXTERN DATA var
 楼主| huzhiyang 发表于 2015-10-16 11:00 | 显示全部楼层
本帖最后由 huzhiyang 于 2015-10-16 11:16 编辑

重新看了下工程,可能是我没说说的有误吧,实际是这样的
比如这个变量是在a.asm中定义的:
PUBLIC  var
var  DATA  10H
然后再b.asm中用EXTRN DATA var申明,
还在c.c文件中这么声明extern unsigned char  data *var;在链接的时候a.asm也报错了,说EXTERN ATTRIBUT DO DOT MATCH PUBLIC
然后在链接的时候就出现了错误,我实在是不知道有什么问题。
 楼主| huzhiyang 发表于 2015-10-16 11:01 | 显示全部楼层
ayb_ice 发表于 2015-10-15 13:32
有了就不能要
EXTERN DATA var

重新仔细看了下,EXTERN DATA var是在另一个文件中声明的
ayb_ice 发表于 2015-10-16 11:35 | 显示全部楼层
huzhiyang 发表于 2015-10-16 11:01
重新仔细看了下,EXTERN DATA var是在另一个文件中声明的

那能有什么问题呢
我试了一下都是OK的

本帖子中包含更多资源

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

×
ayb_ice 发表于 2015-10-16 11:36 | 显示全部楼层
附件工程

本帖子中包含更多资源

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

×
 楼主| huzhiyang 发表于 2015-10-16 12:24 | 显示全部楼层
我也不知道是什么原因,我看着也都没问题的,唉
 楼主| huzhiyang 发表于 2015-10-16 14:22 | 显示全部楼层

我也是这么做的,也是一样的错误

本帖子中包含更多资源

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

×
ayb_ice 发表于 2015-10-16 14:29 | 显示全部楼层
huzhiyang 发表于 2015-10-16 14:22
我也是这么做的,也是一样的错误

马上帮你搞定
ayb_ice 发表于 2015-10-16 14:47 | 显示全部楼层
huzhiyang 发表于 2015-10-16 14:22
我也是这么做的,也是一样的错误

因为var在data空间,且只有一个字节长,所以不能作为通用指针,只能指向data,idata,pdata空间,
所以只能声明为类似以下的一种
extern unsigned char idata* data var;

extern unsigned char pdata* data var;

本帖子中包含更多资源

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

×
 楼主| huzhiyang 发表于 2015-10-16 15:00 | 显示全部楼层
ayb_ice 发表于 2015-10-16 14:47
因为var在data空间,且只有一个字节长,所以不能作为通用指针,只能指向data,idata,pdata空间,
所以只能 ...

1.为什么在data空间,只有一个字节长,就不能作为通用指针呢?
2.我看你的声明:
  extern unsigned char idata* data var;
  怎么是idata * data var
  而不是extern unsigned char idata *var
ayb_ice 发表于 2015-10-16 15:09 | 显示全部楼层
huzhiyang 发表于 2015-10-16 15:00
1.为什么在data空间,只有一个字节长,就不能作为通用指针呢?
2.我看你的声明:
  extern unsigned char ...

extern unsigned char idata *var
这样声明也应该可以,指向idata空间的指针只需要一个字节

extern unsigned char*var
这是通用指针,指针本身需要3个字节,所以这样是不行的,编译过不了
 楼主| huzhiyang 发表于 2015-10-16 15:21 | 显示全部楼层
我还有一个问题,我拿到的项目中有个文件没有,只提供了.obj的文件,还是举例吧:
提供了如下文件:a.obj, a.inc,
                        b.asm
a.inc中有声明:extrn code (fun)
然后在b.asm中包含了此头文件$INCLUDE (A.INC)
链接的时候b文件出现了两种警告:
1.WARNING L1: UNRESOLVED EXTERNAL SYMBOL
2.REFERENCE MADE TO UNRESOLVED EXTERNAL
 楼主| huzhiyang 发表于 2015-10-16 15:25 | 显示全部楼层
ayb_ice 发表于 2015-10-16 15:09
extern unsigned char idata *var
这样声明也应该可以,指向idata空间的指针只需要一个字节

但是我用extern unsigned char idata *var 这样去链接的时候还是报同样的错误
必须要用extern unsigned char idata * data var才可以,我理解是强制转换。
在8位机里面,unsigned char *var怎么会是三个字节呢?
ayb_ice 发表于 2015-10-16 15:30 | 显示全部楼层
huzhiyang 发表于 2015-10-16 15:25
但是我用extern unsigned char idata *var 这样去链接的时候还是报同样的错误
必须要用extern unsigned c ...

通用指针可以指向任意空间,如果指向CODE,XDATA空间,地址都是16位的,另还需要个字节指示是哪个空间,所以需要3个字节
ayb_ice 发表于 2015-10-16 15:31 | 显示全部楼层
huzhiyang 发表于 2015-10-16 15:21
我还有一个问题,我拿到的项目中有个文件没有,只提供了.obj的文件,还是举例吧:
提供了如下文件:a.obj,  ...

关键是fun这个东西定义了没有

然后就是正确声明
 楼主| huzhiyang 发表于 2015-10-16 15:44 | 显示全部楼层
ayb_ice 发表于 2015-10-16 15:31
关键是fun这个东西定义了没有

然后就是正确声明

这个东西看不到,我拿到的项目别人不是在keil里面编译的,是自己写了一个.bat的文件,然后在里面去调用C51和A51的编译器完成了整个项目的编译
ayb_ice 发表于 2015-10-16 15:50 | 显示全部楼层
huzhiyang 发表于 2015-10-16 15:44
这个东西看不到,我拿到的项目别人不是在keil里面编译的,是自己写了一个.bat的文件,然后在里面去调用C5 ...

那个提示信息就是说没有定义或者声明错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

190

帖子

2

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