打印

深入浅出: C 与 C++ 中“结构直接复制”的探讨

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
81

123 jj 给自己找台阶呢,学生能缩减一字节也让你不好下台。

本帖最后由 刘前辈 于 2011-5-16 20:19 编辑

76楼学生写的太精彩了,包含了很多概念应用。最终结果并不在于一个小小的改动就把code缩减几十字节,主要是这里包含的教育意义。——什么叫直接寻址,间接寻址。能使用直接寻址的地方一定比使用间接寻址快。

aihe的源程序在keil C上 一个Xdata/idata就使程序代码缩减近100字节!这就是直接寻址和指针间接寻址的差别。——和keil C 还是 COSMIC C 根本没关系!

     这年头,谁比谁差?Keil C 有Xdata/ideta ,COSMIC C 相应寻址就有@near / @tiny 。
    C 编译器都是以ANSI C为标准的。论功能谁都不差。昨天是谁还在把 Keil C 贬的一无是处,现在是不是又该贬COSMIC  C 了。(在这种人眼里,除了自己,别人都是一无是处。—— 一天到晚以贬低别人为快乐。)以为意法 做不出个好的编译器?贬低意法也快乐 ?

谁说76楼学生修改的程序可移植性差?123jj 是想说:“意法的程序写的太差了,没有可移植性。”?
见图:



呵,别忘了学生这个仿COSMIC 源程序首先是在 keil  C  下通过的,什么意义不用提醒吧。—— ANSI  C标准程序,这里没有idata , Xdata,不用那么仔细找茬。(不会揪住第一条说事吧,那我把它删了好了。)
      
                 贬低意法很快乐 ?

为何keil  C  加了一个xdata / idata 说明,就轻易把code 缩减了近 100字节?——COSMIC   C  理论上也一样;修改前后编译结果汇编码的分析比较是真正快乐的事;分析过程中所发现的东西,学了十年都不知道。

           所以可以这么说,aihe 无意中的这段程序极有价值。几天学到的东西,胜读十年书。——照本宣科讲理论有什么意思,讲讲这段程序所包含的概念有意思多了。
             像那种根本不会关注这种价值的分析研究过程的人,只关心什么“ keil 不算,这是STM8……”,呵,俺已经不关心这类处处给自己找台阶的事了,——仅从 keil  C51 中发现的这种现象,才真正是让学生关注、兴趣投入的地方。
        唉,赞叹:由此知道为什么 年长并没有用了。—— 有提升自己的好机会发现不了,——时间和生命全耗在 “头忙着打仗呢。”“正忙于寻找PK目标呢。”


、、






使用特权

评论回复
82
123jj| | 2011-5-16 20:15 | 只看该作者
LS刘小辈正解!

直接寻址一定比使用间接寻址快!

在少量数据移动时,直接寻址指令短一点,速度快一点,比间接寻址有着天然的优势!

但是,在大量数据移动时,直接寻址在速度上是能快一点,但代码庸肿,比间接寻址增加N倍代码!
并且几乎难以做到同类型数据之间的代码复制和移植!


这个问题根本不用讨论C语言还是C++,  你只要用汇编编写一个移动复制1000个BYTE数据的代码,不充许用间接寻址,只能用直接寻址,那个代码量好吓人啊~~~

使用特权

评论回复
83
123jj| | 2011-5-16 20:19 | 只看该作者
在代码的压缩问题上,俺一向只看汇编,如果C编译后的代码,同俺手工写的差不多大小,俺就认为没有再优化的必要了~~~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
84
123jj| | 2011-5-16 20:25 | 只看该作者
俺也累了,刘小辈,咱们听aihe老师之言


别费那个劲了
就此打住吧
aihe 发表于 2011-5-15 19:02

使用特权

评论回复
85
aihe| | 2011-5-16 20:48 | 只看该作者
淡定、淡定
在COSMIC上你那个程序和我那个最终的汇编代码是一样的
不知道intel做51时怎么想的,弄那么多的寻址方式,直接寻址就得了,还是Keil不够智能化,呵呵
转成指针时非得用三字节,还不存在Rx中,指针加1程序也搞得异常复杂
怪不得PIC等成为后起之秀呢
提醒一下自己,下次用这个程序时要小心了,如果FLASH+RAM+EEPROM超过64K时unsigned int是不够用的

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
刘前辈 + 1
highgear + 1
86
aihe| | 2011-5-16 20:53 | 只看该作者
修正一下,超过32K,因为STM207 FLASH的起始地址是8080

使用特权

评论回复
87
aihe| | 2011-5-16 21:17 | 只看该作者

咦,奇怪了,我的程序把输入地址改成unsigned long,代码少了一个,STACK多了两个
人家的就不好说了哦

使用特权

评论回复
88
123jj| | 2011-5-16 21:33 | 只看该作者
淡定、淡定
在COSMIC上你那个程序和我那个最终的汇编代码是一样的
不知道intel做51时怎么想的,弄那么多的寻址方式,直接寻址就得了,还是Keil不够智能化,呵呵
转成指针时非得用三字节,还不存在Rx中,指针加1程序 ...
aihe 发表于 2011-5-16 20:48



intel在做51时,根本就没考虑过用C编译器,只考虑用汇编!

后期的MPU设计时,寻址方式多样化,主要考虑C编译器的代码优化。

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
john_lee + 1
highgear + 1
89
highgear|  楼主 | 2011-5-16 21:57 | 只看该作者
8049貌似连片内ram都是间接寻址。8051当初只是作为  单片  机使用,并不是做为通用 cpu 使用,所以没有过多考虑外扩问题,因此不像同时代的cpu 如 z80, 8085, 8086有强大的寻址能力. 我想,连intel 也没有想到一个70年代的设计会使用到今天吧。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
123jj + 1
90
hotpower| | 2011-5-17 01:27 | 只看该作者
哈哈,远离51,珍惜脑浆!

使用特权

评论回复
91
123jj| | 2011-5-17 05:01 | 只看该作者
哈哈,远离51,珍惜脑浆!
hotpower 发表于 2011-5-17 01:27


C8051F还是挺不错的哈~~~


C8051F单片机简介:
    C8051F单片机是完全集成的混合信号系统级芯片(SoC),具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统中常用的模拟、数字外设及其他功能部件;内置FLASH程序存储器、内部RAM,大部分器件内部还有位于外部数据存储器空间的RAM,即XRAM。C8051F单片机具有片内调试电路,通过4脚的JTAG接口可以进行非侵入式、全速的在系统调试。

使用特权

评论回复
92
123jj| | 2011-5-19 05:55 | 只看该作者
8049貌似连片内ram都是间接寻址。8051当初只是作为  单片  机使用,并不是做为通用 cpu 使用,所以没有过多考虑外扩问题,因此不像同时代的cpu 如 z80, 8085, 8086有强大的寻址能力. 我想,连intel 也没有想到一个70 ...
highgear 发表于 2011-5-16 21:57



玩过8049的都是老字辈啦,8049确实只能对片内ram进行间接寻址。向highgear老前辈致敬!

在当时,俺认为,8049功能已经很强大了,比8位机的顶级大师 6502差不了多少。比俺用过的一位机不知强大多少倍,但现在看来,8049比不上现在的 4位机。。。。

使用特权

评论回复
93
highgear|  楼主 | 2011-5-19 21:03 | 只看该作者
我不是什么老前辈。
8049 从来没有玩过。出于好奇,我倒是把 8049,8085,z80, 6502, 6805 等等的cpu结构和指令系统看过一遍,有 8086,8051 的底子和数字信号方面的知识,这些 cpu 都不难掌握。软件方面,我把所有能搞到的编译器都试了一遍;语言方面,把 c, c++, vb, c#, java,甚至sql等,都学了一遍。从 c 到c++非常吃力,但从 c++ 到 c#, java, 就轻快无比;从 8051 到8086 无比头痛,但从 8086 到 8085, z80等,就如热刀切牛油。

保持一颗好奇心和上进心是追赶技术潮流不被其抛离的动力。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
aihe + 1
94
chy117| | 2011-5-19 21:23 | 只看该作者
mark

使用特权

评论回复
95
123jj| | 2011-5-20 03:58 | 只看该作者
呵呵!

怪不得highgear老师,玩耍C++干尤热刀切牛油。

原来对各种芯片如了如指掌,对各个编译器都试过一遍,敬佩。

俺N年前,也对各家的MPU好奇无比,什么美系,欧系,日系,韩系,只要能搞到的,cpu结构和指令系统统统扫几遍,俺将世界上的MPU结构,定义为几大类,6502核,8080核,8051核,PIC核,8086核,早期俺喜欢6502,8080 类MPU,如6800,68000,8085,Z80, 对8051核始终不喜欢,尽管使用的最多,后期的PIC这种精简指令不习惯,8086尽管汇编用了不少,但觉得指令系统太乱,没有同时代的68000条理清晰,也不喜欢,以上感受针对cpu结构和汇编指令系统,不过没出现让俺头痛经历~~~

目前世界上流行的是这5大流派,6502核,8080核,8051核,PIC核,8086核
前两类是世界主流,如STM8属于6502类扩展,H8属于8080类扩展,连ARM内部结构都少不了8080影子,俺将她归类于8080 MPU基本体系,后三种延伸品种较单一,8051核有N家小厂在造,AVR归类于PIC类核,8086属于INTEL独家垄断~~~

注:以上分类是以形和意 掏桨糊分类,便于**。事实上,同时期的芯片不同厂家都有不同的专利,理应作为不同产品处置。

使用特权

评论回复
96
baiyunfei.k.f| | 2011-12-15 12:35 | 只看该作者
学习了

使用特权

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

本版积分规则