일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 모달인듯 모달 아닌 뷰
- Swing
- NavigationBar
- class
- scroll
- 컴퓨터 구조
- 순차 컨테이너
- 2020.04.19
- UIView
- 컴퓨터구조
- 스택
- Constraint
- list
- 백준 10828
- 백준 1920
- 2020.06.14
- 알고리즘
- Reverse Engineering
- Stack
- UIPanGestureRecognizer
- ios
- BOJ
- 2020.05.17
- 표준 템플릿 라이브러리
- SWiFT
- struct
- Reversing
- Animation
- vector
- stl
- Today
- Total
야금야금
#6 컴퓨터구조 - MIPS구조 본문
MIPS 시스템
:밉스 테크놀로지에서 개발한 RISC ISA이다.
1980년대 스탠포드 대학에서 John Hennessy와 그의 동료들에 의해 개발되었으며 Silicon Graphics, Nintendo, Cisco의 제품에서 사용되고 있다.
[설계 원칙 1]
· 규칙적인 것이 간단성을 위해 좋음
- 일관성있는 명령어 형태
- 같은 수의 피연산자 (두 개의 source와 한 개의 destination)
- 하드웨어로 구현하기 쉬움
명령어
- Addition
High-level code : a = b + c ;
MIPS assembly code : add a, b, c
- Subtracton
High-level code : a = b - c ;
MIPS assembly code : sub a, b, c
[설계 원칙 2]
· 많이 발생되는 사항을 빨리 처리함
- MIPS : 단순하고 많이 사용되는 명령어를 포함
- 명령어를 해석하고 실행하는 하드웨어 : 단순하고 빠름
- 복잡한 명령어는 여러 개의 단순한 명령어로 수행됨
· 컴퓨터 구조 분류
- RISC (Reduced Instruction Set Computer) : MIPS
- CISC (Complex Set Instruction Set Computer) : Intel의 IA-32
· 복잡한 코드 : 여러 개의 MIPS 명령어에 의해 처리됨
High-level code : a = b + c - d ;
MIPS assembly code : ① add t, b, c
② add a, t, d
[설계 원칙 3]
· 적을수록 빠름
- MIPS: 적은 수의 레지스터를 포함
- 32개의 레지스터 (32비트 또는 64비트)
- 32개의 레지스터로부터 데이터를 획득하는 것이 1000개의 레지스터 또는 메모리로부터 데이터를 획득하는 것보다 빠름
MIPS 레지스터 세트
· 레지스터를 사용한 명령어
High-level code : a = b + c ;
MIPS assembly code : $s0 = a, $s1 = b, $s2 = c
add $s0, $s1, $s2
High-level code : a = b + c - d ;
MIPS assembly code : $s0=a , $s1=b, $s2=c, $s3=d
sub $t0, $s2, $s3
add $s0, $s1, $t0
1. 워드 주소 메모리
( 1word = 4byte )
1) load 명령어 (lw)
- 명령어 형식 : lw dest offset(base)
ex) lw $s3, 1($0) # word 1에서 데이터를 읽어와서 $3 레지스터에 저장
2) store 명령어 (sw)
- 명령어 형식 : sw src, offset(base)
ex) sw $t4, 0x3($0) # t4에서 데이터를 읽어와서 word1에 저장
2. 바이트 주소 메모리
1) load 명령어 (lw)
- 명령어 형식 : lw dest offset(base)
ex) lw $s3, 4($0) # 4번지에서 데이터를 읽어와서 $3레지스터에 저장
# 4byte = 1 word이므로 메모리 읽기의 lw $s3, 1($0)와 같은 위치를 가리킴
2) store 명령어 (sw)
- 명령어 형식 : sw src, offset(base)
ex) sw $t7, 12($0) # t7에서 데이터를 읽어와서 12번지(0000 000C)에 저장
Big-Endian vs Little-Endian
Endian : 컴퓨터 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법
(= 데이터를 어떤 순서로 메모리 위치에 저장할 것인가 )
Big-Endian : 최상위 바이트부터 차례로 저장하는 방법
Little-Endian : 최하위 바이트부터 차례로 저장하는 방법
ex) $t0의 값이 0x23456789라고 가정할 때, 아래의 프로그램이 Big-Edian시스템과 Little-Edian 시스템에서 수행한 후의 $s0의 값은?
[설계 원칙 4]
· 좋은 설계는 좋은 절충안을 요구함
- 다중 명령어 형태는 융통성 제공
① add, sub : 3개의 레지스터 피연산자 사용
② lw, sw : 2개의 레지스터 피연산자와 상수 사용
- 적은 수의 명령어 형태를 유지함
기계어
- 명령어들의 이진 표현 (0 또는 1)
- 32비트 명령어
- 명령어 형태
· R-Type
· I-Type
· J-Type
R-Type
- 레지스터 타입
- 3개의 레지스터 피연산자(오퍼랜드)
· rs, rt : source레지스터
· rd : destination레지스터
- 다른 필드
· op : operation 코드 (모든 R-Type명령어의 op 코드값 : 0)
· funct : function
· shamt : shift명령어에서 사용되는 shift의 양
I-Type
- 즉시값(Immediate) 타입
- 3개의 피연산자(오퍼랜드)
· rs, rt : 레지스터 피연산자
· imm : 16비트 즉시값(immediate)
- 다른 필드
· op : operation 코드 (op 코드)
· 각각의 I-type명령어는 개별적인 op 코드값을 가짐
J-Type
- Jump 타입
- 1개의 피연산자(오퍼랜드)
· addr : 주소 피연산자
- 다른 필드
· op : operation 코드 (op 코드)
기계어 코드 해석
: opcode를 분석한다
1) opcode가 0이면,
- R-type명령어
- func 비트를 통해서 명령어 기능 분석
2) opcode가 0이 아니면,
- I-type 또는 J-type 명령어
명령어 알아보기
논리(logical) 명령어
· and, or, xor, nor
- and : 원치 않는 비트를 0으로 만드는 비트 마스킹에 유용함
- or : 두 레지스터의 비트를 결합시키는데 유용함
- nor : 비트들을 역전시키는데 유용함
· andi, ori, xori
- 16비트 즉시 값(immediate)이 and, or, xor의 피연산자로 포함됨
- 16비트 즉시 값은 32비트로 변환될 때, 제로 확장(zero-extended)됨
조건부 분기 beq (branch on equal)
: 두 레지스터의 값이 같을 경우 분기한다
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
sll $s1, $s1, 2 # $s1 = 1 << 2 = 4
beq $s0, $s1, target # $s0 = $s1= 4, 따라서 target으로 분기
addi $s1, $s1, 1 # 실행되지 않음
sub $s1, $s1, $s0 # 실행되지 않음
target:
add $s1, $s1, $s0 # $s1 = 4 + 4 = 8
조건부 분기 bne (branch on not equal)
: 두 레지스터의 값이 다를 경우 분기한다
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
sll $s1, $s1, 2 # $s1 = 1 << 2 = 4
bne $s0, $s1, target # $s0 = $s1= 4, 따라서 target으로 분기 X
addi $s1, $s1, 1 # $s1 = 4 + 1 = 5 (실행됨)
sub $s1, $s1, $s0 # $s1 = 5 – 4 = 1 (실행됨)
target:
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
무조건 분기 j
: 무조건 분기한다.
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
j target # target으로 무조건 분기
bne $s0, $s1, target # 실행되지 않음
addi $s1, $s1, 1 # 실행되지 않음
sub $s1, $s1, $s0 # 실행되지 않음
target:
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
무조건 분기 jr
: 레지스터가 가진 목적지 주소로 무조건 분기한다
0x00002000 addi $s0, $0, 0x2010
0x00002004 jr $s0
0x00002008 addi $s1, $0, 1
0x0000200C sra $s1, $s1, 2
0x00002010 lw $s3, 44($s1)
if문
: i != j 일 경우 L1으로 분기하여 add $s0, $s1, $s2 ( f = g + h )가 실행되지 않도록 한다
if / else 문
: i != j 일 경우 (else의 경우) L1으로 분기하여 sub $s0, $s0, $s3 ( f = f - i )가 실행되도록 한다
i == j 일 경우 (if의 경우) bne를 통해 분기하지 않고 add $s0, $s1, $s2( f = g + h )가 실행되도록 한다.
while 루프
: $s0와 $t0가 다르면 분기하지 않고 아래 명령어를 실행하고 무조건 분기문으로 돌면서 while문을 실행한다
$s0와 $t0가 같으면 done으로 분기하여 반복 루프를 탈출한다.
for 루프
: $s0가 10이 될 때까지 분기를 하며 반복문을 실행한다
Less Than비교
: $s0과 $t0을 비교하여 $s0가 더 작다면 $t1의 값을 1로 정한다.
$t1과 $s0이 같다면 done으로 분기한다.
문제
Q1. 다음은 어떤 타입의 명령어인가?
답 : _____________
Q2. 다음 중 데이터를 최상위 바이트부터 차례로 저장하는 방법은? (Big-Endian / Little-Endian)
Q3. 다음 중 명령어 실행 후 $s1값이 다른 것은?
①
②
③
Q4. 다음 중 기계어 코드에서 opcode가 0이 아닌 것을 모두 고르시오
① R-type
② I-type
③ J-type
Q5. 다음 for 루프에서 반복문 탈출 조건은 무엇인가?
Q6~Q7. 다음 MIPS assembly 코드를 보고 High-level code를 완성하시오
해설
A1. R-type
- 레지스터 타입
- 3개의 레지스터 피연산자(오퍼랜드)
· rs, rt : source레지스터
· rd : destination레지스터
- 다른 필드
· op : operation 코드 (모든 R-Type명령어의 op 코드값 : 0)
· funct : function
· shamt : shift명령어에서 사용되는 shift의 양
A2. 다음 중 데이터를 최상위 바이트부터 차례로 저장하는 방법은? (Big-Endian / Little-Endian)
: Big-Endian은 최상위 바이트부터 차례로 저장하는 방법이다
A3. ②
A4. 다음 중 기계어 코드에서 opcode가 0이 아닌 것을 모두 고르시오
① R-type
② I-type
③ J-type
A5.
답 : $s0와 $t0가 같은 값을 가질 때
A6~A7.
< 출처 >
강의노트, 디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007, 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011
'SWING > 컴퓨터구조' 카테고리의 다른 글
#5 컴퓨터 구조 - 캐시 기억장치 (2) | 2020.06.06 |
---|---|
#4 컴퓨터 구조 - 명령어 형식 (0) | 2020.05.30 |
#3(2) 컴퓨터 구조 - 메모리 구조 & 레지스터 종류 (0) | 2020.05.23 |
#3 컴퓨터 구조 - 명령어를 효과적으로 처리하기 위한 기법 (0) | 2020.05.23 |
#2-(2) 컴퓨터 구조 - 어셈블리 명령어 (0) | 2020.04.18 |