[問題] stack裡變數位址越後定義越高

看板C_and_CPP (C/C++)作者 (RX-0)時間5年前 (2020/10/23 01:00), 5年前編輯推噓5(5052)
留言57則, 8人參與, 最新討論串1/1
開發平台(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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 43.248.19.192 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1603386030.A.275.html

10/23 01:54, 5年前 , 1F
有組語版嗎?
10/23 01:54, 1F

10/23 01:55, 5年前 , 2F
另外我想問為何eax會是0~
10/23 01:55, 2F
※ 編輯: ucrxzero (43.248.19.192 臺灣), 10/23/2020 01:57:45

10/23 02:11, 5年前 , 3F
組語板 asm
10/23 02:11, 3F

10/23 02:12, 5年前 , 4F
發在這也可以吧
10/23 02:12, 4F

10/23 02:12, 5年前 , 5F
我要問位址的問題而已
10/23 02:12, 5F

10/23 02:12, 5年前 , 6F
感謝提供
10/23 02:12, 6F

10/23 02:19, 5年前 , 7F
想到台大電機這題剛好請神人解釋
10/23 02:19, 7F

10/23 02:19, 5年前 , 8F

10/23 02:19, 5年前 , 9F
904.html
10/23 02:19, 9F

10/23 03:22, 5年前 , 10F
順序是未定義的 怎麼長都可以 我記得緩衝區防護
10/23 03:22, 10F

10/23 03:22, 5年前 , 11F
好像有影響 你編譯加個 -fno-stack-protector 試試
10/23 03:22, 11F
加了就往下長欸好神奇喔

10/23 04:22, 5年前 , 12F
然後 %eax 設為 0 就是你的 return 0
10/23 04:22, 12F

10/23 06:58, 5年前 , 13F
怎麼 return value 可以參考 System V ABI 裡的 Parame
10/23 06:58, 13F

10/23 06:58, 5年前 , 14F
ter Passing,不同的 return type 有不同的傳法,屬於
10/23 06:58, 14F

10/23 06:58, 5年前 , 15F
integer 的是用 rax、rdx return
10/23 06:58, 15F
※ 編輯: ucrxzero (43.248.19.192 臺灣), 10/23/2020 09:15:28

10/23 09:26, 5年前 , 16F
感謝大大
10/23 09:26, 16F

10/23 09:45, 5年前 , 17F
所以結論是往上往下都可 heap是只能往上
10/23 09:45, 17F

10/23 09:45, 5年前 , 18F
回傳值是給eax用的這樣嗎
10/23 09:45, 18F

10/23 09:46, 5年前 , 19F
不過直觀感覺往上長才會溢位需要保護 反而要保護往下長
10/23 09:46, 19F

10/23 09:47, 5年前 , 20F
我看來要多看書
10/23 09:47, 20F

10/23 11:49, 5年前 , 21F
應該是要看進出 function 時 stack pointer 的變化,st
10/23 11:49, 21F

10/23 11:49, 5年前 , 22F
ack 應該還是往下長的
10/23 11:49, 22F

10/23 11:54, 5年前 , 23F
CSAPP上說return address是%rbp+4原來是eax
10/23 11:54, 23F

10/23 11:54, 5年前 , 24F
感謝大大
10/23 11:54, 24F

10/23 14:06, 5年前 , 25F
呃, 不對; eax 和 return address 是不同的東西
10/23 14:06, 25F

10/23 14:07, 5年前 , 26F
eax 是回傳的值, return address 是回去的程式位址
10/23 14:07, 26F

10/23 14:07, 5年前 , 27F
硬要說的話後者是 return 0 的 return, 前者是 0
10/23 14:07, 27F

10/23 19:40, 5年前 , 28F
這篇真多寶藏
10/23 19:40, 28F

10/23 21:50, 5年前 , 29F
往上往下通常用在記憶體空間的擴增方向不太會用在區域
10/23 21:50, 29F

10/23 21:50, 5年前 , 30F
變數的賦值順序...
10/23 21:50, 30F

10/23 23:27, 5年前 , 31F
我想也是
10/23 23:27, 31F

10/23 23:28, 5年前 , 32F
heap 是用best fit 用過的可能還會釋放或GC後重新分配
10/23 23:28, 32F

10/23 23:28, 5年前 , 33F
不一定只會往上
10/23 23:28, 33F

10/24 21:06, 5年前 , 34F
你看movl塞的offset都是負的 所以stack是往低位長
10/24 21:06, 34F

10/24 21:08, 5年前 , 35F
至於stack frame裡面要怎麼塞區域變數就是看編譯器高興
10/24 21:08, 35F

10/25 02:53, 5年前 , 36F
我看這兩天把CSAPP的procedure call看完
10/25 02:53, 36F

10/27 15:05, , 37F
雖然說這個並沒有定義,但是大多數作業系統實作上是一
10/27 15:05, 37F

10/27 15:06, , 38F
多半使用類似的做法,可以參考這個網址
10/27 15:06, 38F

10/27 15:06, , 39F

10/27 15:06, , 40F
Linux來講直到2.16都是這樣,所以stack/heap喜相逢會
10/27 15:06, 40F

10/27 15:06, , 41F
碰到一些問題,不過後來有稍微做了些改變
10/27 15:06, 41F

10/27 15:08, , 42F
不過雖然stack是往下長,但是是先切出一塊指定大小空間
10/27 15:08, 42F

10/27 15:08, , 43F
再把指標訂到底部,所以pointer的operation++還是可以
10/27 15:08, 43F

10/27 15:08, , 44F
正常的做iteration,這是後話...
10/27 15:08, 44F

10/29 00:26, , 45F
樓上強強強
10/29 00:26, 45F

10/29 03:29, , 46F
不過stack跟heap中間應該還有共享庫段才對?
10/29 03:29, 46F

10/29 14:37, , 47F
er...不是強,我想這邊大多數人應該認為這個模型是常識
10/29 14:37, 47F

10/29 14:37, , 48F
所以沒有特別提出來而已....
10/29 14:37, 48F

10/29 14:38, , 49F
只是我突然發現這個模型似乎就是你卡住的點
10/29 14:38, 49F

10/29 14:55, , 50F
可是那題台大電機我看大家都沒有講對說
10/29 14:55, 50F

10/29 14:55, , 51F
才想說順便來發文
10/29 14:55, 51F

10/29 18:12, , 52F
沒人講對?我看那篇 47 樓的 b 大明明寫了「stack是往
10/29 18:12, 52F

10/29 18:12, , 53F
下長,但local變數擺放順序C語言規格書沒有強制規定」
10/29 18:12, 53F

10/29 18:43, , 54F
喔我演殘
10/29 18:43, 54F

10/29 18:43, , 55F
*眼
10/29 18:43, 55F

10/30 18:29, , 56F
補充一下因為我翻CSAPP的時候他直接這樣舉例我才誤會
10/30 18:29, 56F

10/30 18:29, , 57F
有兩點 這本不是新手看 或是我太爛
10/30 18:29, 57F
CSAPP 3.12 完美解決這個疑問了QQ ※ 編輯: ucrxzero (43.248.19.192 臺灣), 10/31/2020 23:46:10
文章代碼(AID): #1VaRgk9r (C_and_CPP)
文章代碼(AID): #1VaRgk9r (C_and_CPP)