컴퓨터구조

3. Data Transfer Instructions
  • H
Mar 16, 2023
  1. r-format
  2. i-format
  3. lw
  4. sw
  5. lb
  6. sb

1. MIPS Introduction

Created by
  • H
    HM
Date
Mar 4, 2024
교재: Chapter 2. Instructions: Language of the computer
MIPS Instructions
: Instructions: Language of the Computer

개요

Instructions ****

컴퓨터가 사용하는 언어가 곧 Instructions
collection of instructions → instruction set
서로 다른 CPU는 서로 다른 instructions set 을 가진다
x86, MIPS, ARM → 각자 고유의 instruction set 이 있음
서로 다르지만 공통점이 있다

CISC vs RISC

CISC

초창기 core를 많이 가지고 있지 않을 때 어떻게 하나의 명령어 내에서 다양한 일들을 동시에 시킬 수 있을까 고민하면서 어떻게 복잡하게 만들 수 있을까 고민한 것
ex. intel x86 : 데이터를 가져와서 덧셈하는 작업을 하나의 명령어로 처리할 수 있음
Instruction 길이가 다 다르다 → 자주 사용하는 명령어는 짧게 설계
x86 (intel), AMD , Motorola 68k

RISC

명령어 하나하나를 단순하게 만들자
각 명령어는 한 가지 일만 할 수 있다 Each instruction does a small (unit) job
최대한 명령어 단순하게 & 해당하는 하드웨어도 쉽게 디자인하기 위해 규칙 또한 단순화함
→ 모든 명령어는 고정된 길이를 가져야만 한다고 약속하고 이에 따라 설계함
: 모든 명령어는 32bit 로만 이루어져있다
ex. MIPS (32bit, 64bit), ARM (RISC-5)

MIPS (RISC) Design Principles

1.
단순하게 만들기 위해서는 규칙성 내에서만
a.
모든 명령어는 고정된 길이로 설계한다 (32bit로만 표현되도록 설계됨)
b.
instruction formats이 세 개만 있다 → 적은 수의 instruction formats
c.
: 많아지면 제약사항이 생기므로
d.
명령어의 앞에 있는 6bit: 어떤 명령어인지 알려주는 header로의 역할
2.
작게 만들수록 빠르다
a.
Limited instruction set → 최소한의 어휘체계
b.
Limited number of registers in register file
c.
Limited number of addressing modes
3.
자주 일어나는 사례는 빠르게 동작하도록 만든다
컴퓨터의 본질은 산술연산. 이를 빠르게 동작시켜야 할 것이다.
operation은 정해져있고, 피연산자(operand)를 어디서 취하느냐가 중요하겠지.
→ 어떤 저장공간에서 와야한다.
→ 그렇다면 멀리있는 곳에서 가져올 수도 (D-RAM 등), 빠른 곳에서 (CPU 등) 도 가져올 수 있다
→ MIPS에서는 빠른 곳에서 가져오도록 함
: 멀리있는 피연산자를 가져오려면 멀리 있는 곳에서 가까운 곳으로 가져오는 명령어를 별도로 취해야 함
4.
좋은 디자인은 약간의 타협이 필요하다
3개의 instruction formats

Stored Program Concept

우리가 쓰는 프로그램은 stored program에 입각해있다
가장 중요한 컴퓨넌트: CPU, Memory
memory
다양한 코드, 데이터 등을 집어넣을 수 있다
프로그램을 실행하면 프로그램은 전원을 꺼도 안전하게 보관할 수 있는 곳에 들어있고
실행하기 위해서는 D-RAM이라는 메인 메모리에 올라와야 한다
→ ‘프로그램을 로딩한다’라고 표현한다
hello world라는 코드를 실행하기 위해서는 binary 코드의 특정 라인에 접근할 수 있어야 한다
→ address bus (4-bit address bus…) 를 통해 메모리로 접근하고
→ Data Bus를 통해 주소에 있는 내용물이 CPU에게 전달한다

Stored Program Concept

명령어와 데이터는 모두 이진수로 표현된다 (== cpu는 추상적인 레벨에서 모두 이진수로 표현시킬 수 있다)
명령어와 데이터는 메모리에 저장되어 있다
교수님 설명: 따라서, 0과 1이라는 바이너스 넘버를 거의 무한대에 가깝게 표현해놓고 저장할 수 있는 메모리가 있으면, 메모리는 명령어든 데이터든 구분하지 않고 모두보관할 수 있는 것
→ 메모리 DDR안에는 hello world 코드가 들어가있긴 하지만, 0과 1이라는 바이너리 넘버로 들어있는 것
instruction set architecture만 통일되어 있으면 다양한 컴퓨터에서 같은 코드를 실행할 수 있다
→ 그래서 이 architecture에 대한 이해가 중요한 것
→ Binary compatibility allows compiled programs to work on different computers with the same ISA

MIPS Instructions

분류체계

1.
Data Processing instructions (Arithmetic and Logical)
기본적으로 CPU는 산술연산, 논리연산이 가장 핵심적이다
→ 데이터를 처리하기 위한 명령어 (덧셈, 뺄셈, 논리적 &, 등등)
data processing instructions
2.
Memory access instructions (Load / Store)
CPU는 메모리에 접근해서 읽어오거나, CPU에 접근해서 쓰는 것
3.
Branch instructions 분기명령어
본래 순차적 동작이 기본임
→ 하지만 순차적으로만 동작하면 결정하는 능력이 사라짐
→ 그래서 결정능력을 위해 branch가 필수인 것

Arithmetic Operations

덧셈, 뺄셈에는 기본적으로 세 개의 피연산자가 필요하다
2개의 sources와 하나의 destination
add a, b, c # a가 destination
모든 산술 operation들은 이러한 형식으로 표현하기로 약속함
Examples
c code
f = (g + h) - (i + j);
→ 이렇게 해도 잘 돌아간다
→ 그러나 MIPS에서는 직접적인 맵핑이 되지 않음
→ 그래서 여러개의 instruction을 쓰더라도 각 instruction을 단순하게 쓰기로 함
Compiled MIPS code
add t0, f, h add t1, i, j sub f, t0, t1
→ 실제 MIPS에서는 0과 1의 조합으로 32개로 이뤄져있는것
→ 위 코드는 일종의 assembly 상에서의 명령어인 것
: assembler를 이용하면 기계어로 바꿀 수 있다

Registers

CPU 내부에 있는 빠른 저장공간
C에서 쓰는 변수 (variable)의 실체는 저장공간이어야 한다.
저장공간을 다룸에 있어서 MIPS는 빨리 하고 싶기 때문에
이 모든 저장공간이 (세 가지) 모두 CPU내부에 있는 저장공간에 매핑되도록 디자인되어있다.
이 CPU 내부 저장공간을 register 라고 부른다.

개념

빠른 저장공간 & 적은 개수 (CPU 안에 있어야 하니까)
→ 셀 하나하나가 빠르게 동작하도록 물리적으로 만들어져 있다
MIPS: 32 x 32bit registers
32개만 들어있다
하나의 register는 32bit를 구성할 수 있는 셀들로 이뤄져있음
→ integer를 32개 보관할 수 있는 저장공간이라고 이해하자
word
register의 크기를 기본 단위로 한다. 하나의 word는 32bit로 가정한다
cf. bit version은 register 크기를 따른 것 (32bit, 64bit)
MIPS를 설계할 때 register를 많이 두지 않는다 (32개) → 적은것이 빠른것이니까

Simplified Version of CPU internal

CPU에는 32개의 register와, 산술논리연산 모음 (ALU)이 필요하다
2개의 source가 입력으로 들어간다
→ 잘 읽었다면, R1, R5에 있는 내용물이 ALU로 들어가겠지
→ 덧셈을 하라고 요청
→ 이 결과가 register 범위 중 R3 공간에 들어가면 덧셈이 실행된 것
예시
add $3, $1, $5 라는 명령어가 있다면
$ 기호로 0~31까지의 레지스터를 나타낸다
$1 이 보관하고 있는 32bit 값과 $5 가 보관하고 있는 값을 더해서 3번 레지스터에 넣겠다는 의미
addrress bus 를 통해 주소를 알아차리고, memory에 들어있는 값을 읽어와서 data bus를 통해 실행시킨다

Memory Hierarchy

register 32개만으로는 매우매우 작음
→ CPU 바깥을 벗어나게 되면 DDR, HD 도 있는 것
구조

Overview

산술연산은 항상 피연산자를 레지스터로부터만 가져온다
예외
명령어 자체에서 가져올 수도 있음 → immediate field
: C언어로 덧셈을 할 때 A = B + C 를 하기도 하지만, B + E 를 필요로 할 때도 있다. (for 문 돌릴 때 처럼)
: 상수를 직접 빠르게 더할 수 있게, 명령어 내부에 특정한 상수를 넣어둘 수 있는 여지를 만들어두었다
모든 CPU는 레지스터를 가진다
레지스터는 프로그래머들에게 보인다: visible
→ 즉, 32개 레지스터 중 0 ~ 31 중 특정 레지스터를 네이밍을 이용해서 명시할 수 있음 (지목할 수 있다)
cf) cache는 visible 하지 않다
(쓰고싶다고 쓸 수 있는게 아님. HW와 운영체제가 알아서 하는 것. 프로그래머에게 캐쉬의 위치를 선택할 권한이 없다)
Register File
레지스터를 모두 모아놓은 것 (MIPS에서는 32개의 범위를 register file이라고 부름)
2023년 3월 8일

MIPS Register File

레지스터는 flip-flop을 여러개 조합해서 만들 수 있다
combinational 조합회로 vs sequential 순차회로
조합회로: 현재의 출력이 현재의 입력에 의해 온전히 결정된다 (출력이 현재의 입력에 의해 결정되는 경우)
순차회로: 조합회로와 상태소자 (state element)와 결합해서 현재의 입력뿐만 아니라, 과거의 상태에 의해서도 결정될 수 있는 경우
(state element: 과거의 상태를 잊어버리지 않고 저장하는 역할)
→ flip-flop은 이 상태소자 중 하나 (과거의 상태를 시간이 지나도 저장할 수 있다)
32bit 레지스터는 32개의 flip-flop을 요구한다
입력을 넣으면 이걸 기억할 수 있는 저장요소
Register File
CPU안에 있는 레지스터들의 모음
저장 능력이 있는 flip-flop으로도, SRAM (마찬가지로 꼬아놓은 것: cross flexed → 더 작게 만들 수 있다) 으로도 만들 수 있다
MIPS register file은 32개의 32bit 레지스터를 가진다
해당 register file의 데이터를 읽을수도, 쓸 수도 있어야 한다
addr는 왜 5bit 일까?
R1에 32bit 레지스터가 있다고 가정할 때, 5bit 를 디코딩하면 R1에 있는 내용물이 32bit output으로 나오는게 registerfile의 역할이다
src1 , src2 port를 모두 만들고 출발
dst addr: 덧셈을 한 결과를 레지스터 파일에 쓸 수 있어야 하니까 이 결과를 저장
레지스터 파일안에 집어넣어야 하니까, 써야하는 data도 input 포트로 들어가야 한다 → write port data
write control: 왜 필요할까?
→ 특정한 값을 쓸 계획이 없는데, 우연히 어떤 값에 머물러 쓰여질 수도 있음
(읽기동작도 마찬가지지만 괜찮음. 값이 토해진다 하더라도 안쓰면 그만.
레지스터 파일을 훼손하는 건 아니다. 쓰기의 경우만 overwrite이 될 위험이 있는 것.
그래서 write control 을 사용하지 않을때는 0으로 세팅해놓는다)
레지스터 파일은 메인메모리나 캐시에 비해서 빠르다.
CPU 안에 있기 때문 / 레지스터 개수가 제한되었기 때문에 (적은 개수를 가지고 있기 때문에)
컴파일러 입장에서는, high-level 입장에서는 변수를 생성하는데 자주 쓰는 변수와는 레지스터와 잘 매칭 시킬 필요가 잇’다
high-level 코드를 assembly 코드로 바꿀 때 레지스터를 잘 매핑할 수 있게 해야 한다

MIPS Assembler Register Names

Examples

C
f = (g + h) - (i + j);
Compiled MIPS code:
add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1

Register Operands

덧셈을 포함한 산술명령어는 레지스터로부터 피연산자를 가져온다
MIPS는 덧셈을 지원하기 위해서라도 내부적으로 register file을 가지고 있어야 한다.
레지스터가 빠르기 때문에, 자주 사용되는 것을 위에서부터 매핑하는게 좋다
word : 각 레지스터는 32bit data를 가짐
t, s 레지스터 각각 기억하고 있기
👍