728x90
반응형
경희대학교 김정욱 교수님의 컴퓨터구조 강의를 기반으로 정리한 글입니다.
Explanation of 32 Registers
- $zero: 0 value
- $a0 ~ $a3: function argument
- $v0, $v1: return values
- $t0 ~ $t9: temporary 레지스터
- $s0 ~ $s7: saved register (반드시 값이 저장되어야 하는 레지스터)
- $gp: global pointer (static 데이터 핸들링 시 사용)
- $sp: stack pointer (stack에서 현위치)
- $fp: frame pointer (stack의 first item을 point)
- $ra: 이전 함수의 주소 값

Supporting Procedures in Computer Hardware
- Procedure(=Function): 코드 재사용을 더 쉽게 만들어주는 도구
- 다른 procedure로 jump하기 전에 이전 값들을 저장해야 함
- 함수를 호출하는 함수를 Caller, 호출된 함수를 Callee

- 함수의 argument가 4개 이상인 경우, $s나 $t가 역할을 대신할 수는 없음 → $a가 값을 받아서 $t에 저장하고 다음 argument를 받음 → 즉, $a가 일을 여러번 함
- 상황에 따라 4개의 $a와 2개의 $v보다 많은 레지스터를 사용할 수 있음
- Callee preocedur를 수행할 때, register에 저장된 값이 사라질 수 있음 → Callee procedure를 마치고 Caller procedure로 복귀할 때 다시 활용하게 될 수 있는 변수 값을 memory에 미리 저장

→ memory는 역방향 스택 → 아래로 내려감
- Stack pointer($sp) register: 스택에서 가장 최근에 할당된 주소를 가리킴
→ 위 예제에서 스택포인터는 값을 2개 저장해야하니 2칸 공간을 만들고(8만큼 포인터를 내리고) 두 개를 저장 다시 돌아올 때는 값을 꺼낸 후 포인터를 다시 2칸(8) 위로 올림


- 함수가 호출되면 스택 포인터를 내려 $s0가 저장될 공간을 메모리에 만들고 저장
- 연산을 수행하고 $s0에 아까 저장했던 값을 다시 불러온 후 스택 포인터를 올려 값을 버림
- jr: jump register, $ra: 호출한 함수의 주소 → 항상 함께 쓰임
Nested Procedures

jal: jump and link
Allocation Space for New Data on the Stack
- Frame: 함수에서 저장되는 값들
- Frame Pointer ($fp): procedure frame의 첫 word point → $sp 범위의 기준점
- Stack Pointer ($sp): procedure 과정에서 바뀔 수 있음 → push/pop 할 때

Allocation Space for New Data on the Heap
- Heap: procedure의 변수를 동적으로 할당

- Global Pointer ($gp): 스태틱 데이터 시작 지점과 끝 지점의 가운데를 가리킴. 16bit offset으로 접근
- Text: 우리가 실행할 프로그램의 코드가 저장되는 영역
- Static Data: 우리가 작성한 전역변수, 정적변수가 저장되는 영역
- Dynamic Data: 사용자가 할당하는 메모리 공간 → 실제 프로그램이 동작할 때(run time) 크기가 결정
- Stack: 함수 호출 시 생성되는 지역변수, 매개변수의 공간 → 설계자가 코드를 짜고 compile하는 단계(compile time)에서 크기가 결정
MIPS Addressing for 32-bit Immediate and Address

- I-Format에서 immediate 파트에 16비트만 저장됨, 하지만 ALU에서는 32비트 레지스터끼리의 연산만 가능

- 0이 저장된 $s0를 준비
- Load Upper Immediate (lui)를 사용해 앞 16비트를 채움
- Or Immediate (ori)를 사용해 뒤 16비트를 채움
Addressing in Branches and Jumps
Branch(I-Format)
- beq, bne → PC-relative addressing
- Program Counter: 현재 명령어의 주소를 저장
- Target Address = (PC + 4) + Offset * 4

Jump(J-Format)

- pseudodirect addressing: jump에서 사용하는 주소 접근법
- j 타입의 address 부분은 26비트 밖에 없는데, 이 26비트 안에 32비트의 주소를 축소시켜 넣는 방법
- 뒤의 00비트를 비우는 이유 → byte addressing (*4)
- 앞의 4비트는 PC에서 가져옴 → jump의 목적지와 PC address가 인접한 곳에 위치했다 가정 → 점프를 해서 아무데나 이동하더라도 어느 정도 바운더리 안에서 이동해라


MIPS Addressing Mode Summary
Immediate addressing
- operand에 명령어의 상수가 포함(addi)

Register addressing
- 주소 필드가 메모리가 아닌 레지스터를 가리키는 경우(R-Format)

Base addressing
- operand가 메모리에 위치하고, 명령어의 const와 register의 합으로 주소 알아냄 → Array의 시작점 + offset(lw, sw)

PC-relative addressing
- branch address의 주소가 명령어의 const와 PC의 합(bne, beq)

Psudodirect addressing
- Jump address가 PC의 upper bits와 명령어의 26bits가 합쳐진 상태(j, jal)

728x90
반응형