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

看板C_and_CPP (C/C++)作者 (RX-0)時間4年前 (2020/10/23 01:00), 4年前編輯推噓4(4032)
留言36則, 7人參與, 4年前最新討論串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, 4年前 , 1F
有組語版嗎?
10/23 01:54, 1F

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

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

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

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

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

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

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

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

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

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

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

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

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

10/23 06:58, 4年前 , 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, 4年前 , 16F
感謝大大
10/23 09:26, 16F

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

10/25 02:53, 4年前 , 36F
我看這兩天把CSAPP的procedure call看完
10/25 02:53, 36F
文章代碼(AID): #1VaRgk9r (C_and_CPP)
文章代碼(AID): #1VaRgk9r (C_and_CPP)