MIPS

kudos·2021년 1월 7일
0

컴퓨터구조

목록 보기
3/5

1. MIPS Instruction Set Architecture

1.1 특징

  • One of the pioneering RISC Instruction Set Architectures
    • pipelined execution & cache memory : cache memory가 도입되었기 때문에 하나의 instruction이 많은 작업을 하는 것보다는 작은 instruction들을 cache memory를 통해 여러 번 가져와서 pipelining 하는 게 효율적임
    • load/store architecture : 메모리에 접근할 때는 load/store instruction을 통해서만 가능하다. 예를 들어, add 명령어를 통해 메모리에 있는 값을 참조해 사용할 수는 없음. 이렇게 하는 것은 pipelining 하기에 훨씬 쉬운 방법이기 때문.
  • starts with a 32-bit architecture, later extended to 64-bit
  • even currently used in many embedded applications
    • game consoles
    • network devices
    • residential devices

1.2 MIPS ISA state

  • LO, HI : 곱셈, 나눗셈을 위한 레지스터

1.3 MIPS register usage

  • $0에는 항상 0이라는 값을 유지함. 어떻게 보면 read-only
  • $v0, $v1 : 함수의 return 값으로 쓰임. return 값은 하나인데 레지스터 2개인 경우는 return 값이 64bit인 경우도 있기 때문. 예를 들면, double 값
  • a0 a0~a3 : 함수의 argument 전달에 쓰임. 5개 이상의 argument가 필요한 경우, 나머지에 대해서는 stack 이용
  • 이렇게 각 레지스터의 용도를 지정해두는 이유는 compiler 사이의 inter-operability를 위한 것. 서로 다른 compiler에서 컴파일된 object code들이 모여서 프로그램을 구성해도 잘 동작함.

2. MIPS Instruction

2.1 종류

  • Arithmetic/Logic instructions
  • Data Transfer(Load/Store) instructions
  • Conditional(branch) instructions
  • Unconditional(jump) instructions

2.2 format

2.2.1 R-format

  • register : rs, rt, rd 지정(32bit 시스템이니까 각각 5bit)
  • shamt : shift instruction에서 얼마나 shift 하는가
  • funct : 확장된 opcode 역할. 그래서 R-format에서는 다른 format에 비해 opcode를 많이 가지는 특징을 가짐

2.2.2 I-format

  • register : rt, rt 지정
  • address/immediate : 16bit 짜리 상수 지정

2.2.3 J-format

  • jump instruction을 위해서만 사용
  • target address : jump 대상인 다음 주소

2.3 More about Loads and Stores

  • 모든 memory access는 오직 load, store에 의해서만 가능하다.

  • alignment restriction

    	- word 주소는 4의 배수여야 한다.
    • halfword 주소는 2의 배수여야 한다.
  • 메모리에서 가져온 partial word(halfword or byte)

    	- signed 연산에서는 sign값으로 앞의 빈 부분 채움
    • unsigned 연산에서는 0으로 앞의 빈 부분 채움
  • Big Endian vs Little Endian

3. MIPS addressing modes

4. C vs Assembly

5. Pseudo Instruction

machine이 지원해주지는 않지만 프로그래머가 assembly code로 프로그래밍을 하면, assembler가 machine이 처리 가능한 real instruction sequence로 바꿔준다.

위의 예시에서 $at는 assembler가 pseudo instruction을 real instruction sequence로 바꿔줄 때만 사용하는 레지스터이기 때문에 다른 때에 쓸 수 없다.

6. Calling convention

6.1 Caller Save

  • live register란? 레지스터에 있는 값을 미래에 참조할 가능성이 있는 레지스터
  • caller가 save할 수밖에 없는 값 : return address, $a0 ~ $a3, $v0, $v1

6.2 Callee Save

6.3 Hybrid Save

  • 왜 caller와 callee가 나눠서 레지스터 값을 save할까? caller는 어떤 레지스터가 live하지 않으면, save할 필요가 없고 callee는 어떤 레지스터를 바꾸지 않을 경우에 save할 필요가 없다. 그런데 temporary 레지스터는 값을 임시로 사용하는 곳이기 때문에 live할 가능성이 적으므로 caller가 save하는 것이 최적화하기 좋다. 반면, permanent 레지스터는 live할 가능성이 높기 때문에 callee가 save하는 것이 최적화하기 좋다.

7. Compiling procedure

7.1 compiling a leaf procedure

  • lear procedure란? 다른 함수를 호출하지 않는 함수
  • actually not needed라고 표시된 이유 : temporary 레지스터는 caller에서 save했을 것이기 때문에 여기서 save할 필요 없음

7.2 compiling a non-leaf procedure

  • 1~2번째줄 & 12~16번째 줄 : callee의 instruction
  • 나머지 줄 : caller의 instruction

7.4 compiling a recursive procedure

7.5 compiling and starting a program

서로 다른 compiler, assembler에 의해 만들어진 object 코드들을 모아서 executable file을 만드는 것이 linker
static vs automatic(semi-dynamic) vs dynamic

  • static : 프로그램이 시작될 때 allocate되고 프로그램이 끝날 때 free되는 변수. 따라서 딱 한 번만 값이 초기화됨.
  • automatic : stack에 allocate되는 변수. 함수가 호출될 때 allocate되고, 함수가 반환할 때 free되는 변수. 따라서 함수가 호출될 때마다 값이 초기화됨
  • dynamic : c에서의 malloc으로 생성한 변수.

7.6 object file example

각각의 object file에 많은 static 변수가 있다.

7.7 mips memory allocation

object file이 모여서 executable file이 만들어진 모습

static

7.8 executable file example

참고

http://olc.kr/classroom/index.jsp?cuid=310525 11~16강

profile
kudos

0개의 댓글