Introduction
- Jumping up a few levels of abstraction
- 추상화(abstraction)의 몇가지 단계에 대해서 알아볼 것이다.
- Architecture(아키텍쳐):
- 컴퓨터를 바라보는 프로그래머(혹은 software)의 관점
- instruction과 연산 위치에 의해 결정됨
- Microarchitecture(마이크로아키텍쳐):
Assembly Language
- 기계가 알아먹는 기본적인 명령어(0, 1로 이루어진) 하나하나를 1:1로 symbolic하게 표현하는 언어
- Instruction: commands in a computer's language
- Instruction이란 컴퓨터의 언어에서 사용되는 명령어이다.
- Assembly language: 인간이 읽을 수 있는 명령어의 포맷
- Machiune language: 컴퓨터가 읽을 수 있는 포맷(1 또는 0)
Review) 지난 주 강의 참조
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)
- 하지만 b라는 데이터에 3이라는 숫자를 더하려면 어떤 명령어를 써야할까?
addi sr1, cont, dr #source register1, constant, destination register1
이와 같이 얼마나 많은 Instruction을 사용할 수 있는가가 processor의 spec을 결정하는데, MIPS에는 instruction set이 약 4~50개가 있다.
그런데 이 중에서 핵심적인 기능만 수행할 수 있는 것을 어떻게 만들까?
MIPS Instruction Set (링크 참조)
- instruction set의 종류(기본,핵심,필수가 되는 세 가지 기능)
- Arithmetic/Logic comp. (add, addi, andu, sub, subi, and, andi, or, ori, ...)
- data move(memory-to-reg, reg-to-memory, lw, sw,...)
- 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 주소는 전부 옮겨야 하기 때문에 매우 번거로워 이 방식은 잘 사용하지 않는다.