[問題] 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