새소식

반응형
CS 지식/컴퓨터구조

[컴퓨터 구조] 4. MIPS instruction set(명령어 세트)

2023.01.11
  • -
반응형

Introduction

  • Jumping up a few levels of abstraction
  • 추상화(abstraction)의 몇가지 단계에 대해서 알아볼 것이다.
  • Architecture(아키텍쳐):
    • 컴퓨터를 바라보는 프로그래머(혹은 software)의 관점 
      • instruction과 연산 위치에 의해 결정됨
  • Microarchitecture(마이크로아키텍쳐):
    • hardware에서 아키텍쳐를 구현하는 방식

 

Assembly Language

  • 기계가 알아먹는 기본적인 명령어(0, 1로 이루어진) 하나하나를 1:1로 symbolic하게 표현하는 언어
  • Instruction: commands in a computer's language
  • Instruction이란 컴퓨터의 언어에서 사용되는 명령어이다. 
    • Assembly language: 인간이 읽을 수 있는 명령어의 포맷
    • Machiune language: 컴퓨터가 읽을 수 있는 포맷(1 또는 0)

 

 

Review) 지난 주 강의 참조

 

[컴퓨터 구조] 1-3. Performance와 CPU Time

Review) performance(speed):clock frequency area(cost): 이는 design에서 줄이는 part가 있고 공정(fab)에서 줄이는 part가 있는데 데이터가 많이 들어간다고 해서 문제가 되지 않는다. 더 중요한 문제는 fab, 즉 어떤

cdragon.tistory.com

int a, b, c
main
...
a = b + c

 

load Mem(b) -> $2
load Mem(c) -> $3
add $2, $3 -> $4
store Mem(a) <- $4

 

  • 기본적으로 필요한 IS(Instruction Set)
    • add
    • lode
    • store
  • 하지만 b라는 데이터에 3이라는 숫자를 더하려면 어떤 명령어를 써야할까?
addi sr1, cont, dr #source register1, constant, destination register1


이와 같이 얼마나 많은 Instruction을 사용할 수 있는가가 processor의 spec을 결정하는데, MIPS에는 instruction set이 약 4~50개가 있다.

 

그런데 이 중에서 핵심적인 기능만 수행할 수 있는 것을 어떻게 만들까?



MIPS Instruction Set (링크 참조)

  • instruction set의 종류(기본,핵심,필수가 되는 세 가지 기능)
  1. Arithmetic/Logic comp. (add, addi, andu, sub, subi, and, andi, or, ori, ...)
  2. data move(memory-to-reg, reg-to-memory, lw, sw,...)
  3. flow control (conditional branch(if), jump, call/return)

 

add rd, rs, rt # rs + rt -> rd
addi rd, rs, Const # rd:register destination, rs:register source, Const:constanct number

lw, rd, Mem_adr 
sw, rs, Mem_adr#register 내용을 memory로 옮겨라

beq, $1, $2, Label # if $1 == $2, Label로 jump (branch equal)
bne, $1, $2, Label # if $1 != $2, Label로 jump

J Label #just jump to Label
Jal Function # jump and link; function으로 갔다가 다시 돌아와라(call)

위와 같은 명령어들은 모두 32-bit로 구성되어 있음.

  • R타입
    • 제일 쉬운 add인 경우
      • 맨 앞에 op code정보(add)가 6bit를 차지하고
      • 뒤에 잇따라 오는 세 개의 register의 정보는 5bit씩 표현된다.
      • 그러면 남는 11bit는? -> 거의 사용되지 않는다.
  • I타입
    • load, store의 경우
      • 맨 앞에 op code(load or store) - 6bit
      • register 정보 - 5bit
      • 남는 bit는 모두 memory address로 사용될 수 있음
    • beq, bne의 경우
      • 맨 앞 op code - 6bit
      • register 두 개 5bit씩 - 10 bit
      • 나머지는 Label 정보
  • J 타입
    • J(ump), Jal의 경우
      • 맨 앞 op code - 6bit
      • 나머지 Label or Function 정보

 

메모리 위치를 지정하는 방법

  • Direct addressing
    • mem.adr가 0x10010 이라고 가정했을 때
      • memory address가 몇 번지인지 딱 지정한 방법
      • 선언한 변수가 중간에 수정이나 삭제가 되면 위 주소가 바뀌어 버린다.
      • 혹은 다른 메모리가 0x10008 번지로 지정되면 위 memory 주소는 전부 옮겨야 하기 때문에 매우 번거로워 이 방식은 잘 사용하지 않는다.
  • Indirect addressing(base addressing)
    • 메모리의 위치(0x10010)를 찾아갈 때 바로 찾아가는 것이 아니라
    • 메모리가 현재 점유하고 있는 범위의 시작 주소를 가리키는 포인터(base register)가 존재하여 그 포인터에 해당 주소로부터 몇 번째 떨어진 곳에 있는 지를 알 수 있는 number가 들어있다.
  • lw $5, 10($4) # 10:offset, $4:base register

 

  • 4번 레지스터 위치에서 10만큼 떨어진 곳
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.