๐Ÿงฑ ์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ (Stack Frame & ABI)

Phase 1
์ธ์ž ์ „๋‹ฌ (Args)
Phase 2
CALL (RET ํ‘ธ์‹œ)
Phase 3
ํ”„๋กค๋กœ๊ทธ (SFP/RSP)
Phase 4
์ง€์—ญ ๋ณ€์ˆ˜ ๊ณต๊ฐ„
Phase 5
์—ํ•„๋กœ๊ทธ (LEAVE/RET)
โ–ฒ High Memory (์ƒ์œ„ ์ฃผ์†Œ)
Caller Stack Frame
ํ˜ธ์ถœ์ž ์Šคํƒ (7๋ฒˆ์งธ ์ดํ›„ ์ดˆ๊ณผ ์ธ์ž ๋“ฑ)
+0x18(%rbp)
Return Address (RET)
ํ˜ธ์ถœ์ž๋กœ ๋ณต๊ท€ํ•  ๋ช…๋ น์–ด ํฌ์ธํ„ฐ (RIP)
+0x08(%rbp)
Saved Frame Pointer (SFP)
์ด์ „ ํ•จ์ˆ˜์˜ RBP ๋ฐฑ์—… ๊ฐ’
0x00(%rbp)
Local Buffer [char buf[32]]
์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐ ๋ฐฐ์—ด (๋‚ฎ์€ ์ฃผ์†Œ๋กœ ํ• ๋‹น)
-0x20(%rbp)
Local Variables (uint64_t val)
RSP๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ˜„์žฌ ์Šคํƒ ์ตœํ•˜๋‹จ
(%rsp)
โ–ผ Low Memory (ํ•˜์œ„ ์ฃผ์†Œ - RSP๊ฐ€ ์•„๋ž˜๋กœ ์ž๋žŒ)

โš–๏ธ x86_64 vs ARM64 ํ˜ธ์ถœ ๊ทœ์•ฝ(Calling Convention)

๊ตฌ๋ถ„ x86_64 (System V AMD64 ABI) ARM64 (AAPCS64)
๋ ˆ์ง€์Šคํ„ฐ ์ธ์ž RDI, RSI, RDX, RCX, R8, R9 (์ด 6๊ฐœ) X0 ~ X7 (์ด 8๊ฐœ)
์ดˆ๊ณผ ์ธ์ž ์Šคํƒ์— ์—ญ์ˆœ์œผ๋กœ PUSH ์Šคํƒ์— ์—ฐ์† ์ €์žฅ
๋ฐ˜ํ™˜ ์ฃผ์†Œ ๋ณด๊ด€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— PUSH (CALL ๋ช…๋ น) ๋งํฌ ๋ ˆ์ง€์Šคํ„ฐ LR (X30)์— ์ €์žฅ (BL ๋ช…๋ น)
ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ RBP (๊ธฐ๋ณธ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ) X29 (FP)