[问题] stack里变量位址越后定义越高

楼主: ucrxzero (RX-0)   2020-10-23 01:00:27
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
问题(Question):
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
int main(){
int a=1000;
int b=2000;
int c=3000;
int d=4000;
int e=5000;
int f=6000;
return 0;
}
产生以下组语
movl $1000, -24(%rbp)
movl $2000, -20(%rbp)
movl $3000, -16(%rbp)
movl $4000, -12(%rbp)
movl $5000, -8(%rbp)
movl $6000, -4(%rbp)
movl $0, %eax
popq
为什么不是慢慢往下长而是先从最下面长上来?
这是照a~f的位址印的
0x7ffdb6a309a0
0x7ffdb6a309a4
0x7ffdb6a309a8
0x7ffdb6a309ac
0x7ffdb6a309b0
0x7ffdb6a309b4
楼主: ucrxzero (RX-0)   2020-10-23 01:54:00
有组语版吗?另外我想问为何eax会是0~
作者: firejox (Tangent)   2020-10-23 02:11:00
组语板 asm
楼主: ucrxzero (RX-0)   2020-10-23 02:12:00
发在这也可以吧我要问位址的问题而已感谢提供想到台大电机这题刚好请神人解释https://www.ptt.cc/bbs/Grad-ProbAsk/M.1544605335.A.904.html
作者: KaryuuIssen (一闪)   2020-10-23 03:22:00
顺序是未定义的 怎么长都可以 我记得缓冲区防护好像有影响 你编译加个 -fno-stack-protector 试试
作者: LPH66 (-6.2598534e+18f)   2020-10-23 04:22:00
然后 %eax 设为 0 就是你的 return 0
作者: Lipraxde (Lipraxde)   2020-10-23 06:58:00
怎么 return value 可以参考 System V ABI 里的 Parameter Passing,不同的 return type 有不同的传法,属于integer 的是用 rax、rdx return
楼主: ucrxzero (RX-0)   2020-10-23 09:26:00
感谢大大所以结论是往上往下都可 heap是只能往上回传值是给eax用的这样吗不过直观感觉往上长才会溢位需要保护 反而要保护往下长我看来要多看书
作者: Lipraxde (Lipraxde)   2020-10-23 11:49:00
应该是要看进出 function 时 stack pointer 的变化,stack 应该还是往下长的
楼主: ucrxzero (RX-0)   2020-10-23 11:54:00
CSAPP上说return address是%rbp+4原来是eax感谢大大
作者: LPH66 (-6.2598534e+18f)   2020-10-23 14:06:00
呃, 不对; eax 和 return address 是不同的东西eax 是回传的值, return address 是回去的程式位址硬要说的话后者是 return 0 的 return, 前者是 0
楼主: ucrxzero (RX-0)   2020-10-23 19:40:00
这篇真多宝藏
作者: b0920075 (Void)   2020-10-23 21:50:00
往上往下通常用在内存空间的扩增方向不太会用在区域变量的赋值顺序...
楼主: ucrxzero (RX-0)   2020-10-23 23:27:00
我想也是heap 是用best fit 用过的可能还会释放或GC后重新分配不一定只会往上
作者: sarafciel (Cattuz)   2020-10-24 21:06:00
你看movl塞的offset都是负的 所以stack是往低位长至于stack frame里面要怎么塞区域变量就是看编译器高兴
楼主: ucrxzero (RX-0)   2020-10-25 02:53:00
我看这两天把CSAPP的procedure call看完
作者: Killercat (杀人猫™)   2020-10-27 15:05:00
虽然说这个并没有定义,但是大多数作业系统实作上是一多半使用类似的做法,可以参考这个网址https://tinyurl.com/y5r6tk5cLinux来讲直到2.16都是这样,所以stack/heap喜相逢会碰到一些问题,不过后来有稍微做了些改变不过虽然stack是往下长,但是是先切出一块指定大小空间再把指标订到底部,所以pointer的operation++还是可以正常的做iteration,这是后话...
楼主: ucrxzero (RX-0)   2020-10-29 00:26:00
楼上强强强不过stack跟heap中间应该还有共享库段才对?
作者: Killercat (杀人猫™)   2020-10-29 14:37:00
er...不是强,我想这边大多数人应该认为这个模型是常识所以没有特别提出来而已....只是我突然发现这个模型似乎就是你卡住的点
楼主: ucrxzero (RX-0)   2020-10-29 14:55:00
可是那题台大电机我看大家都没有讲对说才想说顺便来发文
作者: Lipraxde (Lipraxde)   2020-10-29 18:12:00
没人讲对?我看那篇 47 楼的 b 大明明写了“stack是往下长,但local变量摆放顺序C语言规格书没有强制规定”
楼主: ucrxzero (RX-0)   2020-10-29 18:43:00
喔我演残*眼

Links booklink

Contact Us: admin [ a t ] ucptt.com