打印

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

[复制链接]
1286|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

使用特权

评论回复
5
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
然后在链接的时候就出现了错误,我实在是不知道有什么问题。

使用特权

评论回复
6
huzhiyang|  楼主 | 2015-10-16 11:01 | 只看该作者
ayb_ice 发表于 2015-10-15 13:32
有了就不能要
EXTERN DATA var

重新仔细看了下,EXTERN DATA var是在另一个文件中声明的

使用特权

评论回复
7
ayb_ice| | 2015-10-16 11:35 | 只看该作者
huzhiyang 发表于 2015-10-16 11:01
重新仔细看了下,EXTERN DATA var是在另一个文件中声明的

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

未命名2.JPG (87.77 KB )

未命名2.JPG

未命名.jpg (56.07 KB )

未命名.jpg

使用特权

评论回复
8
ayb_ice| | 2015-10-16 11:36 | 只看该作者
附件工程

新建文件夹.rar

20.04 KB

使用特权

评论回复
9
huzhiyang|  楼主 | 2015-10-16 12:24 | 只看该作者
我也不知道是什么原因,我看着也都没问题的,唉

使用特权

评论回复
10
huzhiyang|  楼主 | 2015-10-16 14:22 | 只看该作者

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

TE.rar

12.93 KB

使用特权

评论回复
11
ayb_ice| | 2015-10-16 14:29 | 只看该作者
huzhiyang 发表于 2015-10-16 14:22
我也是这么做的,也是一样的错误

马上帮你搞定

使用特权

评论回复
12
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;

TE.rar

22.63 KB

使用特权

评论回复
13
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

使用特权

评论回复
14
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个字节,所以这样是不行的,编译过不了

使用特权

评论回复
15
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

使用特权

评论回复
16
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怎么会是三个字节呢?

使用特权

评论回复
17
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个字节

使用特权

评论回复
18
ayb_ice| | 2015-10-16 15:31 | 只看该作者
huzhiyang 发表于 2015-10-16 15:21
我还有一个问题,我拿到的项目中有个文件没有,只提供了.obj的文件,还是举例吧:
提供了如下文件:a.obj,  ...

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

然后就是正确声明

使用特权

评论回复
19
huzhiyang|  楼主 | 2015-10-16 15:44 | 只看该作者
ayb_ice 发表于 2015-10-16 15:31
关键是fun这个东西定义了没有

然后就是正确声明

这个东西看不到,我拿到的项目别人不是在keil里面编译的,是自己写了一个.bat的文件,然后在里面去调用C51和A51的编译器完成了整个项目的编译

使用特权

评论回复
20
ayb_ice| | 2015-10-16 15:50 | 只看该作者
huzhiyang 发表于 2015-10-16 15:44
这个东西看不到,我拿到的项目别人不是在keil里面编译的,是自己写了一个.bat的文件,然后在里面去调用C5 ...

那个提示信息就是说没有定义或者声明错了

使用特权

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

本版积分规则

32

主题

190

帖子

2

粉丝