컴퓨터 구조 3

강한친구·2021년 9월 22일
0

Computer Architecture

목록 보기
3/12

Pseduo Instructions

Slt bne beg 실제적으로 하드웨어에 정의가 되어있음
Ble blt bgt bge -> Pseudo instructions

모든 연산은 ALU를 거치도록 되어있음 따라서 단순 move같은 명령은 없음. 이에 기존에 있는 path를 이용해서 move 시킴

MIPS Addressing Modes

Operands in instructions itself

직접 어드레싱 immediate addressing

  • op rs rt Immediate <- 명령어 안에 들어있는 값 자체가 연산

Operand in Register

  • Regitser Addressing
    op rs rt rd – funct <- 명령어 안에 들어있는 어떤 것이 가르키는 regitser 값

Operand in Memory

  • Base Addressing
    op rs rt Address
    rs 의 register + address => meemory [word]
    • 베이스 어드레싱은
      컨디셔널 브랜치, Uncon 브랜치로 갈린다.

Instruction in memory

Conditional branching

  • op rs rt address (레지스터를 위한 공간할당이 필요함) ( address 뒤에 00 두개 붙여서 만들어줌)
    Unconditional branching
  • op address (26비트 어드레스에 바이트 메모리 주소 만들고 ) (현재 PC의 상위 4비트를 씀) 서로 대치되는 관계, 따라서 주소값이 온전히 반영이 됨

Instruction in memory

Register (jump regiseter)

op rs
-> 레지스터에서 지칭해서 이동

Procedure 지원

In C, a procedure is called a function(함수).

Subfunc가 나오는곳마다 Subfunc의 해당되는 코드를 전부 넣는 것
-> 함수를 짜는것에 있어서 효율성이 하나도 없음
서브루틴을 사용할 때 4가지의 복잡한 이슈가 발생함
이를 해결하기 위한 명령어가 있음

1) Jump 가 일어났을 경우 돌아와야함
돌아올 주소를 지정해줘야함 -> jal 명령어 (jump and link)
saves pc + 4 in regisetr $ra { = r31}
주소를 복사하고 저장하고 점프 후 돌아올 주소를 기제해 둠

2) Argument and return value

  1. Main routine (caller) puts parameters in a place where the procedure (callee) can access them
    $a0 - $a3: four argument registers

  2. Caller transfers control to the callee

  3. Callee acquires the storage resources needed

  4. Callee performs the desired task (jal : ra 에 pc + 4를 넣어둠, v0 v1에 리턴값을 넣어두고 ra 에 들어잇는 값을 pc로 넣어주면 돌아올수 있게 된다)

  5. Callee puts the result value in a place where the caller can
    access it
    $v0 - $v1: two value registers for result values

  6. Callee returns control to the caller
    $ra: one return address register to return to the next instruction of the caller.

3) Procedure 값을 백업하거나 복원하는 back up and restore -> 특수명령어가 있는게 아니라 서브루틴으로 콜이 발생했을시, 기존의 명령어를 이용하여 문제없이 이루어질수 있도록 하는 코드를 추가 -> 어디서 백업하고 복원할거냐 논란

첫번째

1) 스택영역에 save하고 점프
2) Argument 셋업
3) 돌아올 주소 설정 후 점프함
4) Callee 과정 끝나면 돌아오고
5) Register 에 저장된 값을 복원해서 다시 사용함

두번째
1) callee 에서 save register 넣어줌

새번째
하이브리드 방식 : s를 사용할거면 s 만 백업해라

MIPS Register Calling Convention

출처

32개의 레지스터
0 제로
1 $at 맘대로 사용 (Pseduo Instruction 을 위해 예약)
2 3 $v0, $ v1 리턴값을 저장할 수 있음
4 5 6 7 $a0 ~ $a3 argument값의 용도로 사용함

Leaf / Non Leaf

Leaf

내부적으로 함수콜이 없는 함수를 leaf example이라고 할 수 있다

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

4개의 argu를 받을 수 있음
로드 스토어가 존재하기는 하나, 사실상 별로 필요하지 않다

Non Leaf

  • 내부적으로 함수콜이 있는 함수를 Non-Leaf라고 한다.
  • Leaf와 다르게 return address, return value 등을 sw, lw 해야한다.
  • Nonleaf 는 기존의 arg 값을 백업해주는게 중요함
int nonleaf_example (int arg){ 
int result;
result = arg + 
leaf_example(5,4,3,2);
return result;
}
  • 반환주소, 즉 return address 를 Stack에 저장하고 있어야, 후에 돌아갈 수 있다. 이는 recursive 구조에서 더 중요시된다 .

Recursive

재귀함수의 실행을 알아보기 위해, 팩토리얼 재귀함수를 작성하였다.

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

과정은 다음과 같다.


fact:
addi $sp, $sp, -8

sw ra,4(ra, 4(sp)

sw a0,0(a0, 0(sp)

slti $t0, $a0, 1

beq $t0, $zero, L1

addi $v0, $zero, 1

addi $sp, $sp, 8

jr $ra #return to caller (1st)

L1: addi $a0, $a0, -1

jal fact #call fact with (n-1)

bk_f:
lw a0,0(a0, 0(sp)

lw ra,4(ra, 4(sp)

addi $sp, $sp, 8

mul $v0, $a0, $v0

jr $ra #return to caller (2nd)


Memory Allocation

0개의 댓글