对堆栈增长方向的一些疑问?
个人对堆栈的增长方向有以下两点疑问:
1、各种CPU是不是所对应的堆栈的增长方向是固定的?
2、如何确认当前平台下堆栈的增长方向?是不是通过程序来判断?
谢谢你的关注!
[解决办法]
1.不固定
2.程序判断,做静态变量(栈变量),比地址高低
[解决办法]
不是固定的 !!! 编译器判断呀
[解决办法]
进程地址空间,堆和栈要分开而论,二者对向增加!
堆是自底而上,栈是自顶而下增长!
参考资料《linux 内核设计与实现》第14章——进程地址空间
[解决办法]
1、各种CPU是不是所对应的堆栈的增长方向是固定的?
不固定
2、如何确认当前平台下堆栈的增长方向?是不是通过程序来判断?
最好的方法是看CPU体系结构,几乎每种体系都会对堆栈有所描述.
可以通过程序判断,但是直接反汇编更快,不用你写测试代码.
[解决办法]
int up_down;
__asm {
push ebx
push ecx
mov eax,esp
mov ebx,eax
push eax
mov eax,esp
mov ecx,eax
pop eax
mov up_dwon,1
cmp ebx,ecx
ja lbnext
mov up_dwon,0
lbnext:
pop ecx
pop ebx
}
[解决办法]
看看 push 和 pop
比如 push S 就是:
Reg[%esp] <-- Reg[%esp] - 4;
Mem[Reg[%esp]]<-- S
[解决办法]
我在《现代操作系统》中看进程地址空间:数据段向上增长,堆栈向下增长?
[解决办法]
把内存想象成一个竖条, 上面是低地址, 下面是高地址.
则栈的开口向上(向低地址增长), 堆的开口向下(向高地址增长);
也就是说在一个程序里, 声明一个局部变量, 再声明一个局部变量, 后声明的在栈的上面, 地址会更小.
但这是一般的情况.
所以:
1. 不固定
2. 是用小程序来判断
------解决方案--------------------
存在这种可能性!至少我可以保证linux当中是我说的这种情况!