컴퓨터구조 - DevWoony가 복습을 위해서 전공과목을 정리하는 내용이에요!
Machine Language
Instructions도 Register나 Word 단위의 데이터와 마찬가지로 32bits의 길이를 가진다.

load-word와 store-word의 instruction을 고려한다.
데이터의 이동이 가능한 I-type의 instruction을 설계한다.
Register을 위한 format은 R-type이다. I-type을 만들게 되면서 Register 사용이 적어지며 개수를 줄일 수 있게 되었다. (I-type은 immediate value를 받는다)

Assembly Language vs. Machine Language
Assemly Language
- Assembly는 symbolic 한 표현으로 편리성을 제공한다.
- 쉽게 작성할 수 있다.
- 다음과 같은 Pesudo instruction을 작성할 수 있다.

Machine Language
- Machine 은 좀더 현실성이 있다.
- Performance 를 고려할 수 있다.
Stored Program Computers

- Instructions는 데이터처럼 바이너리로 표현된다. 이는 hardwired circuit으로 구성되어 있지 않다.
- 그렇기 때문에 Instructions와 data는 Memory에 저장되어 있어야 한다.
- 프로그램들은 프로그램을 실행할 수 있다. (compilers, linkers)
- Binary compatibility는 프로그램을 다른 컴퓨터에서 컴파일해도 동작할수 있도록 해준다. (ISAs 표준화을 따를시)
- Fetch & Excute Cycle 원리로 동작한다.
- Instructions은 fetched되고 특별한 Register에 쓰여진다.
- "control" Register안의 bits는 후속 조치를 취한다.
Control
- Instructions의 의사결정을 담당한다.
- control flow을 제어한다.
- 실행되어야하는 "다음" instruction을 바꾼다.
- MIPS는 조건문으로 가능한 brach instructions를 가지고 있다.


J-type을 이용해 Loop를 만들어보자!

지금 까지 배운 Type들 정리하는 예제!

Basic Blocks
Basic block은 컴파일러 관점에서 instructions의 순서블럭입니다.
- Basic block은 마지막을 제외하고 braches가 없어야한다.
- Basic block은 시작을 제외하고 brach로의 이동이 없어야한다.
- 컴파일러는 Basic block을 optimization을 위해 정의한다.
- 향상된 processor는 Basic blocks의 실행을 가속화 할 수 있다.

Control Flow
- 앞선 instructions 예제에서 beq, bne을 통해 branch를 이동하는 명령어를 만들었다.
- 이번에는 다른 Control Flow 명령어를 만들어보자.
- 다음과 같이 "~보다 작은" 명령어 slt를 정의한다.

- 이 명령어와 이전에 만든 bne을 활용하면 "blt $s1, $s2, Label" 명령어를 다음과 같이 2줄로 만들 수 있다.

- slt를 통한 control flow를 위해서는 $t0 처럼 register에 값을 쓰는 것이 필수이게 된다. 그래서 MIPS에서는 slt 같은 명령어를 위한 register가 존재하게 된다.
Procedure = Function
- Procedure의 목적은 프로그램의 구조화이다.
- 코드의 쉬운 이해와 재사용성을 높인다.
Procedure의 실행 순서
- Procedure이 쉽게 접근할수 있는 위치에 parameters를 위치시킨다.
- Procedure로 control을 이동한다.
- Procedure이 storage 자원을 얻는다.
- task를 수행한다.
- 결과를 program이 불렀던 곳에 위치시켜 접근가능하게 한다.
- Control을 원래 있던곳으로 이동한다.
Procedure Use of Registers
"ProcedureAddress"라는 Procedure가 위 사진처럼 Register을 쓴다고 가정하자. Register의 사용순서는 다음과 같다.
- jal을 통해 "ProcedureAddress"가 호출된다.
- procedure 실행 이 후 돌아올 현재 위치를 $ra에 저장한다.
- prameter들을 $a0 ~ $a3 에 위치시킨다.
- Procedure을 instructions를 수행한다.
- $v0 ~ $v1에 결과값을 저장한다.
- jr $ra로 호출되었던 지점으로 돌아간다.
다음 사진은 MIPS에서 각 Registers들의 주로 사용하는 목적을 적어놓은 것이다.

Memory Organization
- Text = program code
- Static data = global variables
- Dynamic data = heap
- Stack = automatic storage

Memory Use of Stack

Frame Pointer vs. Stack Pointer
- Procedure frame 또는 Activation record 는 procedure가 저장한 registers들과 local varibale을 저장하는 stack에서의 조각이다.
- Frame Pointer는 ($fp)는 frame의 처음 word를 가르킨다.
- Stack Pointer는 ($sp)는 프로그램이 실행됨에 따라 변화한다.

Nested Procedures
다음 코드는 00부터 시작하고 n=2, SP=36 이다.


코드의 실행순서는 다음과 같다.

Constants
- Constants들은 operands에 사용되는 값들이다.
- "Small contants"들은 50% 이상의 operands들을 차지할만큼 자주 사용된다.

- 그렇기 때문에 'typical constants'들은 Memory에서 항상 불러오기에는 부담이 있다.
- 이 constants들을 위해 $zero와 $one과 같은 hard-wired registers를 MIPS 명령어로 만들어보자.


-
MIPS 명령어에 immediate에 Constants를 넣을시에 32 bit와 같은 큰 constants 값들은 넣을 수가 없다.(MIPS 32 bit instruction 설계에서 이미 op, rs, rt와 같은 op와 operand가 자리를 차지하고 있기 때문에)
-
그래서 반드시 2개의 instruction을 필요로 한다. 32 bit의 값을 load 하기 위해 lui 명령어를 만들고 다음과 같이 load한다.


Branched and Jumps
- Branch 명령어와 Jump 명령어를 조금더 깊게 살펴보자.
- 기존 우리가 만들었던 명령어사용법과 Format은 다음과 같다.


- 여기서 I-type과 J-type의 immediate 값으로는 memory의 32 bits의 addresses를 표현을 할 수가 없다.
- 그래서 우리는 다음과 같이 32 bits register 값을 읽어 load and store를 실행하는 명령어를 $rs = $rt+extended immediate 값으로 사용해왔다.

- 그러면 마찬가지로 32 bits의 다음 instruction의 PC 주소값을 표현하여 control flow을 제어해야하는 branch나 jump 관련 I-type, J-type 명령어는 어떻게 동작하는 걸까?
- Branch 명령어의 경우 $rs 와 $rt 값의 조건연산을 통하여 확인한 뒤 16 bit immediate 값을 00을 붙여 18 bit로 만들고(word가 4byte 단위이기 때문에 앞 두자리를 00) 기존 PC 주소에 더해서 사용한다.
- Jump 명령어의 경우는 26 bit인데 Branches 명령어와 비슷하게 동작하지만 기존 PC에 더하는게 아니라 hard-wired로 합쳐서 사용한다.

- Branches의 경우 16 bit offset으로 이동할수 없는 멀리 있는 branch의 경우는 assembler가 코드를 다음과 같이 다시 쓰기도 한다.

Addressing Mode
- Immediate addressing
- Instruction 자기 자신 안에 operand가 constant를 내포

- Register addressing
- Operand가 register를 지시

- Base or Displacement addressing
- Operand의 constant와 register값을 더해 memory의 위치를 표기

- PC-relative addressing
- Operand의 constant와 PC의 값을 더해 memory의 위치를 표기

- Pseudodirect addressing
- Jump와 같이 26 bit와 PC의 상위 4 bit와 결합해 memory 위치를 표기

지금까지의 MIPS 명령어 정리
- 모든 instructions는 32 bits의 길이를 가진다.
- 매우 구조적이며 불필요한 탑재가 없다.
- 오직 3개의 format만 존재한다.

- Performance가 compiler에게 의존한다.
최종 정리!!

출처: [Computer Organization And Design: The Hardware/Software Interface]