打印

请教:常数组直接定位并赋值

[复制链接]
6620|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cd666|  楼主 | 2010-7-1 14:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2010-7-1 14:47 | 只看该作者
这样是不行的
方法:
1: 使用汇编
2: 使用连接器命令
...

使用特权

评论回复
板凳
qingqiu647| | 2010-7-1 15:59 | 只看该作者
进来看答案的

使用特权

评论回复
地板
ayb_ice| | 2010-7-1 16:44 | 只看该作者
汇编方法:
;// XX.ASM

PUBLIC TT1
    CSEG AT 0XFF00
TT1:
  DB 1
  DB 2
  DB 3

  END

;// XX.C
extern uchar code TT1[];

使用特权

评论回复
5
wzl-xx@163.com| | 2010-7-2 08:45 | 只看该作者
怎么会不行呢?
我估计是你的下划线的地方有问题,
下划线前后都要加空格,你试试我给你改的
unsigned char code TT1[3]={1,2,3}  _at_   0xFF00;

使用特权

评论回复
6
ayb_ice| | 2010-7-2 09:06 | 只看该作者
LS
不可以
初始化的变量不可以直接绝对定位

使用特权

评论回复
7
cd666|  楼主 | 2010-7-2 09:38 | 只看该作者
使用汇编的方法我试了可以 ,请问LS 使用连接器命令要如何做

使用特权

评论回复
8
ayb_ice| | 2010-7-2 10:11 | 只看该作者
LS
连接器命令比较复杂,建议去看C51手册
...

使用特权

评论回复
9
冷漠| | 2010-7-2 10:17 | 只看该作者

很简单。

本帖最后由 冷漠 于 2010-7-2 10:22 编辑

随便定位在哪,随自己意愿。



使用特权

评论回复
10
ayb_ice| | 2010-7-2 10:40 | 只看该作者
LS
实用情况可不是这么简单
首先
L51和LX51不同
其次还应该单独建一个C文件,否则会所有的都绝对定位了,这时某个变量在什么绝对位置并不绝对
...

使用特权

评论回复
11
冷漠| | 2010-7-3 10:10 | 只看该作者

LX 51一样简单呀!

本帖最后由 冷漠 于 2010-7-3 10:43 编辑

嘻嘻,难道LS认为一个C模块的const初始化全局常量/字符串常量可以定义在不同段?例如绝对定位段和可重定位段?汇编行吗?做一个让我们学习学习?

    LZ把TT1[]数组定位在 0XFF00 是为了把代码段和常数段远离,或者是调试时需要(观察方便)?那么,TT1,TT2,TT3本来就是一个属性,谁还把他们到处开花定位?你做汇编,是你自己的事,那么别说C不如汇编功能什么的。C编译器/连接器是干什么的?它们把所有const常数总是定位在最佳位置;(同时也给用户自己定位的自由度。)它们不要求每个程序员都是汇编高手。

……某个变量在什么绝对位置并不绝对...


有人需要在C程序中把所有const全局初始化变量全部绝对定位?干什么,没事干!真是需要观察TT2,TT3定位在哪?——让连接器显示告之,不必什么都自己“想办法”,编译器 /  连接器早就想到了。别人不笨。
       10楼大概认为自己的汇编解决方案是唯一最简约的,“连接器命令比较复杂,建议去看C51手册……” 冷漠的简单实现,——“没很复杂呀?很简单……”于是,一大堆缺陷就来啦。哈,可以理解,再说直白点,意思无非是:“Keil  LX51这个问题解决不了,只能另写汇编。”……Keil  L51 / Lx51 多笨呀。

使用特权

评论回复
12
mydatai| | 2010-7-3 10:11 | 只看该作者
少说话好了

使用特权

评论回复
13
cd666|  楼主 | 2010-7-3 11:57 | 只看该作者
使用连接器进行定位的确有些麻烦,看了手册,还是没有搞定.
谢谢 ayb_ice  和 冷漠
但冷漠的方法还有点问题。比如您的第二个例子, 现在有三个常数数组。我只需要将TT1定位于0xFF00处,另外两个还是让程序去分配,或是需要将TT2定位于0xFE00,TT3定位于0xFD00,这要如何识现。
也许找到编译器生成的组数片段名就可解决问题,但我现在还没有找到。。。

使用特权

评论回复
14
wzl-xx@163.com| | 2010-7-3 14:42 | 只看该作者
LS
不可以
初始化的变量不可以直接绝对定位
ayb_ice 发表于 2010-7-2 09:06


在我的程序中就要到这部分的东东,使用还很好用。

使用特权

评论回复
15
冷漠| | 2010-7-4 11:49 | 只看该作者
本帖最后由 冷漠 于 2010-7-4 12:01 编辑

LZ概念要先弄清,假定你的TT1,TT2,TT3都是已经初始化的code 全局“常量”,请注意下面概念:

一个C模块只可能有一个全局const“常量段”,也就是4楼表达的 CSEG AT 0XFF00  。所以你如果想“TT1定位于0xFF00处,另外两个还是让程序去分配,”  很简单,只要你把另外两个写成与TT1不一样的属性,例如 idata,xdata, 就行啦。

Lx51.JPG (168.46 KB )

Lx51.JPG

使用特权

评论回复
16
hotpower| | 2010-7-4 11:51 | 只看该作者
最近发现冷漠有很大进步,继续努力~~~

使用特权

评论回复
17
冷漠| | 2010-7-4 12:03 | 只看该作者

今年是冷漠的幸运之年。

本帖最后由 冷漠 于 2010-7-4 12:05 编辑

嘻嘻,冷漠今年经常在梦中遇到高人指点。

使用特权

评论回复
18
冷漠| | 2010-7-5 10:20 | 只看该作者
需要将TT2定位于0xFE00,TT3定位于0xFD00,这要如何识现。
所以要定义3个初始化的绝对段,除非你把3个初始化常量写在不同的C模块。TT1_main.C,TT2.C 和TT3.C; 精确手工配置后,连接定位。



使用特权

评论回复
19
ayb_ice| | 2010-7-5 10:51 | 只看该作者
我前面说的就是LS的这种情况,麻烦

这种情况汇编其实更方便

使用特权

评论回复
20
冷漠| | 2010-7-5 12:47 | 只看该作者
嘻嘻。麻烦吗?再看看:请问LS,输入下面2行语句需要多长时间? unsigned char code TT2[]="Hello the world"; //TT2.C unsigned char code TT3[]={4,5,6}; //TT3.C 冷漠打字慢,用了2分钟。5分钟完成3个code 常量初始化精确定位,麻烦吗?
……这种情况汇编其实更方便……
LS的汇编方法如若快捷、省事,为什么不肯花2分钟像冷漠那样写出一个实际可运行的程序来说明你自己的汇编是如何快捷、简约的?3个(不是一个)code 初始化数组精确定位,2分钟而已。麻烦用事实说话。 如若您的汇编方法比冷漠在KEIL集成IDE下完成更省事的话,我不得不信服你,我会说:keil也不咋地,比咱中国高手差远了。

使用特权

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

本版积分规则

47

主题

153

帖子

0

粉丝