Previous chapter
Procedure Calling
νλ‘μμ (Procedure)λ μ 곡λλ μΈμμ λ°λΌμ νΉμ μμ
μ μννλ μλΈλ£¨ν΄μ΄λ€.
νλ‘μμ , ν¨μλ νλ‘κ·Έλ¨μ ꡬ쑰ννμ¬ μ΄ν΄νκΈ° μ½κ³ μ¬μ¬μ©ν μ μλλ‘ λ§λλ νμλ€.
β’
μΈμ(parameter)λ νλ‘μμ μ κ°μ 보λ΄κ³ κ²°κ³Όλ₯Ό λ°μμ νλ‘κ·Έλ¨μ λ€λ₯Έ λΆλΆ λ° λ°μ΄ν°μ νλ‘μμ μ¬μ΄μ μΈν°νμ΄μ€ μν μ νλ€.
νλ‘μμ λ μννΈμ¨μ΄μμ μΆμνλ₯Ό ꡬννλ λ°©λ² μ€ νλμ΄λ€.
νλ‘κ·Έλ¨μ΄ νλ‘μμ λ₯Ό μ€νν λλ λ€μκ³Ό κ°μ΄ μ¬μ― λ¨κ³λ₯Ό κ±°μΉλ€.
Six step when Procedure Calling
1.
νλ‘μμ κ° μ κ·Όν μ μλ κ³³μ μΈμλ₯Ό λ£λλ€.
2.
νλ‘μμ λ‘ μ μ΄λ₯Ό λκΈ΄λ€.
3.
νλ‘μμ κ° νμλ‘ νλ λ©λͺ¨λ¦¬ μμμ νλνλ€.
4.
νμν μμ
μ μννλ€.
5.
νΈμΆν νλ‘κ·Έλ¨μ΄ μ κ·Όν μ μλ μ₯μμ κ²°κ³Όκ°μ λ£λλ€.
6.
νλ‘μμ λ νλ‘κ·Έλ¨ λ΄μ μ¬λ¬ κ³³μμ νΈμΆλ μ μμΌλ―λ‘ μλ μμΉλ‘ μ μ΄λ₯Ό λλ €μ€λ€.
λ μ§μ€ν°λ λ°μ΄ν°λ₯Ό μ μ₯νλ κ°μ₯ λΉ λ₯Έμ₯μλ€. λ§μ΄ μ°μ.
MIPSλ νλ‘μμ νΈμΆ κ΄λ‘μ λ°λΌ λ μ§μ€ν°λ₯Ό λ€μκ³Ό κ°μ΄ ν λΉνλ€.
β’
$a0~$a3 : μ λ¬ν μΈμλ₯Ό κ°μ§κ³ μλ μΈμ λ μ§μ€ν° 4κ°
β’
$v0~$v1 : λ°νλλ κ°μ κ°κ² λλ κ° λ μ§μ€ν° 2κ°
β’
$ra : νΈμΆν κ³³μΌλ‘ λλμκ°κΈ° μν λ³΅κ· μ£Όμλ₯Ό κ°μ§κ³ μλ λ μ§μ€ν° 1κ°
λν MIPSλ νλ‘μμ λ₯Ό μν λͺ
λ Ήμ΄λ μ 곡νλλ°, λ°λ‘ jal(jump-and-link)μ΄λ€.
μ§μ λ μ£Όμλ‘ μ νν¨κ³Ό λμμ λ€μ λͺ
λ Ήμ΄μ μ£Όμλ₯Ό $ra λ μ§μ€ν°μ μ μ₯νλ€.
jal ProcedureAddress
Assembly
볡μ¬
$raμ κΈ°μ΅λλ λ§ν¬λ₯Ό 볡κ·μ£ΌμλΌκ³ λΆλ₯Έλ€.
MIPSλ νλ‘μμ μμ 볡κ·ν λ caseλ¬Έ ꡬνμ μ¬μ©νλ jrμ μ΄μ©νλ€.
Example
int leaf_example (int g, int h, int i, int j)
{
int f;
f = (g + h) - (i + j);
return f;
}
C
볡μ¬
μ νλ‘κ·Έλ¨μ λ²μν MIPS μ΄μ
λΈλ¦¬ μ½λλ λ€μκ³Ό κ°λ€.
g, h, i, jλ κ°κ° $a0, $a1, $a2, $a3μ λμλλ€.
leaf_example:
#μ¬μ©ν [μμ]λ μ§μ€ν° ν보 -> μλ κ°μ λ μ§μ€ν°μ μ μ₯νκΈ°
addi $sp, $sp, -12
sw $t2, 8($sp)
sw $t1, 4($sp)
sw $t0, 0($sp)
#λ μ§μ€ν° ν λΉ μλ£! κ³μ° μμ
add $t2, $a0, $a1
add $t1, $a3, $a2
sub $t0, $t2, $t1
#리ν΄
add $v0, $s0, $zero
#λ μ§μ€ν° λ°ν
lw $a0, 0($sp)
lw $a1, 4($sp)
lw $a2, 8($sp)
add $sp, $sp, 12
jr $ra
Assembly
볡μ¬
μ μμ μμ μμ λ μ§μ€ν°λ₯Ό μ¬μ©νλ€. μ€νμ μ΄λκΉμ§ μμλ λ μ§μ€ν°μ κ°μ μ μ₯ν ν, μ¬μ© κΆνμ μ»λλ€. μ΄ν λͺ¨λ κ³μ°μ΄ λλλ©΄ λ μ§μ€ν°μ κ°μ μμνλ‘ λλ리λ μμ
μ μ§ννλ€.
κ·Έλ¬λ, λ§μ½ μ λ μ§μ€ν°λ€μ΄ μ무 κ°μ΄ μλ μνμλ€λ©΄? λ§μ λ μ§μ€ν°λ₯Ό μ¨μΌν κ²½μ° μ€νκ³Ό μκ° λλΉκ° μΌμ΄λ μ μλ€.
μ΄λ₯Ό μλ°©νκΈ° μν΄ MIPSλ λ μ§μ€ν° 18κ°λ₯Ό λ λΆλ₯λ‘ λλλ€.
β’
$t0~t9 : νλ‘μμ νΈμΆ μ, νΌνΈμΆ νλ‘κ·Έλ¨μ΄ κ°μ 보쑴ν΄μ£Όμ§ μλ λ μ§μ€ν°
β’
$s0~s7 : νλ‘μμ νΈμΆ μ νμ κ°μ΄ κ°μμΌ νλ λ μ§μ€ν°
Non-Leaf Procdures
int fact(int n)
{
if(n < 1) return 1;
else return (n * fact(n-1));
}
Assembly
볡μ¬
nν©ν 리μΌμ κ³μ°νλ λ€μ μ¬κ· νλ‘μμ μ ν΄λΉνλ MIPS μ΄μ
λΈλ¦¬ μ½λλ₯Ό 보μ¬λΌ.
μ£Όμ΄μ§ μΈμλ n νλ. $a0μ 맀ννλ€.
fact:
#λ μ§μ€ν° ν λΉ
#μ¬κ·ν¨μλ₯Ό λΆλ₯Ό λ μμ μ΄ μ μ₯ν΄μΌνλ μ 보 : $a0, $ra
add %sp, %sp, -8
sw %ra, 4(%sp) #λ³΅κ· ν¬μΈν° κΈ°μ΅
sw %a0, 0(%sp) #n κΈ°μ΅
#쑰건문
slti %t0, %a0, 1
beq %t0, %zero L1
# n<1
addi %v0, %zero, 1
addi %sp, %sp, 8
jr %ra
L1: add %a0, %a0, -1
jal fact #μ¬κ·
#λ³΅κ· μ§μ
lw %ra, 4(%sp)
lw %a0, 0(%sp)
mul %v0, %v0, %a0
jr %ra
Assembly
볡μ¬
μ‘ΈλΌ κΈ°λ€ μλ³
Stack for New Data
λ μ§μ€ν°μ λ€μ΄κ°μ§ λͺ»ν λ§νΌ ν° λ°°μ΄μ΄λ ꡬ쑰체 κ°μ μ§μ λ³μλ₯Ό μ μ₯νλλ°λ μ€νμ΄ μ¬μ©λκΈ° λλ¬Έμ λ¬Έμ κ° λ³΅μ‘ν΄μ§λ€.
νλ‘μμ μ μ μ₯λ λ μ§μ€ν°μ μ§μ λ³μλ₯Ό κ°μ§κ³ μλ μ€ν μμμ νλ‘μμ νλ μ(procedure frame) λλ μ‘ν°λ² μ΄μ
λ μ½λ(activation record)
MIPSμ λ μ§μ€ν°μλ νλ μν¬μΈν°(frame pointer, $fp)κ° νλ‘μμ νλ μμ 첫λ²μ§Έ μλλ₯Ό κ°λ¦¬ν¨λ€.
μ€ν ν¬μΈν° κ°μ΄ νλ‘μμ λ΄μμλ μΈμ λ μ§ λ€μ΄λλ―Ήνκ² λ°λ μ μλ€.
λ°λΌμ μ€ν ν¬μΈν°μ μ€νμ
μ μ‘κΈ° μ΄λ €μ μ§ λκ° λ§μλ° μ΄λ νλ μν¬μΈν°λ₯Ό μ¬μ©νλ©΄ μ μ μΌλ‘ νλ‘μμ νλ μ μμμ μ°Έμ‘°ν μ μλ€.
Allocation Heap for New Data
λμ€μβ¦ μ‘ΈλΌ νλ€μ΄β¦
Next chapter