打印

51堆栈的安全(精确)设置

[复制链接]
楼主: 冷漠
手机看帖
扫描二维码
随时随地手机跟帖
21
xlsbz| | 2010-7-16 21:42 | 只看该作者 回帖奖励 |倒序浏览
都是高人啊  还是高人之间讨论吧 我这样的不要乱掺和了!

以后有时间再看吧!

冷漠还是很厉害的!highgear也厉害!好!

好!

使用特权

评论回复
22
ayb_ice| | 2010-7-17 08:39 | 只看该作者
LS
你根本不是"一级菜鸟",
你是真正的老鸟啊
...

使用特权

评论回复
23
123jj| | 2010-7-17 12:12 | 只看该作者
非常同意LS的观点,
LS的LS根本不是"一级菜鸟", 而是只真正的老鸟啊。
也非常同意LS的LS的观点:
冷漠还是很厉害的!highgear也厉害!好!
很厉害厉害高一级吧?!

使用特权

评论回复
24
xlsbz| | 2010-7-17 19:49 | 只看该作者
非常同意LS的观点,
LS的LS根本不是"一级菜鸟", 而是只真正的老鸟啊。
也非常同意LS的LS的观点:
冷漠还是很厉害的!highgear也厉害!好!
很厉害比厉害高一级吧?! ...
123jj 发表于 2010-7-17 12:12


完全误解了本菜鸟的想法!

我的意思是都很厉害!

使用特权

评论回复
25
冷漠|  楼主 | 2010-7-18 12:25 | 只看该作者

冷漠修正一些错误:

本帖最后由 冷漠 于 2010-7-18 22:13 编辑

冷漠修正一些错误:

1) "假定项目中有3个汇编程序模块A.a51,B.a51,C.a51,它们当然每个模块都有自己的私有堆栈"
"BL51 A.OBJ,B.OBJ,C.OBJ  STACK(?DT?A(50H),B(60H),C(70H))
C51下的公有堆栈指针是?STACK ,而每个模块的私有堆栈指针是STACK,一个公有?STACK里包含一个或者多个私有STACK,?STACK指针由编译器确定分配在 idata 内所有段的最后面"
——呵呵,这种概念所长还不如老许理解透彻:一会给你抄抄操作系统的书。highgear是精通555时基的,怎么可能理解这么深刻的机制?所长从裸奔和汇编的概念出发当然不可能理解。不妨跟老许学学:什么叫软堆栈?如若谁再提出个“软中断”,所长该不会大呼小叫吧。要不要冷漠给你注明哪本书上写的?你不可能比书作者还高明。
2) "只有PUSH / POP指令才能操作STACK,硬件自动压入的属于不可控的系统控制栈,STACK根本不指向!2字节压入PC根本不影响STACK指针"
3) "C程序中硬件自动压入的PC在私有STACK指向下面就完成了,用户程序根本看不见的。好像称为系统控制栈内容"

——呵呵,硬件自动压入堆栈的PC影响的是?STACK,(幸亏冷漠前面没有写问号,也即SP指针。这称为“Hardware  stack”,别混为一谈,装明白人了。要不要冷漠注明摘自那本书?——你不可能比书作者高明 !!


4) " 私有堆栈(每个后台函数的私有STACK,和C编译器中的?STACK是两回事)被编译器分配在RAM低端,从全局静态变量区(包括共享覆盖区)后面开始,即初始SP所指向区域,直到?STACK所指向为结束。

——冷漠的错误,先说对不起了:“即初始SP所指向区域,”这句话应该是……“从共享覆盖区后面开始,直到?STACK所指向为结束。”这正是老许说的后台软堆栈区,它是人们汇编语言概念上的堆栈么?别以为一个STACK命令分配区就认为是堆栈了。看书一点联想里都没有。难怪学不会操作系统。要不要我贴张图讲得更清楚一点,**出处当然就是P640啦,再回家好好看看这一段。你不可能比书作者还高明。

待续……
TACK所指向的是前台堆栈,被编译器默认自动分配在所有段(包括所有私有STACK段)的最后面(RAM高端)——栈顶部分!关键的是从这里开始,直到栈顶,才存在溢出危险。——它是一个独立ISR函数(不是多个后台函数)的堆栈"

5)"对于interrupt 属性函数,C51为其分配中断函数私有堆栈……还有硬件堆栈hardware  stack 的概念"

引用结束.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xuyiyi + 1
26
xuyiyi| | 2010-7-18 13:27 | 只看该作者
顶!
冷漠大师分析的入本三分!
俺菜鸟拎着菜篮子捡菜!
收入丰厚!:lol

使用特权

评论回复
27
highgear| | 2010-7-18 23:05 | 只看该作者
哈哈, 冷漠同学概念混乱, 从头到尾含糊其辞。冷漠同学既不敢明确回答有多少个栈, 也不敢***具体详细*** 的解释stack的原作过程。

我先把这里 stack 的具体化一些,  以免误解引申:
*) stack 操作是指影响 8051 sp 的操作, 如函数调用, push/pop.
*) sp 的活动区域为 stack 区。
这样, 计算机软件算法的 stack 就不在此例。(呵呵, 在我面前卖弄 软件stack和软中断, 如同卖弄bios 一样可笑)。

我下面会把 ?stack 和 stack, 什么“私有模块栈“ 讲解清楚。 我不会比书作者还高, 但 keil 会。
书作者的问题是没有讲清楚, 而冷漠的问题是不清楚却胡说八道。

我先给出keil 关于 bl51 stack 的说明, 对照 p640, 认真的看看, 就会知道原委.

http://www.keil.com/support/man/docs/bl51/bl51_stack.htm

■Use of the STACK directive to locate the ?STACK segment is typically not required.
■The STACK directive is typically used with assembly programs that have several stack segments.
■Use extreme caution when using the STACK directive. Improper use may result in a target program that crashes or that corrupts DATA and IDATA variables.

keil 从头到尾没有提出 "私有堆栈" (private stack) 的概念, 冷漠同学硬生生造出了很多的“术语“。

在讲解 "私有堆栈" 来龙去脉前, 还是请冷漠明确的说明有多少个涉及硬件栈指针的stack ? 2个, 3个还是 5个?

使用特权

评论回复
28
wswh2o| | 2010-7-19 08:59 | 只看该作者
冷漠说的是操作系统得堆栈?!
51貌似就一个栈吧。除非用可重入的时候还有个模拟得

使用特权

评论回复
29
highgear| | 2010-7-19 09:24 | 只看该作者
在讲解 ?stack 和 bl51 stack 前,俺看到冷漠童鞋唧唧外外os, linklist, 忍不住又想与冷漠同学pk 玩:
很简单,做一个简单的非抢占任务调度系统,8个任务轮巡。必须使用链表和软件栈。语言asm/c/c++, 平台不限。
冷漠同学敢不敢呢?

使用特权

评论回复
30
highgear| | 2010-7-19 09:53 | 只看该作者
“模块私有栈“:
这个术语在徐爱钧编著P640里以及 keil 的网站里都没有, 显然是冷漠杜撰的, 如同"递归可重入“

Bl51 stack 命令参数看似可以设定一个”模块私有栈”, 其实这个stack 命令参数的作用是为了汇编模块,而且是需要重新设置 sp 的汇编模块。 C 程序不需要关心 sp, 更不鼓励用户设置 sp. 只有汇编不得不这么做。汇编不得不自己设置 sp,不得不自己控制push/pop.

假设某个第三方的汇编模块里改写 sp (由于特殊的应用),此人为了通用,没有直接设置 sp 为一个固定值,而是提供了一个sp地址的命名名称, 如?ID?MEASURE,以便可以让最终用户在连接时由 linker 为?ID?MEASURE确定地址 。模块结构大致如下:
        ?ID?MEASURE segment idata
       rseg  ?ID?MEASURE
       ds  1
        …
        mov SP, #?ID?MEASURE

Linker 在连接时,可以自动也可以手工用 stack参数设定?ID?MEASURE的具体位置, 并可以保留若干字节(8086 汇编里经常有这种需求,为了不污染原来的stack). 这种 sp 被更改所产生的数据区域, 徐爱钧的书以及 keil 称为栈段(stack segment), 没有称为 "模块私有栈".

因此, 只要模块中没有设置 sp, 那么就不会有stack segment, 也就是冷漠所说的“模块私有栈".

而 ?stack 仅仅是一个命名名称,作用是在startup 初始化sp,即:
   mov sp, #?stack - 1
?stack 的值在连接时确定, 此外,别无特殊意义。当在某个模块里重设sp 后,其后所有的栈活动(call, interrupt, push, pop,ret,reti)都会从新栈点开始。
.
.
.

结论:
a) 如果程序中, 用户没有重新设置 sp, 而且排除另一个概念---计算机软件算法中的栈, 那么
  *) 不存在所谓的“模块私有栈“, 不论有多少模块
  *)只有一个涉及sp 的栈,没有其他的乱七八糟的栈

b) 如果程序员在程序中多次设置 sp, 这些sp的活动数据区被称为 stack segment, 而不是一个独立的“stack"  

如果对上述内容不能理解,请仔细阅读链接中的内容
http://www.keil.com/support/man/docs/bl51/bl51_stack.htm

使用特权

评论回复
31
sheriff| | 2010-7-19 11:46 | 只看该作者
一涉及到“PK”的内容的帖子,冷大侠就像人间蒸发一样不见了踪影~~:shutup:

使用特权

评论回复
32
xlsbz| | 2010-7-19 12:04 | 只看该作者
:victory:

使用特权

评论回复
33
寄语信鸽| | 2010-7-19 22:55 | 只看该作者
使用Keil很烂的路过,研读中...

使用特权

评论回复
34
xlsbz| | 2010-7-20 10:41 | 只看该作者
建议PK之前 大家要把基本概念 搞成一致的。

比如到底什么是堆栈   

我来讲讲吧  所谓堆栈  就是由 堆  和 栈 两部分组成

堆 是..
栈 是...

使用特权

评论回复
35
冷漠|  楼主 | 2010-7-21 09:49 | 只看该作者

见冷漠新帖“关于51多任务的堆栈”

本帖最后由 冷漠 于 2010-7-21 09:56 编辑

35楼说到了关键点,PK要在对等的平台上。所长一直在裸奔层次上喋喋不休,不知道还有更高级一层的平台?不知道冷漠站在哪呢就急于开骂?

冷漠对所长的学问一直暗笑,观战不语。真正厉害的是29楼wswh20:
    冷漠说的是操作系统得堆栈?!   
51貌似就一个栈吧。除非用可重入的时候还有个模拟得


29楼都已经点出了问题本质:所长还在那玩裸奔上瘾!
wswh2o朋友说的意思是:如果在操作系统层次上讲,冷漠说的是对的。——至少是基本对的。 —— wswh2o 是真正清楚知道操作系统内部多任务有多个堆栈,虚拟机,每任务一个堆栈;这水平不是一般人所具有的,真是高于所长多少倍了。

而从OS下层裸奔概念来看,51只有一个栈。
……冷漠自己坚决承认:裸奔概念下,冷漠的帖子就是在胡扯!什么私有公有多级堆栈,是根本没有的概念!

太遗憾了!冷漠一直是站在操作系统上层讲话,所长却一直在下边裸奔忙乎。一点OS概念都没有,冷漠在讲什么他都丈二和尚呢。忙乎半天给冷漠硬扣了5大错误,“概念混乱,信口自创胡说。”

哈哈,两个层次上的概念,冷漠在上,所长在下,当然概念混乱。吐沫星子吐在了自己的层面上,还没达到高度。

所长现在的水平2年来非但没长进,而且日益见退;比较起 29楼 wswh2o ,都有天壤天壤之别。还忙乎和谁PK ?
        (昆仑派真是一点长进都没有。——杨逍)

使用特权

评论回复
36
ayb_ice| | 2010-7-21 09:58 | 只看该作者
LS
在操作系统下更不可能精确设置堆栈了
那岂不是更扯蛋了

使用特权

评论回复
37
hificwc| | 2012-3-8 22:42 | 只看该作者
收藏

使用特权

评论回复
38
dong_abc| | 2012-3-8 22:45 | 只看该作者
这么好的帖子我尽然现在才看见,非常感谢LS挖坟党!

使用特权

评论回复
39
hificwc| | 2012-3-9 13:25 | 只看该作者
最近调了个程序,也是堆栈问题,程序上电跑了一会,一些全局变量和数组的值莫明其妙的变了,搞得我郁闷也几天,所以只好在二姨上求助了,昨晚才找到了堆栈的贴子

使用特权

评论回复
40
g1234567| | 2012-3-9 18:25 | 只看该作者
挖坟党就是厉害!
我也说说:
1)、一个两个调用能精确计算堆栈,以及堆栈内是什么东西,略微复杂一些的,但要在知道程序流程及时序后也可以推算出来,但。。。很难了。
2)51堆栈是向上的,无论人工的也好还是编译器也好,SP的赋值就决定了堆栈空间的大小:256-SP或128-SP,所以留足的才是重点;
3)所以在时间或者说时序上能够满足的条件下,应最大可能的使用“以时间换空间”(或者说“以ROM换RAM”)的方法:少用全局变量或者把全局变量放在片外才是解决堆栈问题的关键;
4)这也就要求要对编译器有足够的了解;
:lol

使用特权

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

本版积分规则