打印

救火车的火灾预警----小心keil的堆栈隐患。

[复制链接]
楼主: 救火车
手机看帖
扫描二维码
随时随地手机跟帖
61
是的,冷漠最近不知从门哪位大师门下,进步飞速是人类无法超越的~~~

敬礼
hotpower 发表于 2010-7-15 07:15


冷漠大师来自火星,自学成材!

敬礼

使用特权

评论回复
62
xuyiyi| | 2010-7-15 07:21 | 只看该作者
hot大叔也来自火星吧,向hot大叔的三角理论、勾股定理、云世界........

敬礼

使用特权

评论回复
63
highgear| | 2010-7-15 08:11 | 只看该作者
呵呵, 冷漠同学很勇猛啊,要是 PK 时也能这样,那就真正的让人敬佩了。

中断stack 可能的深度,冷漠同学这么兴奋没必要吧? c51手册上说的很明白:

The interrupt attribute affects the object code of the function as follows:

1) When required, the contents of ACC, B, DPH, DPL, and PSW are saved on the stack at function invocation time.

2) All working registers used in the interrupt function are stored on the stack if a register bank is not specified with the using attribute.


中断断点2个bytes, 加上上面的5+8 个, 一共15个。如果是双 dptr, 还要再加 2个。

使用特权

评论回复
64
highgear| | 2010-7-15 08:23 | 只看该作者
哦, 原来冷漠大师来自火星, 失敬, 失敬。 无怪乎不屑于与人类 PK.

敬礼

使用特权

评论回复
65
冷漠| | 2010-7-15 09:12 | 只看该作者
本帖最后由 冷漠 于 2010-7-15 09:56 编辑

呵呵,所长又一次自以为是了。——真是太低估冷漠了。如果问题答案像63楼这么简单,冷漠会用“钻地缝,永远退出论坛。”来和你 PK ?(那岂不是从现在起,冷漠就再也无脸登录21IC。)哈哈,换个对象差不多,所长又跑这丢份来了?
忘了自己怎么回答冷漠关于“CORE和Kernal的差别”,OS问题竟然跑到Intel酷睿核去了。答非所问,脸红了一回(多少回了),也不接受教训,下次还自以为是?“全世界都错了,所长自己总是智商最高的。”

所以现在冷漠得意极了,以前令人尊重的所长老前辈,水平不过如此。和冷漠想到的问题根本不在一个层次了,冷漠送你一句“差远啦”。

冷漠问你的挑战问题是:“为什么一级中断堆栈的深度不会大于13字节。”没问你13字节是哪13个寄存器。——这种谁都知道的事情。
冷漠早就告诉你了:互联网上查不到,Keil没说过的问题你就想不到!——结果还去查互联网?离了互联网堂堂大所长还知道个啥?

哈哈,算啦,把答案告诉你老人家吧:由于后台非重入函数的参数和动态变量被编译器分配在系统data的静态全局变量区(共享覆盖区),使前台中断堆栈与后台函数私有堆栈隔离,因而中断堆栈实现了简约,仅需保护那些自己ISR使用到的寄存器,那么,除了13个寄存器(2个PC也算中断ISR堆栈内容?算了吧,——只有PUSH / POP指令才能操作STACK,硬件自动压入的属于不可控的系统控制栈,STACK根本不指向!2字节压入PC根本不影响STACK指针,这年头你玩小汇编,玩SP?还玩BIOS?!20年前的技术,这么多年也不知道学点新玩意。)……什么情况下,中断堆栈需要 PUSH 全部13个寄存器?再多需要一个/ 几个字节存储器怎么办?没那么巧呀。所长47楼不是说需要留有“一定裕量”吗?一定裕量肯定不是指精确13字节(还是冷漠提示的数字)。真那样,版主就可以结贴啦,大师的头衔非所长莫属啦。

使用特权

评论回复
66
冷漠| | 2010-7-15 09:28 | 只看该作者
本帖最后由 冷漠 于 2010-7-15 09:41 编辑
……即便知道最大栈深, 留出一定的裕量还是必要的。


47楼所长2天以前还在说“留出一定的裕量还是必要的。”救火车版主问的就是这个问题:
这个一定的裕量到底应该精确到多少字节?50字节?100字节?当然安全。讲讲为什么?10天也没讲出个所以然来。

   谁不知道应该留有裕量?大师与菜鸟的差别就是“到底应该精确到多少字节的裕量!

冷漠说几组数字:13,26,32,48 ……字节,还要再多吗?请教所长,到底裕量取多少字节才是安全的?Keil 当然考虑过这个问题,所长这么查互联网也没查出个结果?——经过冷漠的提示。还引导咱们菜鸟去看Keil 网站?您前辈都不行,我们这样智商比您低得多的菜鸟怎么行?

版主等大侠可是等了10天了,所长看来也没什么指望,冷漠只好开讲啦。

使用特权

评论回复
67
highgear| | 2010-7-15 09:41 | 只看该作者
冷漠同学前面的概念太混乱了, 我把stack 表述的再清楚些
1) 8051 有且只有一个stack, 不存在前台stack 和 后台 stack, 任何制造两个 stack 或一前一后的做法, 都是严重的伤害 8051 的感情。

2) 函数的调用(指的是保存当前地址, 中断断点以及register 保护, 都是使用同一个 stack (这应该是地球人的基本常识, 做过汇编的更清楚), 没有一个函数stack 另一个 isr stack 在加一个 register 保护stack, 分裂不得人心。

3) 函数调用时的参数(注意, 是参数)不同于其他大多数的 c compiler 如vc++, 不通过stack 传送, 原因前面的keil文档说的很清楚, 8051小的可怜的 ram。

如不能理解上述内容, 请阅读:
http://www.keil.com/support/man/docs/c51/c51_le_funcparmsstack.htm
http://www.keil.com/support/docs/250.htm

使用特权

评论回复
68
highgear| | 2010-7-15 10:02 | 只看该作者
冷漠同学先打住, 请先提交您老的论断的出处。
1)“所有C库函数都是递归可重入的“, 请说出哪本书的哪一叶。
2) "通过堆栈传递参数是纯粹的汇编方法",  汇编没有规定传送参数的方法
3) 52楼的概念混乱错误, 请给出出处。
4) “这么多年也不知道学点新玩意“, C# 够新了吧, pk 时你怎么就不吭声。
5) "还玩BIOS", 哈哈 冷漠同学卖弄 bios 的时候, 没想到我还会 bios, 闹了个灰溜溜吧。
  
好了, 请冷漠同学给出一些证据和出处, 我一定给您鼓掌。

使用特权

评论回复
69
highgear| | 2010-7-15 10:24 | 只看该作者
关于 裕量到底应该精确到多少字节 的答复:
人有多大胆, 地有多大产。
这个取决于计算 stack 深度的精确度, 自信心和胆量。如果自信爆棚, 可以 0byte, 否则2 to 8 个字节防备意外和维护时不经意的改动

记住 highgear 定理:
stack 溢出的可能性与项目的金额和重要性成正比!

使用特权

评论回复
70
冷漠| | 2010-7-15 10:30 | 只看该作者

?STACK 和 STACK 的差别:

本帖最后由 冷漠 于 2010-7-15 10:59 编辑

所长又要脸红了。举个例子,假定项目中有3个汇编程序模块A.a51,B.a51,C.a51,它们当然每个模块都有自己的私有堆栈,——汇编语言通过(自己的私有)堆栈传递参数是基本技术。编译后得到3个OBJ文件A.OBJ,B.OBJ,C.OBJ;告诉你自以为是的智商最高的所长,L51怎么由编程员分别给这3个汇编文件链接定位的:(当然你用默认也行)

BL51 A.OBJ,B.OBJ,C.OBJ  STACK(?DT?A(50H),B(60H),C(70H))

C51下的公有堆栈指针是?STACK ,而每个模块的私有堆栈指针是STACK,一个公有?STACK里包含一个或者多个私有STACK,?STACK指针由编译器确定分配在 idata 内所有段的最后面,(当然STACK也一样)是不可由用户配置的,但STACK可以由用户使用L51“段与存储器定位控制命令”STACK 来配置,就像上面举例一样。

这些内容请见《Keil Cx51  V7.0 单片机高级语言编程与uVision2 应用实践》 徐爱钧编著  P640

算了吧,所长,这碗饭冷漠吃了多少项目了,您一个也没玩过,一本Keil C51的书也没看过,就在这装大师?没看过书的比我听过、看过、做过的还厉害。这不是你的C++,C#。

智商高的话也像冷漠这样贴出个图来说话,冷漠贴过几十张图了,所长一张也没贴过,光讲空话算什么本事,沙哑的嗓门光知道空喊,证据!冷漠要看你说话的依据!

使用特权

评论回复
71
wswh2o| | 2010-7-15 10:44 | 只看该作者
第一次听说私有堆栈:L

使用特权

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

冷漠的又一个发现:所长好几次涉及“OS”问题时,都显得无知。69楼再一次让冷漠彻底明白:所长可能是裸奔高手,OS领域绝对空白!空白就空白,不说话没人把你当菜鸟,非要装这个象干嘛?露怯多不好。

8051 有且只有一个stack, 不存在前台stack 和 后台 stack, 任何制造两个 stack 或一前一后的做法, 都是严重的伤害 8051 的感情。


        你那是裸奔,——小汇编程序。这里说的是Cx51,都发展20年了,还在这玩20年前的小汇编?会玩宏汇编也好呀——多人分别单独编写一个项目的分程序也知道堆栈段不止一个!所长是20年前的遗老族?
       张、王、李三个程序员分别编写A、B、C  .a51模块,他们的程序堆栈公用吗?是不是私有堆栈?

谁不知道OS多任务,每个任务都有自己独立的堆栈?复杂的OS 咱不了解,冷漠只了解 RTX51。RTX51每个任务当然具有自己的私有堆栈,根据虚拟机的概念也好理解,所有OS调度程序,至少对独立不相关的任务进行切换时,都是连任务堆栈一起进行“环境”保护的!否则,上下文切换就太容易了。

Cx51编译器是支持RTX51的!运用这种OS内存管理技术不是小菜?再抄一段书上的内容给不懂装懂的人:

   

……Cx51编译器会(自动——冷漠注释)产生一个?STACK的堆栈段,该段将被自动定位到IDATA空间的顶部。……一般不需要特别指定?STACK的位置,对于具有几个堆栈的汇编程序才需要采用STACK命令。……


所长这水平,不敢恭维,相差甚远!什么都不知道,冷漠讲起课来都觉得没劲。

使用特权

评论回复
73
xuyiyi| | 2010-7-15 11:42 | 只看该作者
呵呵!
keil C51设计的挺完善的,每个模块都有自己的独立(私有)堆栈,向大师们学习。

使用特权

评论回复
74
冷漠| | 2010-7-15 12:22 | 只看该作者
关于 裕量到底应该精确到多少字节 的答复:
人有多大胆, 地有多大产。
这个取决于计算 stack 深度的精确度, 自信心和胆量。如果自信爆棚, 可以 0byte, 否则2 to 8 个字节防备意外和维护时不经意的改动

记住 highgear 定理:
stack 溢出的可能性与项目的金额和重要性成正比!


哈哈,冷漠越来越得意,冷漠开讲的课题标题就是“51堆栈的安全(精确)设置”。先告诉所长一声,Keil——这个做编译器的人是极端聪明的人,不会不考虑这个问题,都像你那样放卫星,uV2-IDE还能全世界卖?15,000¥的软件,比微软的XP还贵5倍!

救火车版主提出同样深刻的问题:Keil 51堆栈的安全设置值精确是多少?

所长的言外之意:版主提出的是不可能有精确答案的问题?太看不起版主了吧,……那你就靠边站,好好听听冷漠怎么证明这个精确值的。当然是以Keil 提供的材料为依据的。

使用特权

评论回复
75
冷漠| | 2010-7-15 13:10 | 只看该作者
本帖最后由 冷漠 于 2010-7-15 13:13 编辑
"通过堆栈传递参数是纯粹的汇编方法",  汇编没有规定传送参数的方法


68楼小汇编也不会玩啦?汇编语言通过堆栈传递函数是一种程序员经常玩的技巧,一般人不会玩的。技巧性的东西不能算是规定吧,所长这么大牛裸奔高手,要是不会玩,冷漠教教你:参考 孙涵芳 徐爱卿的《MCS-51/96系列单片机的原理与应用》P225
“通过堆栈传递参数的方法之一”
P226
“通过堆栈传递参数的方法之二”

所长该不会又要说“这本书有严重的错误 ……”  
那最好先互联网上查查 孙涵芳、徐爱卿是谁,你又是谁?
再提醒所长一句:
上次冷漠写了个链表程序,所长非要出来“点评一下”,(又没人请你。)“缺点是……”结果恰好这个缺点是冷漠参考了清华大学 严蔚敏、吴伟民的最新版《数据结构》中P27“循环链表”部分的内容。

严蔚敏是谁?咱不一定关心,但是她写的这本书从1997年第一版到现在已经是第43次印刷,印数是202万册了!

所长大人说严蔚敏的书中有概念错误?误导了冷漠;冷漠回送你一句:回家好好想想自己是谁?
所长写了几本?印刷了几本?一本没有,那就向别人好好学学。别一生尽玩嘴皮子功夫,结果一事无成。跟这个比,跟那个比,有劲么?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
76
xlsbz| | 2010-7-15 20:13 | 只看该作者
严蔚敏  这个人我听说过!

使用特权

评论回复
77
xlsbz| | 2010-7-15 20:15 | 只看该作者
冷漠 等都是高人啊  

建议将理论整理成文档 说的简单明白些  就好了!


所长的理论一般比较高深   所长的代码我一看就头疼  反正现在是不打算学习那种思路了

我喜欢简单的东西

使用特权

评论回复
78
冷漠| | 2010-7-15 21:06 | 只看该作者

所长这么老前辈多写写自己的灵感发现,别总跟着冷漠跑。

本帖最后由 冷漠 于 2010-7-20 11:09 编辑

冷漠为避开所长,另外开贴整理文档了:“51堆栈的安全(精确)配置”。
内容太多,分一星期完成。

所长若有心,建议也自己开贴,自己讲述自己的灵感新发现,开创新课题。别什么都跟菜鸟学。
        像:C#如何给51编程的,面向对象的软件如何用于面向机器,全中国你肯定是第一人;这么深刻的发现不好好写写,热衷于天天到冷漠菜鸟群里混“尊重”?值吗?

       你自己的楼里随便怎么侃。就是别到冷漠的楼里去,那里是菜鸟讨论区,对你高手屏蔽,去了挺没趣的。

使用特权

评论回复
79
xuyiyi| | 2010-7-15 21:14 | 只看该作者
顶冷漠大虾的整理文档:“51堆栈的安全(精确)配置”。
俺们菜鸟的福音。

使用特权

评论回复
80
highgear| | 2010-7-15 21:24 | 只看该作者
哈哈, 我一向佩服冷漠同学的东厂本事。
1) 冷漠就是冷漠, 冷漠不是严蔚敏, 即便冷漠是严蔚敏, 使用一片不完整的链表代码, 仍是缺点。那个帖子无数人都看了, 断章取义, 指鹿为马很可耻。

2) 可以断定, 冷漠同学对汇编语言理解不够, 至少基本上没有做过什么汇编项目。虽然可以通过堆栈传递参数, 但是汇编多数通过 ********************** 寄存器************************* 传递参数, 大多数的 c 通过堆栈传递参数。多去看些汇编程序吧, 呃, 冷漠同学不是看过 bios 么? 告诉我 bios 里哪一个函数通过堆栈传递过参数?
冷漠同学没有做过汇编程序, 对吧?

3) 74搂就说了, 冷漠同学用脚后跟再想想。

4) 75搂看出冷漠的概念混乱:
   a) obj 是编译的产物, 编译时由于compiler 不知道模块的上下文, 所以会产生中间性的数据和“堆栈段“, 是临时产物, 连接时 linker 统一规划定位。在目标代码运行时, 只有一个stack, 不存在私有的stack. (当然 80x86 有stack segment, 有 ss 寄存器, 可以轻易切换stack seqment. 8051则没有)
  b) OS 是另一回事, os 需要操纵stack 以完成任务切换, 必须有专门的数据区以及stack 来save/restore context.

冷漠同学:你混淆了编译时的中间临时的 "私有" stack 与 目标代码 运行时 统一的 stack。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则