ETC/CS

[컴퓨터구조] ch.2-4 MIPS

지과쌤 2020. 10. 26.
반응형

Two Key Principles of Machine Design (컴퓨터 설계의 두가지 핵심 원칙)

  • 명령어는 숫자로 표현이 되므로 데이터와 구분할 수 없다.
    • 데이터와 표현 방법이 같으므로, 표현 원칙이 달라야 구분할 수 있다.
  • 명령어들의 집합을 프로그램이라고 하고, 프로그램도 데이터처럼 메모리에 저장되어 읽고 쓰여진다.
    • 이를 Stored-program concept 라고 한다.
      • 프로그램들은 바이너리 숫자 파일로써 저장이 된다 -> 바이너리 호환이 된다.

MIPS Logical Operations Overview (MIPS 논리 연산)

산술명령어들은 레지스터에 들어있는 값 전체를 하나의 부호가 있거나 없는 정수로 취급하였다.

하지만, 레지스터에 들어있는 32bit의 값을 개별적으로 처리하는 방법이 필요하다.

 


MIPS Shift Operations

shift 동작

R 포멧, 산술 연산에서는 채워지지 않았던 저 부분이 채워져있다. (빨간 동그라미)


MIPS Logical Operations

위의 표에서 봤던 것들 중 and, or, nor 과 i format 이 포함된 andi, ori 등등 여러가지가 가능할 것이다.

R 포멧
I 포멧


MIPS Instructions for Making Decisions (MIPS 의사 결정)

일반적인 컴퓨팅 작업을 수행하기위해서는 대략 두가지가 필요하다.

  1. 어떤 조건을 만족하는지에 따라 의사결정이 달라짐
  2. 반복하여 실행

의사 결정 명령어의 역할

  1. 조건 검사 결과에 따라 프로그램의 제어 흐름을 바꾼다.
  2. 다음에 실행될 명령어의 순서를 바꾼다.

두가지 타입의 의사결정 명령어

  • Conditional (branch) 조건분기
  • Unconditional (jump) 점프

조건분기

bne  $t0, $t1, label     //$t0, $t1을 비교하여 같지 않다면 분기해라

 

bnq  $t0, $t1, label     //$t0, $t1을 비교하여 같다면 분기해라


MIPS Control Flow Instructions (조건분기)

I format 에는 어디로 갈것인가 에 대한 정보가 들어있다.

맨 뒤에 있는 offset값은 분기할 주소값(어디로 갈 것인가?)을 나타낸다.


Other Control Flow Instructions (점프)

J Format이 해당되고, 하위 26bit를 이용해서 program count 값을 바꾸어 무조건 jump한다.


Instructions for Accessing Procedures

프로시저 호출 명령어

jal   ProcedureAddress     #jump   and   link

 

실행을 하고 난 후, 돌아와서 재개를 해야하므로, 그때 필요한 값 (return address) 도 저장이 되어야한다.


MIPS assembly language (명령어 카테고리별 예)

프로세서가 기본적으로 지원하는 명령어

 

1.arithmetic, logical - 산술 논리 연산

 

2.Data transfer - 데이터 전달 명령어, 프로세서와 메모리 사이에 버스를 통해 데이터 전달

 

3.Decisions making (의사결정을 위한 명령어)

  1. conditional branch (조건분기)
  2. unconditional jump (무조건 점프)

1과 0으로 표현하기위한 명령어 format / 32bit 동일한 길이로써 3가지 format


Addressing Modes (주소 지정 방식)

연산에 필요한 값(operand)들을 나타내는 정보/방법

 

메모리에 접근하기위해서는 메모리 주소값을 계산하는 방법이 필요하다. 그리고 그 내용은 명령어 32bit 길이 내에 하나의 필드 또는 두개 이상의 필드가 합한 형태로 표현이 된다.


 

명령어 형태의 register addressing 은 레지스터에 들어있는 값들에 대해서 연산한다. 그리고 그 결과를 destination register에 저장한다.


 

메모리에 접근할 때 주소값을 계산해야하는데, 하위에 있는 offset값(16bit) 을 32bit로 맞춰주고 base register ( 32bit 값 )에 더한다.

그럼 메모리 내에 접근할 주소값이 나온다.


실제로 연산에 필요한 한 부분(operand)를 명령어 32bit길이상에 갖고있는것.

그렇다면 이 값을 연산에 사용하기 위해서 메모리에 접근 할 필요가 없어진다.

메모리에 접근하는데는 상대적으로 시간이 많이 걸리기때문에 전체적으로 프로그램 실행시간이 줄어든다


program counter값을 기준으로 해서 상대적으로 addressing을 하는것이다.

특정 조건이 만족되면 분기를 해야하는데 어디로 분기를 할 것인가? ->

program counter가 가리키는 32bit 에다 명령어 상에 포함되어있는 offset값(길이가 다르므로 맞춰주어야한다)을 더한다.

결과값이 분기 조건이 만족된 경우, 목적지 주소가 결정이 된다. 그럼 그곳에 있는것이 명령어가 될 것이다.


jump를 통해 destination instruction을 결정하게된다.


MIPS Organization So Far

프로그램을 구성하는 명령어들이 어떻게 만들어지고, 그들이 실행하는것과 실제로 메모리 레지스터들이 어떻게 연결되는지에 대해 나타낸 그림

프로그램이 실행되는곳 - processor

컴파일 된 프로그램이 데이터와 함께 저장되어있는곳 -memory

 

프로그램이 실행되기 위해서는 메모리로부터 프로세서로 들어와야만 한다.

그때, 실행하는 주체는 ALU 이다.

 

e.g. 더하기 동작

 

  1. PC(program counter)가 가르키는 위치로부터 명령어를 가져온다.
  2. 메모리에서 프로세서로 가져온 명령어를 decode(해독)해보니, b, c 를 더해서 a에 넣으라는 더하기 동작을 의미한다.
  3. 그때, 명령어는 32bit의 binary값으로 되어있었고 그 값을 instruction format에 따라 decode(해독)해보니...
  4. 32개의 레지스터중 2개의 값을 읽어서 ALU에서 더하기를 하고, 그 결과를 dst addr에다가 저장을 하라는 해석이 된다.

프로세스와 메모리를 연결해주는것들을 버스 라고 한다.

결국 메모리에 접근하려면 주소가 전달이 되어야 할 것이고, 쓰기를 할것인지, 읽기를 할 것인지전달이 된 후 각각 32bit만큼 읽고 쓰게될것이다.

그때 그 주소는 32bit 크기에 대해서 4의 배수의 간격으로 word주소가 결정이 될 것이다.


참고) The C Code Translation Hierarchy


참고) Compiler Benefits

사용하는 gcc 옵션에 따라 성능이 달라진다.


참고) The Java Code Translation Hierarchy

반응형

댓글

💲 추천 글