sliver__

2.8 Supporting Procedures in Computer Hardware 본문

CS/컴퓨터 구조

2.8 Supporting Procedures in Computer Hardware

sliver__ 2023. 10. 21. 05:00
728x90

Procedures는 software에서 abstraction을 구현하는 방법이다.

Procedure의 절차는 아래와 같다.

Procedure 6 steps

Procedure에 사용되는 register는 아래와 같다.

jal : jump and link instruction

ex) jal : PrecedureAddress

link는 return address를 저장을 의미하고 $ra에 저장된다.

 

jr : jump register

ex) jr $ra

Procedure 호출이 끝나고 return address로 돌아간다.

 

Procedure 호출할 때 $a0 - $a3에 파라미터를 저장하고 jal 로 Procedure를 호출한다. 

Procedure의 결과값을 $v0, $v1에 저장하고 jr $ra를 통해 return address로 복귀한다.

Program counter(PC)는 현재 명령어가 실행하고 있는 address를 의미한다.

jal을 호출하면 PC+4 address를 저장한다. Procedure를 호출하는 당시 다음 address+4 위치가 Procedure 수행이 끝나고 수행되어야 하는 위치이기 때문이다.

 

Using More Registers

stack pointer(SP)는 29번.

historical precedent에 따르면 stack는 큰 address에서 작은 address로 커진다.

그러므로 stack으로 push하면 stack pointer는 작은 쪽으로 커지기 때문에 값은 줄어든다.

 

Quiz) 아래 코드를 assembly language로 바꾸면?

int leaf_example (int g, int h, int i, int j) 
{
     int f;
     f = (g + h) – (i + j); 
     return f;
}

==>

addi $sp, $sp, –12  # adjust stack to make room for 3 items 
sw  $t1, 8($sp)     # save register $t1 for use afterwards 
sw  $t0, 4($sp)     # save register $t0 for use afterwards 
sw  $s0, 0($sp)     # save register $s0 for use afterwards

add $t0,$a0,$a1 # register  $t0 contains g + h 
add $t1,$a2,$a3 # register  $t1 contains i + j
sub $s0,$t0,$t1 # f = $t0 – $t1, which is (g + h)–(i + j)

add $v0,$s0,$zero # returns f ($v0 = $s0 + 0)

lw $s0, 0($sp)  # restore register $s0 for caller 
lw $t0, 4($sp)  # restore register $t0 for caller 
lw $t1, 8($sp)  # restore register $t1 for caller 
addi $sp,$sp,12 # adjust stack to delete 3 items

jr   $ra    # jump back to calling routine

 

Nested Procedures

 

Procedure A에서 Procedure B를 호출한다면 Procedure A 호출에 사용했던 register 값을 어딘가에 저장해야 한다.

arugement register($a0 - $a3), temporary register($t0 - $t9), saved register($s0 - $s7), $ra, $sp를 stack에 저장

 

Quiz) 아래 C 코드를 assembly language로 바꾸면?

int fact (int n) 
{
    if (n < 1) return (1);
          else return (n * fact(n – 1)); 
}

==>

fact:
    addi  $sp, $sp, –8 # adjust stack for 2 items 
    sw    $ra, 4($sp)  # save the return address 
    sw    $a0, 0($sp)  # save the argument n
    
slti  $t0,$a0,1     # test for n < 1
beq   $t0,$zero,L1  # if n >= 1, go to L1

addi  $v0,$zero,1 # return 1
addi  $sp,$sp,8   # pop 2 items off stack 
jr    $ra         # return to caller

L1: addi $a0,$a0,–1  # n >= 1: argument gets (n – 1) 
    jal fact         # call fact with (n –1)
    
lw   $a0, 0($sp)  # return from jal: restore argument n 
lw   $ra, 4($sp)  # restore the return address
addi $sp, $sp, 8  # adjust stack pointer to pop 2 items

mul  $v0,$a0,$v0   # return n * fact (n – 1)

jr   $ra           # return to the caller

 

!! static data는 program이 끝날 때 까지 유지되는 데이터이다. MIPS software는 global pointer($gp)에 저장한다.

저장되는 또는 저장되지 않는 register 종류

 

Allocating Space for New Data on the Stack

MIPS memory map

stack pointer는 7fff fffc로 초기화되며 아래로 자란다.

dynamic data는 C malloc에 사용되며 heap이라고 부른다.

text 영역은 0040 0000에서 시작한다.

static data는 1000 0000에서 시작한다.

global data는 1000 8000에서 시작하고 1000 ffff까지 사용된다.

 

MIPS register convention

Register 1번($at)는 assembler가 사용하고, Register 26-27($k0 - $k1)은 Operating system이 사용한다.

728x90
Comments