Refrence : David Harris, Sarah Harris - Digital Design and Computer Architecture
목차
- Assembly Language
- Machine Language
- Programming
- Addrssing Modes
- Compiling, Assembiling, Loading
- Odds and Ends
Introduction
- Architecture : instructions와 operand locations들로 정의된다.
- ISA : Instruction set architecture
- Microarchitecture : Architecture를 하드웨어로 구현하는 방식
- Instruction : Computer의 언어로 내리는 명령어
1. Assembly Language
- assembly language : 사람이 읽을 수 있는 명령어의 format
- machine language : 컴퓨터만 읽을 수 있는 명령어의 format, 0과 1로 구성
Architecture Design Principles
- Simplicity favors regularity
- Make the common case fast
- Smaller is faster
- Good design demands good compromises
MIPS architecture가 가장 기본이 되는 architecture이다.
(1) Simplicity favors regularity
같은 format을 유지하는 편이 하드웨어 구현이 훨씬 쉽다는 의미입니다. ****
- Consistent instruction format
- Same number of operands
같은 format을 통해서 다양한 연산을 수행하면 하드웨어 입장에서는 인코딩하기 훨씬 수월합니다.
(2) Make the common case fast - 단순하고 많이 쓰이는 것
MIPS는 오직 단순하고 많이 쓰이는 instructions들만 포함하고 있습니다.
그러면 instructions들을 디코딩하고 수행할 하드웨어가 간편해지고 빨라질 것입니다.
보다 복잡한 연산은 단순한 instructions 여러 개를 통해서 구현합니다.
- RISC : reduced instruction set computer. MIPS는 RISC이다.
- MIPS는 32개의 32-bit register로 이뤄져있다.
Operand Location
- register
- memory
- immediates - constants임
(3) Smaller is Faster
MIPS는 32개의 register로만 구현되어 있다. register가 많으면 빠르지만 프로그램이 실제 사용하는 개수가 생각보다 적기 때문에 경험적으로 32개로 채택된 것이다.
MIPS Register Set
Registers
- 이름 앞에 $를 붙인다.
- $0은 항상 0을 가리킨다.
- $s0 ~ $s7 는 변수를 저장한다.
- $t0 ~ $t9 는 intermediate를 저장한ㄷ.
Memory
- register에 program을 올리기에는 공간이 너무 부족하다. → memory 사용
- 저장 공간이 크고, 속도는 느리다.
load : memory read
- Mnemonic : load word (lw)
- Format : lw $s0, 5($t1) ⇒ $s0 = target operand, 5 = offset, $t1 = base address
⇒ $t1 + 5 주소에 있는 값을 $s0에 저장
store : memory write
- Mnemonic : store word (sw)
- Format : sw $t4, 0x3($0) ⇒ $t4 = source operand, 0x3 = offset, $0 = base address
⇒ $t4에 있는 값을 word 3에 write
Byte-Addressable Memory
실제로는 항상 word 단위로 끊어지지는 않기 때문에 byte 단위로 addressing 합니다.
1줄에 32bit를 4개로 나누어서 각 byte가 주소를 가지도록 쪼갭니다.
따라서 memory word의 주소는 항상 4의 배수를 가지게 됩니다.
- MIPS is byte-addressed
Big-Endian & Little-Endian Memory
- Big-Endian : MSB에서 address 시작
- Little-Endian : LSN에서 address 시작
Example
$t0 = 0x23456789 라고 가정해 봅시다.
sw $t0, 0($0)
lb $s0, 1($0)
다음 코드를 실행했을 때 $s0의 값은 Big-endian과 Little-endian에 따라 달라지게 됩니다.
Big-endian → 0x00000045
Little-endian → 0x00000067
(4) Good design demands good compromises
- multiple instruction formats allow flexibility
예를 들어 add와 sub는 3개, lw와 sw는 2개의 register operamd (and constant) 필요 - Number of instruction formats kept small → 디자인 원리 1과 3을 위함
Operands : Constants/Immediates
- lw와 sw는 constans나 immediates를 사용한다.
- addi : add immediate
- subi는 필요 없다.
예를 들어서 C code에서 b = a - 12; 라는 코드를
MIPS assembly code에서는 addi $s1, $s0, -12 로 표현할 수 있다.
2. Machine Language
- Binary representation of instructions
- 컴퓨터는 오직 0과 1만 이해할 수 있다.
3 instruction formats
- R-type : register operands
- I-type : immediate operand
- J-type : for jumping
(1) R-Type = Register type
3 register operands
- rs, rt : source registers
- rd : destination register
Other fileds
- op : operation code(op code)
- funct : function with opcode, 컴퓨터에게 어떤 연산을 수행할 지 알려주는 역할
- shamt : shift amount
Example
- 주의할 점 : Assembly code 에서는 destination (rd)가 먼저 나오지만, R-type Field values에서는 source가 먼저 나온다.
(2) I-Type = Immediate-type
3 operands
- rs, rt : register operands
- imm : 16-bit two’s complement immediate
Other fields
- op : opcode
Example
(3) J-type = Jump-type
- 26-bit address operand (addr)
- jump instructions (j)
Type 비교
⇒ Simplicity favors regularity : 모든 instruction에 항상 opcode가 있음
Machine language로 인코딩하는 example
add $a0, $t0, %t1 이라는 assembly code를 아래와 같이 0과 1로 이루어진 Machine language로 인코딩하는 과정입니다. 옆에 있는 표를 참고하여 register 번호를 확인하여 R-type에 맞게 값을 입력합니다. 그리고 그에 따라서 0과 1로 변환하면 끝입니다.
The Stored Program
프로그램은 실행되기 위해서 main momory에 올라야 합니다. 프로그램이 main memory에 올라간다는 것은 프로그램의 instruction들이 오르는 것과 같습니다. 그때, 컴퓨터는 0과 1만 이해할 수 있으므로 assembly code가 아닌 Machine code의 형태로 저장될 것 입니다.
계층을 나타내면 아래의 그림과 같습니다.