Search
πŸ’Ώ

Lecture 07 : 2.8

course
last review
2023/04/11
mastery
rookie
progress
not started
date
2023/04/03
4 more properties
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