MIPS ( RISC ) Design Principles (설계 원칙)
막 외우자고 생각하지말고 한번 슥 보고 지나가자.
- 단순하게 만들어 규칙성을 확보하라
- 고정된 크기 (32 bite)
- 명령어 형식을 많이 만들지 말라.
- 동작을 나타내는 코드는 앞에 6 bits 에 표현
- 작은것이 더 빠르다
- 명령어 셋 많이 쓸 필요 없다.
- 레지스터들의 집합 수 32개정도로 제한
- 주소 지정 방식(연산에 필요한 값을 어디로부터 어떻게 가져올 것인가를 지정하는 방식) 많이 만들지 마라.
- 자주 사용되는것 빠르게 실행되게 하자
- 메모리에 접근하는 경우는 load-store 명령어만을 통해서 사전에 레지스터 파일을 가져다놓으면 그 값에 대해서 연산하도록 하자.
- immediate operands를 명령어상에 가지도록 하자
- 좋은 설계란 적절한 절충을 하는것이다.
MIPS-32 ISA
- 프로세서의 명령어
- 산술 논리 작업
- load-store 작업
- 의사결정 기능
- MIPS의 명령어 카테고리
- 산술 논리 작업
- load-store 작업
- 점프, 분기 작업
- 부동소수점 작업
- 메모리 관리 작업
명령어가 취하는 형식
모든 포멧은 32 bits의 길이를 갖는다.
맨 앞에 operation code 를 가진다.
R format : register
I format : immediate
J format : jump target
MIPS Arithmetic Instructions (산술 명령어)
add $t0, $s1, $s2
sub $t0, $s1, $s2
더하기 빼기 -> 임의의 레지스터에 있는 두 값에 대해 연산 후 결과를 또다른 레지스터에 저장
따라서 각각의 산술 명령어들은 하나의 작업을 수행한다.
전체적으로 보면 피연산자(operands)들은 레지스터 파일에 들어있다.($t0, $s1, $s2)
위의 연산을 다시 한번 자세히 보자.
add $t0, $s1, $s2
sub $t0, $s1, $s2
$t0 -> destination
$s1 -> source 1
$s2 -> source 2
add, sub -> op
destination <- source1 op source2
Instruction Format(R format)
명령어 포멧 중 R 포멧이다.
sub $t0, $s1, $s2 에서
sub : 0(operation code)과 0x22
$s1 : 17 (17번 레지스터라는 의미)
$s2 : 18 (18번 레지스터라는 의미)
$t0 : 8 (8번 레지스터라는 의미)
따라서 위의 산술연산은 18번 레지스터와 17번 레지스터에서 값을 가져와 연산한 후 8번 레지스터에 저장하게된다.
MIPS Instruction Fields ( MIPS 명령어 필드 )
아래 그림은 MIPS 명령어를 구성하는 32bit 의미
op : 구체적인 동작을 나타내는 opcode
rs : 첫번째 피연산자
rt : 두번째 피연산자
rd : 결과값이 저장되는곳
shamt : 쉬프트 명령어에서 어느정도 쉬프트 할지?
funct : 6비트의 opcode를 보충해주기 위한 코드
MIPS Register File
레지스터 파일 : 전체 레지스터들의 집합
32개의 레지스터가 각각 4byte의 길이를 가진다.
src1 addr, scr2 addr 레지스터의 값을 읽고, 연산한 결과값은 dst addr에 저장한다. 이때, wite data 저 부분을 통해 쓰기인지/읽기인지 control 이 된다. (위에서는 write)
다시말해, 위의 경우 write를 하게되는데, write data /32 저 라인을 통해 데이터가 들어오게 된다.
한편 /5 /32와 같이 저 숫자는 병렬로 동시에 전달할 수 있는 데이터의 크기(물리적으로 5개, 32개...)이다.
왜 레지스터인가?
- 메인 메모리보다 빠르다.
- 컴파일러가 사용하기 편리하다.
- 변수들을 유지하고 있어 코드의 밀도(code density)를 고려하기 유리하다.
참고자료 : MIPS Register Convention
참고만 하자.
MIPS Memory Access Instructions (MIPS 메모리 접근 명령어)
lw $t0, 4 ( $s3 ) #load word from memory
sw $t0, 8 ( $s3 ) #store word to memory
메모리에 접근하여 명령어를 가져오거나, 연산한 결과를 메모리에 저장하는.... 즉 load / store 이다.
대표적으로 lw (load), sw (store) 가 있다.
메모리 주소는 32bit이다. base address register에 들어있는 값에 offset 값을 더해 접근할 메모리 주소를 구한다.
Machine Language - Load Instruction
Load/Store Instruction Format ( I format )
아래를 보면 위에서 다루었던 R 포멧과는 조금 다르다.
전체 길이는 32bit로 같지만, R포멧의 뒤 세 필드가 합쳐져$24_10$(상수값)가 위치한 필드가 되었다.
lw : 35, operation code
$t0 : 8번 레지스터
$s3 : 19번 레지스터, s3 레지스터에 들어있는 내용
24 : $24_10$, offset 값 접근할 메모리 주소를 계산하는데 필요한 내용
접근할 메모리 주소를 계산하기 위해서는 $s3에 들어있는 값에 offset값을 더해야 한다. 즉
0x12004094에 $24_10$을 더하면 0x120040ac 가 된다.
이후 $t0 에 대한 동작을 진행하면 0x120040ac 에 대한 동작이 진행되게 된다.
Memory Access Example : Array (배열의 요소에 접근하는 경우)
lw $t0, 4 ( $s3 ) // $s3에서 4 더한 위치에 있는 내용을 $t0에 넣고...
add $t0, $s2, $t0 //$t0의 값과 $s2의 값을 더해 $t0에 다시 저장하고...
sw $t0, 12 ( $s3 ) //$t0에 있는 값을 $s3에서 12 더한 위치에 저장
MIPS Immediate Instructions (즉각적인 명령)
보통 작은 상수가 많이 쓰인다.
그렇다면, 명령어가 상수값을 직접 갖고있게 하면 어떨까?
당연히 포멧은 I format이 된다.
상수값이 명령어 내부 그 자체에 유지가 된다!
따라서 그 상수값의 표현 범위도 $+2^15-1$부터 $-2^15$ 사이로 제한된다.
저장 위치는 0x0F 저 부분.
'ETC > CS' 카테고리의 다른 글
[기술면접] 1. CS - 개발상식 (0) | 2021.11.26 |
---|---|
[컴퓨터구조] ch.2-4 MIPS (0) | 2020.10.26 |
[컴퓨터구조] ch.2-2 산술 동작 (0) | 2020.10.24 |
[컴퓨터구조] Ch.2-1 컴퓨터 언어 - Language of the Compute (0) | 2020.10.24 |
[컴퓨터구조] Ch.1 컴퓨터 추상화와 기술 - Computer Abstractions and Technology (0) | 2020.10.21 |
댓글