作者pponywong (pony)
看板C_and_CPP
标题Re: [问题] 一个研究所考题
时间Tue Feb 10 11:33:52 2009
※ 引述《in09 ()》之铭言:
: 我来答看看, 请高手修正
: ※ 引述《peacecorner (说谎的没海鸥)》之铭言:
: : 1.一个程式在执行时,其data area 可分作两部份:heap 与call stack,
: : 请问call stack 与heap 各是做什麽用的
: Heap 是给 global, static 变数放的地方, malloc (new) 出来的变数也是放这里
: call stack 是 local 变数放的地方, function 相关的 data (如参数) 也是
heap 是放 malloc 跟 new 的资料
global 跟 static 变数是放到 data section
好像不太一样
一般local 变数跟函式呼叫是放到stack
例如原本 stack 是指到 p
当你宣告
int i;
时
stack 指到了 p + sizeof(int) = p + 4
char a[20];
stack = p + sizeof(a) = p + 20
还有一般呼叫函式会用 stack 放参数跟return point
像
C()
{
A();
}
stack 会有
p = return address of a() (void* = far proc pointer)
p + sizeof(void*) = new stack in A()
如果是
C()
{
int x = 0;
int i = A(x);
}
的话
p = return address of A()
p + sizeof(void*) = variable x
p + sizeof(void*) + sizeof(int) = new stack in A(x)
如果 A(x) 结束的话
会把回传值放到 eax
然後减去呼叫 A(x) 所用到的 frame size
stack in A() - sizeof(int) - sizeof(void*) = original p
大概是这样
详细的做法请看
组合语言那本书, 就是封面是贝壳的
: : 2.接续上题,请解释function 的呼叫(与function call 的return)
: : 与call stack 的“消长”(i.e., shrink and grow)有何关联?
: call 一个 function 就会需要一块 stack 放置相关的 data.
: return 时, release 这块.
: (不过, 我一直对 "return 的值" 是放在哪里, 几时会 release 一直不清楚, 有请高手)
: : 小弟已经在网路查过了 但是没有查到
: : 我知道heap 与call stack分别是堆积与呼叫堆叠
: : 也知道函式在呼叫的时候会将指令位址存入堆叠
: : 等到return时再从堆叠取出
: : 但是跟data area扯上关系我就不会解释了
: : 第一题不会 第二题就不知道怎麽解释了
: : 有没有高手可以给小弟一个完整的答案呢??
: : PS:这两题不是作业,拜托高手回答一下
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.207.94
※ 编辑: pponywong 来自: 140.114.207.94 (02/10 11:35)
1F:→ MOONRAKER:BECK的贝壳书不是教系统程式吗? 02/10 12:00
2F:→ bleed1979:黄色贝壳是ASM 紫色贝壳是系统程式 02/10 14:38
3F:→ MOONRAKER:我只看过旧版的SP 那时候好像是黑贝壳说 02/10 16:01
4F:推 netsphere:看起来比较像 海螺 XD 02/10 16:21
5F:→ MOONRAKER:好像是鹦鹉螺(nautilus)吧 可是大家俗称贝壳 02/10 17:05
6F:→ MOONRAKER:BECK念起来也像贝壳 02/10 17:05