๐ง ํ๋ก์์ (procedure)
ํ๋ก์์ ๋ ํจ์๋ ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ํ๋ก์์ ๋ฅผ ์คํํ ๋์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฏ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
1. ํ๋ก์์ ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ณณ์ ์ธ์๋ฅผ ๋ฃ๋๋ค. ( x10 - x17 ๋ ์ง์คํฐ ์ฌ์ฉ )
2. ํ๋ก์์ ๋ก ์ ์ด๋ฅผ ๋๊ธด๋ค. ( jal x1, ProcedureAddress ๋ช ๋ น์ด ์ฌ์ฉ )
3. ํ๋ก์์ ๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ํ๋ํ๋ค.
4. ํ์ํ ์์ ์ ์ํํ๋ค.
5. ํธ์ถํ ํ๋ก๊ทธ๋จ์ด ์ ๊ทผํ ์ ์๋ ์ฅ์์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ๋๋ค. ( x10 - x17 ๋ ์ง์คํฐ ์ฌ์ฉ )
6. ํ๋ก์์ ๋ ํ๋ก๊ทธ๋จ ๋ด์ ์ฌ๋ฌ ๊ณณ์์ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก, ์๋ ์์น๋ก ์ ์ด๊ถ์ ๋๋ ค์ค๋ค. ( jalr x0, 0(x1) )
(์ฐธ๊ณ ๋ก x0์ ์์ 0์ด ๋ค์ด์๋ ๋ ์ง์คํฐ์ ๋๋ค.)
๋ ์ง์คํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์ฅ์์ด๋ฏ๋ก, ๊ฐ๋ฅํ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
๊ทธ๋ก๋ฏ๋ก RISC-V ์ํํธ์จ์ด๋ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋ ๋ค์์ ๋ ์ง์คํฐ ํ ๋น ๊ด๋ก๋ฅผ ๋ฐ๋ฆ ๋๋ค.
x10 - x17 : ์ ๋ฌํ ์ธ์์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์ธ์ ๋ ์ง์คํฐ 8๊ฐ
x1 : ํธ์ถํ ๊ณณ์ผ๋ก ๋๋์๊ฐ๊ธฐ ์ํ ๋ณต๊ท ์ฃผ์(return address)๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ ์ง์คํฐ 1๊ฐ
RISC-V ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ ์ด๋ ๊ฒ ํ๋ก์์ ๋ฅผ ์ํด ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ ๋ฟ ์๋๋ผ, ํ๋ก์์ ๋ฅผ ์ํ ๋ช ๋ น์ด๋ ์ ๊ณตํฉ๋๋ค.
์ด์ ๋ถํฐ ์ด๋ฌํ ๋ช ๋ น์ด๋ค์ ๋ํด ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง jal (jump-and-link) ๋ช ๋ น์ด
ํ๋ก์์ ํธ์ถ์ ์ํด ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ก
์ง์ ๋ ์ฃผ์๋ก ๋ถ๊ธฐํ๋ ๋์์, ๋ณต๊ทํ ๋ค ์คํํ ๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๋ชฉ์ ์ง ๋ ์ง์คํฐ rd ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ jal (jump and link) ๋ช ๋ น์ด๋ผ ๋ถ๋ฆ ๋๋ค.
(link๋ ํ๋ก์์ ์ข ๋ฃ ํ ์ฌ๋ฐ๋ฅธ ์ฃผ์๋ก ๋์์ฌ ์ ์๋๋ก ํธ์ถํ ๊ณณ๊ณผ ํ๋ก์์ ์ฌ์ด์ ๋งํฌ๋ฅผ ํ์ฑํ๋ค๋ ๋ป์ ๋๋ค.)
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
jal x1, ProcedureLabel
์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ณต๊ทํ ๋ค ์คํํ ๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ x1 ๋ ์ง์คํฐ์ ๋ฃ์ด์ค๋๋ค.
ํด๋น ์ฃผ์๋ฅผ ๋ณต๊ท ์ฃผ์(return address)๋ผ ๋ถ๋ฆ ๋๋ค.
๐ง jalr (jump-and-link-register) ๋ช ๋ น์ด
ํ๋ก์์ ์์ ๋ณต๊ทํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ช ๋ น์ด์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
jalr x0, 0(x1)
์ ๋ช ๋ น์ด๋ ๋ ์ง์คํฐ x1์ ์ ์ฅ๋์ด ์๋ ์ฃผ์๋ก ๋ถ๊ธฐํ๋ผ๋ ๋ป์ ๋๋ค.
ํธ์ถ ํ๋ก๊ทธ๋จ์ x10 - x17 ๋ ์ง์คํฐ์ ์ ๋ฌํ ์ธ์๊ฐ์ ๋ฃ์ ํ,
jal x1, Procedure ๋ช ๋ น์ ์ด์ฉํด์ ํ๋ก์์ Procedure(ํผํธ์ถ ํ๋ก๊ทธ๋จ์ด๋ผ ๋ถ๋ฆ ๋๋ค)๋ก ๋ถ๊ธฐํฉ๋๋ค.
ํผํธ์ถ ํ๋ก๊ทธ๋จ์ ๊ณ์ฐ์ ๋๋ธ ํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ์ธ์ ๋ ์ง์คํฐ์ ๋ฃ์ ํ
jalr x0, 0(x1) ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ณต๊ทํฉ๋๋ค.
๋ด์ฅ ํ๋ก๊ทธ๋จ ๊ฐ๋ ์ ํ์ฌ ์ํ์ค์ธ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๋ ๋ ์ง์คํฐ๋ฅผ ํ์๋ก ํฉ๋๋ค.
์ด ๋ ์ง์คํฐ๊ฐ ๋ฐ๋ก PC(program counter)์ ๋๋ค.
jal ๋ช ๋ น์ ํ๋ก์์ ์์ ๋ณต๊ทํ ๋ ๋ค์ ๋ช ๋ น์ด๋ถํฐ ์คํํ๋๋ก PC + 4๋ฅผ ๋ชฉ์ ์ง ๋ ์ง์คํฐ์ ์ ์ฅํฉ๋๋ค.
๐ง ๋ง์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์ปดํ์ผ๋ฌ๊ฐ ํ๋ก์์ ๋ฅผ ๋ฒ์ญํ ๋, ์ธ์ ๋ ์ง์คํฐ 8๊ฐ( x10 - x17 )๋ง์ผ๋ก๋ ๋ถ์กฑํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
ํ๋ก์์ ํธ์ถ์ด ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์ณ์๋ ์๋๊ธฐ ๋๋ฌธ์,
ํธ์ถ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ ์ง์คํฐ๋ ๋ณต๊ทํ๊ธฐ ์ ์ ํ๋ก์์ ํธ์ถ ์ ์ ์ํ๋ก ๋๋๋ ค ๋์์ผ ํฉ๋๋ค.
์ด ์ํฉ์ ์ด์ ๊ธ ์์ ์ค๋ช ํ ๋ ์ง์คํฐ ์คํ๋ง์ด ํ์ํ ๊ฒฝ์ฐ์ ๋๋ค.
๋ ์ง์คํฐ ์คํ๋ง์ ์ด์์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ ์คํ์ ๋๋ค.
์คํ์ ๋์ค์ ๋ค์ด๊ฐ ๊ฒ์ด ๋จผ์ ๋์ค๋ ์๋ฃ๊ตฌ์กฐ๋ก์จ,
์คํ์๋ ๋ค์ ํ๋ก์์ ๊ฐ spillํ ๋ ์ง์คํฐ๋ฅผ ์ ์ฅํ ์ฅ์๋ ๋ ์ง์คํฐ์ ์๋ ๊ฐ์ด ์ ์ฅ๋ ์ฅ์๋ฅผ ํ์ํ๊ธฐ ์ํด ์ต๊ทผ์ ํ ๋น๋ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ํ์ํฉ๋๋ค.
RISC-V ์์ ์คํ ํฌ์ธํฐ๋ ๋ ์ง์คํฐ x2์ด๋ฉฐ, sp๋ก๋ ๋ถ๋ฆฝ๋๋ค.
ํด๋น ์คํ ํฌ์ธํฐ(stack pointer)๋ ๋ ์ง์คํฐ ํ๋๊ฐ ์คํ์ ์ ์ฅ๋๊ฑฐ๋ ์คํ์์ ๋ณต๊ตฌ๋ ๋๋ง๋ค 8์ฉ(32๋นํธ ์ปดํจํฐ์ ๊ฒฝ์ฐ 4์ฉ) ์กฐ์ ๋ฉ๋๋ค.
์คํ์ ๋์ ์ฃผ์์์ ๋ฎ์ ์ฃผ์ ์ชฝ์ผ๋ก '์ฑ์ฅ'ํฉ๋๋ค.
๋ฐ๋ผ์ ์คํ์ pushํ ๋์๋ ์คํ ํฌ์ธํฐ ๊ฐ์ ๊ฐ์์์ผ์ผ ํ๊ณ ,
์คํ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ๊ฒฝ์ฐ์๋ ์คํ ํฌ์ธํฐ ๊ฐ์ ์ฆ๊ฐ์์ผ์ผ ํฉ๋๋ค.
โญ๏ธ ์์ 1 - ๋ค๋ฅธ ํ๋ก์์ ๋ฅผ ํธ์ถํ์ง ์๋ C ํ๋ก์์ ์ ์ปดํ์ผ
๋ค๋ฅธ ํ๋ก์์ ๋ฅผ ํธ์ถํ์ง ์๋ ํ๋ก์์ ๋ฅผ ๋ง๋จ(leaf) ํ๋ก์์ ๋ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ C์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
long long leaf_example (long long g, h, i, j)
{
long long f;
f = (g + h) - (i + j);
return f;
}
์ ์ฝ๋์์ ๋ ์ง์คํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ธ์ g, h, i, j๋ x10, x11, x12, x13์ ํ ๋น๋ฉ๋๋ค.
- ์ง์ญ๋ณ์ f๋ x20 ๋ ์ง์คํฐ์ ํ ๋น๋ฉ๋๋ค.
- ํผํธ์ถ์๋ x20์ ์คํ์ ์ ์ฅํด ์ฃผ์ด์ผ ํฉ๋๋ค.
- ํธ์ถ์์์ x20์ ์ฌ์ฉํ๊ณ ์์์ ์๋ ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ณด์กด์์ผ ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์ ๋ ์ง์คํฐ๋ก๋ x5, x6 ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- x5 - x7์ ์์ ๋ ์ง์คํฐ๋ก์จ, ํผํธ์ถ์์์ ๋ณด์กดํด์ค ํ์๊ฐ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ x10์ ์ ์ฅ๋ฉ๋๋ค.
์ด์ ๋ธ๋ฆฌ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
addi sp, sp, -8 //์คํ์ x20์ ์ ์ฅํ๊ธฐ ์ํด 1์นธ์ ๊ณต๊ฐ์ด ํ์ํ๋ฉฐ, ๋ฐ๋ผ์ 8๋ฐ์ดํธ์ ๊ณต๊ฐ์ ๋๋ ค์ค๋๋ค(-8)
sd x20, 0(sp) // ํธ์ถ์์์ ์ฌ์ฉํ x20๋ ์ง์คํฐ์ ๋ค์ด์๋ ๊ฐ์ ์คํ์ ์ ์ฅํฉ๋๋ค. x20์ 8๋ฐ์ดํธ์ด๋ฏ๋ก 0(sp)์์ 8(sp)๋งํผ์ ๊ณต๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
add x5, x10, x11 // ์์ ๋ ์ง์คํฐ x5์ g + h ์ ์ฅ
add x6, x12, x13 // ์์ ๋ ์ง์คํฐ x6์ i + j ์ ์ฅ
sub x20, x5, x6 // f = x5 - x6
addi x10, x20, 0 // ๊ฒฐ๊ณผ๋ x10์ ๋ด๊ธฐ๋ฏ๋ก x20์ 0์ ๋ํ ๊ฐ์ x10์ ์ ์ฅํฉ๋๋ค.
ld x20, 0(sp) // ํธ์ถ์์์ x20๋ ์ง์คํฐ์ ํ ๋นํ์๋ ๊ฐ์ ๋ณต๊ตฌํฉ๋๋ค.
addi sp, sp, 8 // ๋๋ ธ๋ ์คํ์ ๊ณต๊ฐ์ ์ค์
๋๋ค.
jalr x0, 0(x1) // ๋ณต๊ท ์ฃผ์๋ก ๋ณต๊ทํฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ํ๋ก์์ ํธ์ถ ์ ํ์, ํ๋ก์์ ์คํ ์ค์ด ์คํ ์ํ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ ๋๋ค.
์ด์ ๊ธ ์์ ์ดํด๋ณธ ๋ฐ์ ๊ฐ์ด RISC-V ์ํํธ์จ์ด๋ ๋ ์ง์คํฐ ์ฃผ์์ ๋ํ Convention์ ๋ค์๊ณผ ๊ฐ์ด ์ ํ์์ต๋๋ค.
x5 - x7, x28 - x31 : ํ๋ก์์ ํธ์ถ ์, ํผํธ์ถ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ๋ณด์กดํด์ฃผ์ง ์๋ ๋ ์ง์คํฐ
x8 - x9, x18 - x27 : ํ๋ก์์ ํธ์ถ ์ ๊ณผ ํ์ ๊ฐ์ด ๊ฐ๊ฒ ์ ์ง๋์ด์ผ ํ๋ ์ ์ฅ ๋ ์ง์คํฐ
(ํผํธ์ถ ํ๋ก๊ทธ๋จ์ด ์ด ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋ ๊ฐ์ ์ ์ฅํ๋ค๊ฐ ์์ ๋ณต๊ตฌํด์ผ ํฉ๋๋ค.)
์ด๋ฌํ ๊ฐ๋จํ ๊ด๋ก๋ฅผ ์ ํจ์ผ๋ก์จ ๋ ์ง์คํฐ ์คํ๋ง์ ๋ง์ด ์ค์ผ ์ ์์ต๋๋ค.
โญ๏ธ ์์ 2 - ๋ค๋ฅธ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ C ํ๋ก์์ ์ ์ปดํ์ผ
๋ง๋จ ํ๋ก์์ ๊ฐ ์๋ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, ์๊ฐํด ์ฃผ์ด์ผ ํ ๊ฒ๋ค์ด ๋ง์์ง๋๋ค.
์๋ฅผ ๋ค์ด main ํ๋ก๊ทธ๋จ์ด ํ๋ผ๋ฏธํฐ(์ธ์)๊ฐ 3์ ๊ฐ์ง๊ณ ํ๋ก์์ A๋ฅผ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ด๋ ๋ ์ง์คํฐ x10(์ธ์ ๋ ์ง์คํฐ)์ 3์ ๋ฃ์ ํ jal x1, A ๋ช ๋ น์ ์คํํ ๊ฒ์ ๋๋ค.
ํ๋ก์์ A์์๋ ๋ค์ ์ธ์ 7์ ๋ ์ง์คํฐ x10์ ๋ฃ๊ณ , jal x1, B๋ฅผ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์์ง A๊ฐ ๋ค ๋๋์ง ์์ ์ํ์์ x10์ ์๋ก์ด ๊ฐ์ ๋ฃ์ด์ฃผ์๊ธฐ์,
x10์์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ 3์ ๊ฐ์ด ์ฌ๋ผ์ง๊ณ 7๋ก ๋ฎ์ด์์์ง๋๋ค. (์ถฉ๋ ๋ฐ์)
๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์ง์คํฐ x1์๋ ๋์๊ฐ main ํ๋ก๊ทธ๋จ์ ์ฃผ์๊ฐ ์๋ Aํ๋ก์์ ์ ์ฃผ์๊ฐ ๋ด๊ฒจ์์ผ๋ฏ๋ก,
B๊ฐ ๋ฆฌํด๋ ์ดํ A์์ main ํ๋ก๊ทธ๋จ์ผ๋ก ๋์๊ฐ ๋ฐฉ๋ฒ์ด ์ฌ๋ผ์ง๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ฅ ๋ ์ง์คํฐ์์ ํ๋ ๊ฒ์ฒ๋ผ
๊ฐ์ด ๋ณด์กด๋์ด์ผ ํ ๋ชจ๋ ๋ ์ง์คํฐ๋ฅผ ์คํ์ ๋ฃ๋ ๊ฒ์ ๋๋ค.
ํธ์ถ ํ๋ก๊ทธ๋จ์ ์ธ์ ๋ ์ง์คํฐ(x10 - x17)์, ์์ ๋ ์ง์คํฐ (x5 - x7๊ณผ x28 - x31) ์ค
ํ๋ก์์ ํธ์ถ ์ดํ์๋ ๊ณ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ๋ชจ๋ ์คํ์ ๋ฃ์ต๋๋ค.
ํผํธ์ถ ํ๋ก๊ทธ๋จ์ ๋ณต๊ท ์ฃผ์ ๋ ์ง์คํฐ x1๊ณผ, ์ ์ฅ ๋ ์ง์คํฐ (x8 - x9์ x18 - x27) ์ค
ํผํธ์ถ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ๋ ์ง์คํฐ๋ฅผ ๋ชจ๋ ์ ์ฅํฉ๋๋ค.
์คํ ํฌ์ธํฐ๋ ์คํ์ ์ ์ฅ๋๋ ๋ ์ง์คํฐ ๊ฐ์์ ๋ง์ถ์ด ์กฐ์ ๋ฉ๋๋ค.
๋ณต๊ทํ ๋์๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ๊บผ๋ด ๋ ์ง์คํฐ๋ฅผ ์์ ๋ณต๊ตฌํ๊ณ ์ด์ ๋ง์ถ์ด ์คํ ํฌ์ธํฐ๋ฅผ ๋ค์ ์กฐ์ ํฉ๋๋ค.
์์ C ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
long long fact(long long n)
{
if (n < 1) return 1;
else return n * fact(n - 1);
}
๋ ์ง์คํฐ ํ ๋น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
- ์ธ์ n์ x10
- ๊ฒฐ๊ณผ๋ x10์ ์ ์ฅ๋ฉ๋๋ค.
๋ฒ์ญ๋ ์ด์ ๋ธ๋ฆฌ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
addi sp, sp, -16 // ๋ณต๊ท ์ฃผ์(x1)์ ์ธ์ n (x10)๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ 2์นธ ํ ๋น
sd x1, 8(sp) // ๋ณต๊ท ์ฃผ์๋ฅผ ์คํ์ ์ ์ฅ
sd x10, 0(sp) // ์ธ์ n์ ์ ์ฅ
// if(n < 1)์ if(n - 1 < 0) ๊ณผ ๋์ผํ๋ฉฐ, 0์ ๊ฐ์ x0์ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก ์ด์ ๊ฐ์ด ๋ฐ๊พธ๋ ๊ฒ์ด ๋ ๋น ๋ฆ
๋๋ค.
addi x5, x10, -1 // x5 = n - 1 ์ ์ ์ฅ
bge x5, x0, L1 // n-1(x5) >= 0(x0)์ธ ๊ฒฝ์ฐ L1์ผ๋ก ์ด๋
addi x10, x0, 1 // ๊ฒฐ๊ณผ๋ 1 (n-1 < 0์ธ ๊ฒฝ์ฐ์ด๋ค.)
// ld x10, 0(sp)
// ld x1, 8(sp)
// ์ ๋ ์ฝ๋๋ ํ์ ์๋๋ฐ, ์ด์ ๋ ๋์ด์์ procedure ํธ์ถ ์์ด return ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ์ฅํ์ง ์์๋ ๋ฉ๋๋ค.
// ์ฆ Leaf Procedure์ ๋์ผํฉ๋๋ค.
addi sp, sp, 16 // ํ ๋น๋ ์คํ ๋ฐํ
jalr x0, 0(x1) //return
L1:
addi x10, x10, -1 // n = n - 1
jal x1, fact // ์ฌ๊ท ํธ์ถ
addi x6, x10, 0 // ๊ฒฐ๊ณผ๋ฅผ x6์ผ๋ก ์ด๋
ld x10, 0(sp) // ํธ์ถ์์์ ์ฌ์ฉํด์ผ ํ๋ ์ธ์๊ฐ(n) ๋ณต๊ตฌ
ld x1, 8(sp) // ํธ์ถ์์์ ์ฌ์ฉํด์ผ ํ๋ ๋ณต๊ท ์ฃผ์(x1) ๋ณต๊ตฌ
addi sp, sp, 16 // ์คํ ๊ณต๊ฐ ๋ฐ๋ฉ
mul x10, x10, x6 // result is n * fact(n-1)
jalr x0, 0(x1) // return
๐ง ์ ์ญ ํฌ์ธํฐ (global pointer)
C ๋ณ์๋ ๊ธฐ์ต ์ฅ์น์ ํ ์ฅ์์ ํด๋นํฉ๋๋ค.
์ฌ๊ธฐ์ ๊ธฐ์ต๋ ๋ด์ฉ์ ์ด๋ป๊ฒ ํด์ํ๋๊ฐ๋ ๋ฐ์ดํฐํ(Type)๊ณผ ์ ์ฅ ์ ํ(storage class)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋ฐ์ดํฐํ์ ์๋ก๋ ์ ์ํ, ๋ฌธ์ํ ๋ฑ์ด ์์ต๋๋ค.
C์๋ ์๋(automatic)๊ณผ ์ ์ (static) ๋๊ฐ์ง ์ ์ฅ ์ ํ์ด ์์ต๋๋ค.
์๋ ๋ณ์๋ ํ๋ก์์ ๋ด์์๋ง ์ ์๋๋ ๊ฒ์ผ๋ก ํ๋ก์์ ๊ฐ ์ข ๋ฃ๋๋ฉด ์์ด์ง๋๋ค.
์ ์ ๋ณ์๋ ํ๋ก์์ ๋ก ๋ค์ด๊ฐ ํ๋ ํ๋ก์์ ์์ ๋น ์ ธ๋์จ ํ์๋ ๊ณ์ ์กด์ฌํฉ๋๋ค.
๋ชจ๋ ํ๋ก์์ ์ ์ธ๋ถ์์ ์ ์ธ๋ C ๋ณ์๋ ์ ์ ๋ณ์๋ก ๊ฐ์ฃผ๋๋ฉฐ, static์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ธ๋ ๋ณ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๊ทธ ๋๋จธ์ง๋ ๋ชจ๋ ์๋ ๋ณ์์ ๋๋ค.
์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ์ด๋ค RISC-V ์ปดํ์ผ๋ฌ๋ x3์ ์ ์ญ ํฌ์ธํฐ(global pointer, gp)๋ก ์ฌ์ฉํฉ๋๋ค.
์๋ ํ๋ ํ๋ก์์ ํธ์ถ ์ ํ์ ๊ฐ ๋ณด์กด ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ณด์กด๋๋ ๊ฒ | ๋ณด์กด๋์ง ์๋ ๊ฒ |
Saved registers : x8 - x9, x18 - x27 | Temporary registers : x5 - x7, x28 - x31 |
Stack pointer register : x2 (sp) | Argument/result. registers : x10 - x17 |
Frame pointer register : x8 (fp) | |
Return address registers : x1 (ra) | |
Stack above the Stack pointer(์คํ ํฌ์ธํฐ ์์ ์กด์ฌํ๋ ์คํ) | Stack below the Stack pointer(์คํ ํฌ์ธํฐ ์๋์ ์กด์ฌํ๋ ์คํ) |
( ์ ์ญ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ์ญ ํฌ์ธํฐ๋ ๋ณด์กด๋์ง๋ง, ์ด๋ ๋ค์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค :D )
๐ง ์คํ ๊ณต๊ฐ์ ํ ๋น
๋ ์ง์คํฐ์ ๋ค์ด๊ฐ์ง ๋ชปํ ๋งํผ ํฐ ๋ฐฐ์ด์ด๋ ๊ตฌ์กฐ์ฒด ๊ฐ์ ์ง์ญ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๋ฐ์๋ ์คํ์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ณต์กํด์ง๋๋ค.
ํ๋ก์์ ์ ์ ์ฅ(saved) ๋ ์ง์คํฐ์ ์ง์ญ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ง๊ณ ์๋ ์คํ ์์ญ์ ํ๋ก์์ ํ๋ ์(procedure frame) ๋๋ ์คํ ํ๋ ์(stack frame) ๋๋ ์กํฐ๋ฒ ์ด์ ๋ ์ฝ๋(activation record)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ํ๋ก์์ ํธ์ถ ์ , ์ค, ํ์ ์คํ ์ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ด๋ค RISC-V ์ปดํ์ผ๋ฌ๋ ํ๋ ์ ํฌ์ธํฐ(fp), ์ฆ ๋ ์ง์คํฐ x8์ด ํ๋ก์์ ํ๋ ์์ ์ฒซ ๋ฒ์งธ ์๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
์คํ ํฌ์ธํฐ์ ๊ฐ์ด ํ๋ก์์ ๋ด์์ ๋ฐ๋ ์๋ ์์ผ๋ฏ๋ก,
๋ฉ๋ชจ๋ฆฌ ๋ด ์ง์ญ ๋ณ์์ ๋ํ ๋ณ์(offset)๋ ๋ณ์๊ฐ ํ๋ก์์ ์ด๋ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ด๋ฐ ์ด์ ๋ก ํ๋ก์์ ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ๋ ์ด๋ ค์์ง๋๋ค.
๋ฐ๋ฉด์ ํ๋ ์ ํฌ์ธํฐ๋ ๋ณํ์ง ์๋ ๋ฒ ์ด์ค ๋ ์ง์คํฐ ์ญํ ์ ํ๋ฏ๋ก, ์ด๋ฅผ ์ด์ฉํ๋ฉด ์ง์ญ๋ณ์ ์ฐธ์กฐ๊ฐ ๊ฐ๋จํด์ง๋๋ค.
๋ณ๋์ ํ๋ ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋, ์กํฐ๋ฒ ์ด์ ๋ ์ฝ๋๋ ํญ์ ์คํ์ ์กด์ฌํฉ๋๋ค.