MIPS 명령어 설계하기

DevWoony·2021년 4월 10일
0

컴퓨터구조

목록 보기
5/7

컴퓨터구조 - 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을 설계한다.

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의 실행 순서

  1. Procedure이 쉽게 접근할수 있는 위치에 parameters를 위치시킨다.
  2. Procedure로 control을 이동한다.
  3. Procedure이 storage 자원을 얻는다.
  4. task를 수행한다.
  5. 결과를 program이 불렀던 곳에 위치시켜 접근가능하게 한다.
  6. Control을 원래 있던곳으로 이동한다.

Procedure Use of Registers

"ProcedureAddress"라는 Procedure가 위 사진처럼 Register을 쓴다고 가정하자. Register의 사용순서는 다음과 같다.

  1. jal을 통해 "ProcedureAddress"가 호출된다.
  2. procedure 실행 이 후 돌아올 현재 위치를 $rara에 저장한다.
  3. prameter들을 $a0a0 ~ $a3a3 에 위치시킨다.
  4. Procedure을 instructions를 수행한다.
  5. $v0v0 ~ $v1v1에 결과값을 저장한다.
  6. jr $rara로 호출되었던 지점으로 돌아간다.

다음 사진은 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는 ($fpfp)는 frame의 처음 word를 가르킨다.
  • Stack Pointer는 ($spsp)는 프로그램이 실행됨에 따라 변화한다.

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를 실행하는 명령어를 $rsrs = $rt+extendedrt + extended immediateimmediate 값으로 사용해왔다.

  • 그러면 마찬가지로 32 bits의 다음 instruction의 PC 주소값을 표현하여 control flow을 제어해야하는 branch나 jump 관련 I-type, J-type 명령어는 어떻게 동작하는 걸까?
  • Branch 명령어의 경우 $rsrs 와 $rtrt 값의 조건연산을 통하여 확인한 뒤 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]

profile
냉장고에 카페인이 가득한 회사에 가고싶다.

0개의 댓글