일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- align-items
- dataframe
- Flexbox
- Javascript
- 강화학습
- Prefix Sums
- Design Pattern
- Gap
- 알고리즘
- c
- 상태
- CSS
- 통신사할인
- margin
- Photoshop
- 확률
- stl
- spring
- 포토샵
- grid
- 백준
- 소수
- Codility
- SK바이오사이언스
- 에라토스테네스의 체
- 수학
- series
- pandas
- c++
- skt membership
- Today
- Total
sliver__
2.8 Supporting Procedures in Computer Hardware 본문
Procedures는 software에서 abstraction을 구현하는 방법이다.
Procedure의 절차는 아래와 같다.
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)에 저장한다.
Allocating Space for New Data on the Stack
stack pointer는 7fff fffc로 초기화되며 아래로 자란다.
dynamic data는 C malloc에 사용되며 heap이라고 부른다.
text 영역은 0040 0000에서 시작한다.
static data는 1000 0000에서 시작한다.
global data는 1000 8000에서 시작하고 1000 ffff까지 사용된다.
Register 1번($at)는 assembler가 사용하고, Register 26-27($k0 - $k1)은 Operating system이 사용한다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
2.10 MIPS Addressing for 32-bit immediates and Addresses (1) | 2023.10.21 |
---|---|
2.9 Communicating with People (0) | 2023.10.21 |
2.7 Instructions for Making decision (0) | 2023.10.20 |
2.6 Logical Operations (0) | 2023.10.20 |
2.5 Representing Instruction in the Computer (1) | 2023.10.20 |