컴퓨터 구조 (5), Instruction Set Architecture 02

2022. 4. 21. 18:07강의 내용 정리/컴퓨터구조

728x90
반응형

Instruction Set Architecture

ISA는정확히 표현하고, 효율성이 있어야한다.


 

1. Instruction의 타입

1). Machine Instruction의 타입

(1) Opcode: 어떤 연산을 할건지 정의하는 파트

(2) Operands: 데이터 위치에 대해 알림

 

2) MIP Instruction의 타입

(1) Arithmetic and logic instructions

(2) Data transfer instructions

(3) Control transfer instructions

 

3) MIP Instruction format

(1) R type

R type

- MIPS의 명령어는 32비트를 가지고 데이터 워드는 모두 같은 사이즈이다.

- 두 개의 피연산자를 가지는 각각의 레지스터가 존재하고 그 피연산자의 연산 결과를 저장하는 목적 레지스터가 존재함

 

 

(2) I type

I type

- 데이터 연산을 위해서 레지스터에 값을 올려야함

- but constant나 address를 사용해서 작은 숫자의 경우에는 레지스터를 사용하지 않고 메모리에 접근해 처리할 수 있도록 함.

- 표현할 수 있는 경우의 수는 2의 16승이지만 access할 수 있는 것은 2의 15승이다.

 

- 참고 포스팅: https://iamswdeveloper.tistory.com/entry/MIPS-%EB%AA%85%EB%A0%B9%EC%96%B4-I%ED%83%80%EC%9E%85?category=165132 

 

MIPS 명령어 - I타입

Type -31- format (bits) -0- R opcode (6) rs (5) rt (5) rd (5) shamt (5) funct (6) I opcode (6) rs (5) rt (5) immediate (16) J opcode (6) address (26) 이번에는 I타입의 명령어 format에 대해서 알아..

iamswdeveloper.tistory.com

 

4) 기본 MIPS 명령어

- Machine code는 MIPS코드로서 쓰임

- R타입에서는 두 개의 피연산자를 더해서 다른 연산자에 저장하는데 위와 같이 A=b+c+d+e;를 어떻게 처리하는가?

위의 C code에 대해서는 두 가지 방법을 활용하여 문제를 해결함

 


2. ISA

1) 종류

(1) RISC(Reduced Instruction Set Computing)

- 명령어를 최대한 간단하게 만들어서 어셈블리어를 변환하는 전략

- 사람 입장에서는 RISC가 더 좋음

 

(2) CISC(Complex Instruction Set Computing)

- 필요한 모든 명령어 셋을 만들어서 어셈블리어를 변환하는 전략

- 하드웨어 입장에서는 CISC가 더 좋음

 

2) ISA를 좋게 만드는 요인

(1) Programmability

 

(2) Implement-ability

 

(3) Compatibility

- Backward compatibility: 과거에 사용하는 프로세서에도 지원가능하게 하는 것으로 중요한 개념

- Forward compatibility: 앞으로 나올 프로세서에도 지원가능하게끔 하는 것

 

 

 

$는 레지스터를 의미함

 

3) MIPS 명령어와 내용

 

 

 

 

 

등등 교재 참고

 

 

- 표와 주석은 연산의 결과로 목적을 다한 레지스터인 $s1은 i+j를 저장할 레지스터로 재사용한 것을 알 수 있다.

 


3. MIPS ISA의 구체적인 표현 - 조건문

1) if 조건문

- bne는 두 개의 레지스터가 같지 않으면 동작하도록 하는 것이기에 둘이 같지 않으면 L1으로 이동하게끔해 addi $s1, $s1, 1이 동작하지 않도록 한다.

- L1대신 0과 1의 조합으로 작성한다면 offset만큼의 값을 가진다.?

 

2) if-else 조건문

- 중간의 구문에서는 i와 j가 같은 경우에 ELSE 구문까지 넘어가기에 원하는 구현을 하지 못한다. 이에 따라 jump 명령을 사용해서 NEXT로 넘어가도록 해 코드를 작성한다.

 

 

3) AND로 묶인 조건식이 여러개일 때의 조건문

 

- bne를 여러번 사용해서 조건식을 하나씩 점검한다.

 

4) OR로 묶인 조건식이 여러개일 때의 조건문

 

- bep명령어는 두 개의 레지스터에 있는 값이 같으면 branch해 offset으로 이동한다. 이에 따라 beq를 활용해 두 값이 같은 경우에는 바로 IF구문으로 이동한다. 만약 첫번째 조건식이 거짓일 경우에는 bne 구문을 통해 해당 구문이 같지 않을 경우에는 ELSE 구문으로 이동하고, 그게 아니라면 IF 구문으로 이동한다.

 

5) Switch

 

- addi $s4, $zero, 1은 $s4에 1을 넣어주는 구문이다. 각각의 switch마다 $s4의 값을 위와같이 갱신해가며 i가 저장되어있는 $s1과 $s4를 비교해 switch를 동작하도록 한다. 

 

 


4. MIPS ISA의 구체적인 표현 - 반복문

1)  while문의 MIPS ISA 표현

 

bge는 왼쪽에 있는 레지스터의 값이 오른쪽에 있는 레지스터의 값보다 크거나 같으면 오른쪽 위치로 branch하는 명령어이다. while 반복문에 해당하는 구문을 모두 L1으로 감싸서 이를 반복하도록 한다. 만약 $s1이 $s2보다 작지 않다면 DONE으로 가도록 한다.

 

2) for문

while문과 동일하게 작성하면 된다.

 

 

복잡한 예제) 시험 문제 예시

C 코드 상에서의 array

- size는 워드타입으로 10의 값을 가지고 있고 size의 주소를 $s0에 저장한다.

- lw 명령어를 통해 $s0의 주소에 있는 값을 $s1에 저장한다.

- ori 명령어를 통해 $s2, 3, 4는 0으로 초기화한다. 0으로 초기화하는 것은 'ori 레지스터, $0, 0'을 입력하면 된다.

- blez와 bgez 모두 만족하는 경우에는 $s7이 0인 경우이니 UPDATE로 이동해 i의 값만 증가시켜준다.

- 어샘블리어에서는 L1과 같은 방식으로 이동할 수 있지만 0과 1로 표현할 때는 offset을 계산해서 이를 구한다.

 

 


5. 레지스터

1) 레지스터

- 레지스터에 데이터를 갖고 있는 것은 매우 제한적이기에 함수 call이나 subroutine과 같은 상황이 발생한 경우에는 더 많은 레지스터가 필요하기에 이땐 아래와 같이 동작한다.

- 레지스터 번호는 외울 필요가 없음

 

 

- jal을 사용하면 PC값을 더한 뒤 해당 값을 $ra에 저장하고 특정한 레지스터로 갔다가 리턴값을 가지고 다시 돌아와서  jal에 저장함

- 명령어를 실행하면 PC값을 증가시켜서 다음 명령어로 옮겨줌

 

- ProcA와 ProcB에 모두 $ra를 사용해서 덮어썼기에 문제가 발생할 수 있다.

 

- 위의 문제를 해결하기 위해 $29인 stack pointer를 사용한다.

- 레지스터 $29는 스택의 탑을 가리키는 포인트가 있다.

 

 

2)  함수 호출과 stack 포인터

- 레지스터에 올릴 수 있는 것이 한정적이기에 함수의 재귀적 호출은 다음과 같이 stack 형식으로 처리한다.

 

예제)

 

- jr은 레지스터로 이동할 때 사용함

 

728x90
반응형