1. MIPS 시스템의 개요

-MIPS는 S(Microprocessor without interlocked pipeline stage의 약자로 컴퓨터 분야에서 밉스 테크놀로지에서 개발한 축소 명령 집합 컴퓨터(RISC)의 구조 및 그 구조를 이용한 마이크로프로세서임.
-1980년대 스탠포드대학에서 John Hennessy와 그의 동료들에 의해 개발됨
-Silicon Graphics, Nintendo, Cisco의 제품에서 사용되고 있음

2. 디자인 원리

-규칙적인 것이 간단성을 위해 좋음
-많이 발생되는 사항을 빨리 처리함
-적을수록 빠름
-좋은 설계는 좋은 절충안을 요구함

3. 설계 원칙 1

규칙적인 것이 간단성을 위해 좋음

-일관성있는 명령어 형태
-같은 수의 피연산자 (두 개의 source와 한 개의 destination)
-하드웨어로 구현하기 쉬움

명령어는 Addition(덧셈)과 Subtraction(뺄셈)뿐이다.

-Addition(덧셈)
a = b + c 는 밉스 어셈블리 코드로 add a, b, c 로 나타낼 수 있다. 여기서 add는 연산코드이며, a는 목적지, b와 c는 각각 소스1, 2이다. 밉스 어셈블리 코드에서는 무조건 destination코드 위치가 정해져있음을 주의한다.

-Subtraction(뺄셈)
a = b - c 는 밉스 어셈블리 코드로 sub a, b, c 로 나타낼 수 있다. 덧셈과 같이 sub는 연산코드, a는 목적지, b와 c는 각각 소스1, 소스2이다.

4. 설계 원칙 2

많이 발생되는 사항을 빨리 처리함

-MIPS: 단순하고, 많이 사용되는 명령어를 포함
-명령어를 해석하고 실행하는 하드웨어: 단순하고 빠름
-복잡한 명령어는 여러개의 단순한 명령어로 수행됨

명령어 한 줄을 처리하는 데 시간이 단축되어 빠르다는 장점이 있다.

컴퓨터 구조 분류

RISC (Reduced Instruction Set Computer): MIPS
CISC (Complex Set Instruction Set Computer): Intel의 IA-32

복잡한 코드: 여러개의 MIPS 명령어에 의해 처리됨

a = b + c - d 는 add t, b, c 와 sub a, t, d 라는 두 개의 밉스 명령어를 사용한다.
먼저 add t, b, c 는 t = b + c 라는 의미이며 sub a, t, c는 앞서 나온 결과 값 t를 이용하여 a = t - d 라는 의미이다. 즉 t 대신 b + c 를 넣으면 a = b + c - d 이기 때문에 같다.

5. 설계 원칙 3

적을수록 빠름

-MIPS: 적은수의 레지스터를 포함
-32개의 레지스터 (32 비트 또는 64 비트)
-32개의 레지스터로 부터 데이터를 획득하는 것이 1000개의 레지스터 또는 메모리로 부터 데이터를 획득하는 것 보다 빠름

6. MIPS 레지스터 세트(레지스터 이름 / 레지스터 번호 / 사용법)

$0 / 0 / 상수값 0
$at / 1 / 어셈블러 임시용
$v0 - $v1 / 2 - 3 / 프로시저 리턴 값(함수 결과값)
$a0 - $a3 / 4 - 7 / 프로시저 인자
&t0 - $t7 / 8 - 15 / 임시 변수
$s0 - $s7 / 16 - 23 / 저장 변수
$t8 - $t9 / 24 - 25 / 임시 변수
$k0 - $k1 / 26 - 27 / 운영체제 임시용
$gp / 28 / 전역 포인터
$sp / 29 / 스택 포인터
$fp / 30 / 프레임 포인터
$ra / 31 / 프로시저 반환 주소

레지스터 마다 각각 할 일(역할)이 정해져있다.

7. 레지스터를 사용한 명령어

a = b + c 는 $s0 = a, $s1 = b, $s2 = c 일 때, add $s0, $s1, $s2 한 것과 같다.
a = b + c - d 는 $s0 = a, $s1 = b, $s2 = c, $s3 = d 일 때, sub $t0, $s2, $s3 와 add $s0, $s1, $t0 를 한 것과 같다.

8. 워드(word) 주소 메모리

1워드 차이가 주소에서 1씩 차이난다.

-load 명령어 (lw)

어셈블리 코드 lw $s3, 1($0) : ($0)은 상수값 0으로 1 + 0 = 1이며 워드 주소 1을 $s3에가져오라는 것이다. 즉 $s3이 목적지가 된다.

-store 명령어 (sw)

어셈블리 코드 sw $t4, 0x3($0) : ($0)은 상수값 0이므로 16진수의 3과 0을 더해 3이다. 여기서는 $t4가 source, 0x3($0)이 목적지이기 때문에 워드주소 3에 $t4의 값을 쓰라는 것이다.

9. 바이트(byte) 주소 메모리

1워드 차이가  주소에서 4씩 차이난다.

-load 명령어 (lw)

항상 가져오는 양은 1word로 정해져있다.
어셈블리 코드 lw $s3, 4($0) : ($0)은 상수값 0으로 4 + 0 = 4이다. 이는 워드 주소 4를 $s3으로 가져오라는 것이다. 즉 $s3이 목적지가 된다.

-store 명령어 (sw)

어셈블리 코드 sw $t7, 12($0) : ($0)은 상수값 0이므로 12와 0을 더해 12이다. 1여기서는 $t7이 source, 12($0)가 목적지이다. 즉 16진수로 12는 C이기 때문에 워드주소 C에 $t7의 값을 쓰라는 것이다.

10. 빅-엔디안, 리틀-엔디안

이는 데이터를 읽어오는 방식에 대해 차이가 있다.

MSB는 제일 높은 주소, LSB는 제일 낮은 주소이다.
빅-엔디안은 높은 주소 -> 낮은 주소 순으로,
리틀-엔디안은 낮은 주소 -> 높은 주소 순으로 데이터를 읽어온다.

예제) $t0의 값이 0x23456789라고가정한다. 아래의프로그램이 Big-Endian 시스템과Little-Endian시스템에서 수행한 후에 $s0의값은?

sw $t0, 0($0)
lb $s0, 1($0) # 1+0 = 1 즉 1번지의 데이터 값을 $s0에 가져와라.

결과 값

Big-Endian: $s0 = 0x00000045
Little-Endian: $s0 = 0x00000067

해설

Big-Endian은 MSB -> LSB 순으로 데이터를 불러오기 때문에 45가 1번지이고,
Little-Endian은 LSB -> MSB 순으로 데이터를 불러오기 때문에 67가 1번지이다.

11. 설계 원칙 4

좋은 설계는 좋은 절충안을 요구함

-다중 명령어 형태는 융통성 제공
(1) add, sub: 3개의 레지스터 피연산자 사용
(2) lw, sw: 2개의 레지스터 피연산자와 상수 사용
:적은 수의 명령어 형태를 유지함

12. 기계어

기계어는 32비트 명령어로, 명령어들을 이진 표현한다. 즉 0과 1로만 나타낸다.
명령어 형태로 R-Type, I-Type, J-Type이 있다.

12-1. R-Type

레지스터의 R을 사용한 R-Type은 3개의 레지스터 피연산자(오퍼랜드)를 갖는다.
rs, rt는 source 레지스터이며, rd는 destination 레지스터이다.
다른 필드는 op 즉 operation 코드(op코드), funct(function), shamt(shift 명령어에서 사용되는 shift 양)이 있다.
R-Type명령어에서는 op코드 값이 모두 0으로 무슨 타입인지 모를 때도 op값을 보고 알 수 있다.
shamt는 예로 곱셈, 나눗셈에서 사용되며, funct는 op가 모두 0이기 때문에 명령어를 분류하기 위해 사용한다.

예시)

어셈블리 코드를 먼저 10진수의 R-Type으로 바꾸면

이렇게 된다. R-Type이기 때문에 op코드가 0, rs와 rt는 source, rd는 destination이다. 여기서는 곱셈과 나눗셈이 없으므로 둘 다 0이고 funct는 add는 32, sub은 34로 나타낸다.
이를 기계어 즉 2진수로 바꾸면

결론적으로 이런 값을 얻는다.

12-2. I-Type

즉시값(Immediate) 타입으로 3개의 피연산자(오퍼랜드)를 가진다. rs, rt는 레지스터 피연산자이며 imm은 16비트의 즉시값이다.
다른 필드로는 op코드가 있다.
R-Type과는 달리 funct가 존재하지 않는 이유는 op코드가 이미 개별적인 값을 갖기 때문이다.
여기서 중요한 점은 imm이 10진수의 상수값을 가지는 것이다.

예시)

addi에서 i는 즉시값 타입을 나타내고 있다. 여기서 rt가 목적지, rs와 imm이 source이다.
이를 I-Type으로 나타내면

addi $s0, $s1, 5에서 $s0은 rt로, $s1은 rs로 상수 5는 imm값으로 들어간다. 또한 더하는 명령어의 op코드 값인 8이 op자리에 들어간다.
lw $t2, 32($0)에서 처럼 피연산자가 하나, imm값이 하나인 경우에는 피연산자가 rt값에 들어간다.
이를 기계어 코드로 바꾸면

결론적으로 이런 값을 얻는다.

12-3. J-Type

Jump타입으로 1개의 피연산자(오퍼랜드) addr를 가진다. 이는 주소 피연산자이다.
다른 필드로는 op코드가 있다.
분기 명령어 때 사용되는 명령어 형식이다.

addr은 어디로 갈 지의 데이터가 들어있다.

13. 기계어 코드 해석

순서
(1) opcode 분석
(2) opcode가 0이면 R-Type으로 funct비트를 통해서 명령어 기능 분석
(3) opcode가 0이 아니면, I-Type 또는 J-type 명령어

예시)

먼저 0x2237FFF1은 기계어 코드를 4비트씩 쪼개 16진수로 만든 것이다. 또한 op코드가 0이 아니고 imm이 있는 것을 보면 I-Type인 것을 알 수 있다.
0x02F34022도 기계어 코드를 4비트씩 쪼개 16진수로 만든 것이며 op코드가 0이므로 R-Type인 것을 알 수 있다.

14. 조건부 분기 (beq)

먼저 i가 붙은 것을 봐서 I-Type이다. 또한 첫 번째가 목적지임을 생각하고 코드를 분석하면
$s0 = 0 + 4 = 4
$s1 = 0 + 1 = 1
$s1 = 1 << 2 = 4 이다.
여기서 sll 은 시프트 연산으로 예를들어 0001을 왼쪽으로 2 시프트 하면 0100이 되기에 4가 된다.
이후 나오는 beq에서는 $s0과 $s1이 같으면 target으로 가라는 명령어다. 현재 $s0과 $s1은 4로 같기 때문에 target으로 바로 분기한다. 따라서 beq후에 나오는 addi와 sub명령어는 수행하지 않는다.
target에서의 코드는 $s1 = 4 + 4 = 8 이다.

15. 조건부 분기 (bne)

bne는 $s0과 $s1이 같지 않을 경우 분기하는데 여기서는 같기 때문에 분기 하지 않고 다음 명령어를 수행한다.

16. 무조건 분기 (j)

무조건 분기의 경우 조건을 따지지않고 분기하기 때문에 목적지 target만 있다.
j를 만나면 바로 분기한다. 따라서 sra, addi, sub의 명령어를 수행하지 않는다.

17. 무조건 분기 (jr)

jr은 레지스터를 가지는데 그 레지스터의 데이터를 주소로 판단한다.
즉 $s0으로 무조건 분기하라는 것으로 현재 $s0은 0x2010으로 lw명령어 주소이기 때문에 그곳으로 분기한다.
따라서 사이에 있는 addi와 sra명령어를 수행하지 않는다.

18. if문

if문의 조건은 i와 j가 같으면인데 mips에서는 bne 즉 i와 j가 같지 않으면을 쓴다.
그 이유는 if조건이 같지 않으면 수행을 하지 않아야 하기 때문이다.
bne에서 조건이 같지 않으면 add를 수행하면 안되기 때문에 L1으로 분기하는 것이다.

19. if/else문

그냥 if문과는 달리 j done이 추가된 것을 볼 수 있다.
if문의 조건이 아니면 else문을 실행해야 하기 때문에 mips에서 bne(조건이 다르면) L1으로 분기하라는 것이 있으며 마만약 조건이 같으면 분기 하지 않고 add를 수행한다. 이후 else문은 수행을 하면 안되므로 j를 사용해 done으로 무조건 분기한다.

20. while루프

while문에서 pow가 128이 아닐동안 수행하는 것이기 때문에 128이 되면 while문을 돌면 안된다. 따라서 mips에서 while문이 beq인 이유가 pow가 128이면 돌지 않고 분기해야하기 때문이다. 또한 while문의 마지막에 j가 있는 이유는 계속해서 돌아야하기 때문에 while로 다시 분기를 하는 것이다.

21. for루프

for문에서 i가 10이 아닐 동안 돌아야하기 때문에 i가 10이 되면 돌지 않아야 한다. 따라서 mips에서 i가 10일 경우 분기하도록 beq $s0, $t0, done이 되어 있다. 또한 계속 돌기위해 for문 마지막에 다시 for문으로 분기하는 j 명령어가 있다.

22. Less Than 비교

먼저 볼 것은 loop에 있는 slt명령어이다. 이는 Set on less than의 약자로 slt $t1, $s0, $t0 dms 만약 $s0 < $t0이면 $t1에 1을 넣고 아니면 0을 넣으라는 것이다.
즉 slt a, b, c가 있으면 b와 c를 비교해 a값을 정하는 것이다.
또한 loop의 beq는 break코드로 이해하면 된다.
slt에서 i가 101보다 크거나 같으면 0을 넣기 때문에 beq에서 $t1이 0이면 분기하면 된다.


문제

더보기

1. MIPS assembly code로 add a, b, c가 있다. 여기서 목적지는 어디인지 쓰시오. ( )

2. MIPS assembly code로 add t, b, c sub a, t, d로 나타낼 때 이를 High-level code로 나타내시오.

( )

3. 이미지에 대한 설명으로 옳지 않은 것을 고르시오.

1) 바이트 주소 메모리이다.

2) lw명령어에서 가져오는 양은 1word로 정해져있다.

3) sw $t7, 12($0)은 워드주소 10진수 12에 $t7을 쓰라는 것이다.

4) 현재 1word당 4byte이다.

4. 보기를 리틀엔디안 시스템에서 수행한 후 $s0의 값을 구하시오.

보기) sw $t0, 0($0) lb $s0, 2($0)

( )

5. 어떤 명령어 형태인지 쓰시오. ( )

6. for루프를 MIPS assembly code로 나타내려고 한다. 빈칸에 들어갈 명령어를 쓰시오. ( )

7. High-level code를 MIPS assembly code로 바꾸려고 한다. 빈칸에 들어갈 내용을 쓰시오. ( )


답안

더보기

1. a

Mips 명령어는 첫 오퍼랜드가 목적지로 고정되어 있다.

2. a = b + c – d

add t, b, c 는 t = b + c의 코드이고, sub a, t, d 는 a = t - d의 코드 이기 때문에 위의 t를 밑에 대입하면 a = b + c - d가 된다.

3. 3

sw $t7, 12($0)은 워드주소 10진수 12에 $t7을 쓰라는 것이다. 에서 10진수 12가 아닌 10진수 12를 16진수로 바꾼 C에 쓰라는 것이다.

4. 45

위의 사진은 빅 엔디안 시스템이다. MSB에서 LSB로 주소가 증가하기 때문이다. 리틀엔디안 시스템은 LSB에서 MSB로 주소가 증가함으로 89, 67, 45, 23순서이다. 즉 2번 주소는 45이다.

5. R-Type

op코드가 0이므로 R-Type이다.

6. beq $s0, $t0, done

for문에서 i가 10이 아닐 동안 돌고 i가 10이면 나와야하기 때문에 i가 10이면 분기하게 만들면 된다.

즉 $s0과 $to이 같으면 done으로 분기하도록 beq 명령어를 써서 나타낸다.

7. beq $t1, $0, done

i가 101보다 작을 동안 돌아야 하고 i가 101보다 커지면 나와야한다.

slt에서 i가 101보다 크거나 같으면 0을 넣기 때문에 beq를 사용해서 $t1이 0이면 분기하도록 하면 된다.


출처
2019 컴퓨터 구조 호준원 교수님 강의노트 9
디지털논리와 컴퓨터 설계, Harris et al. (조명완 외 번역), 사이텍미디어, 2007
컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍쳐), 신종홍 저, 한빛미디어, 2011

1. 개념

주기억장치에 저장되어 있는 명령어와 데이터 중의 일부를 임시적으로 복사해서 저장하는 장치

cpu안에 있는 것이 아니며 주기억장치와 분리되어 있다. cpu안에 있는 것은 레지스터이다.

 

 

2. 특징

자주 사용되는 명령어들을 저장하고 있다가 cpu가 필요할 때 빠르게 제공하며 데이터를 저장하고 인출하는 속도가 주기억장치보다 빠르다. 속도가 주기억장치보다 빠르고 cpu보다 느리기 때문에 둘의 속도 차이를 줄여주는 고속완충기억장치이며 용량이 작고 비싸지만 빠르다는 장점이 있다.

 

 

3. 캐시 기억장치가 없는 시스템

-동작원리

1단계: CPU가 명령어와 데이터를 인출하기 위해서 주기억장치에 접근한다.

2단계: 주기억장치에서 명령어나 필요한 정보를 획득하여 CPU내의 명령어 레지스터 등에 저장한다.

 

-특징: 주기억장치에 매번 접근해야하기 때문에 속도가 너무 느리다는 단점이 있다.

 

 

4. 캐시 기억장치가 있는 시스템

-동작원리

CPU가 명령어 또는 데이터를 인출하기 위해 주기억장치보다 캐시기억장치를 먼저 조사한다. 만약 캐시기억장치에서 그 명령어 또는 데이터가 있으면 적중(hit)이라고 하고, 없으면 실패(miss)라고 한다.

 

적중일 경우 주기억장치를 방문하지 않고 캐시기억장치에서 얻어진 정보를 CPU로 전송한다.

실패일 경우 주기억장치 들려서 캐시기억장치에 넣고 캐시에서 가져온다. 이때, 굳이 캐시에 넣고 다시 캐시에서 꺼내오는 이유는 나중에 다시 쓸 수도 있기 때문이다.

 

 

4-1. miss

CPU가 1000번지의 워드가 필요한 경우, 지금 상황에서는 캐시기억장치가 빈 상태이기 때문에 실패상태가 된다. 

실패상태일 경우 1000번지가 필요하니까 1000번지를 가져오는데 1001, 1002, 1003도 나중에 CPU가 사용할 것이라고 유추되면 가져온다.

 

 

4-2. hit

CPU가 1002번지의 워드가 필요한 경우

캐시기억장치에 먼저 접근해서 1002번지 워드가 있는지 검사하는데 지금 상황의 경우 캐시기억장치에 1002번 워드가 있기 때문에 주기억장치에 접근하지 않고 캐시기억장치에서 바로 가져온다.

 

 

5. 캐시 기억장치의 적중률

적중률: 캐시 기억장치의 성능을 나타내는 척도

적중률이 높을수록 데이터 액세스 속도가 향상된다.

적중률은 0에서 1사이의 값으로 나타낼 수 있으며 예를들어 10번 캐시기억장치에 접근했을 때 3번 hit을 했다면 3/10으로 적중률은 0.3(30%)이다.

 

이를 기반으로 주기억장치와 캐시기억장치에서 데이터를 인출하는데 소요되는 평균 기억장치 접근시간을 알 수 있다.

Taverage

주기억장치와 캐시기억장치에서 데이터를 인출하는데 소요되는 평균 기억장치 접근 시간

Tmain

주기억장치 접근시간

Tcache

캐시기억장치 접근 시간

Hhit_ratio

적중률

결론적으로 Taverage = Hhit_ratio * Tcache + (1-Hhit_ratio) * Tmain으로 구할 수 있다.

 

예제) Tcache = 50ns, Tmain = 400ns일 때, 적중률을 증가시키면서 기억장치 접근시간 계산을 하면

적중률 70% Taverage = 0.7 * 50ns + 0.3 * 400ns = 155ns
적중률 80% Taverage = 0.8 * 50ns + 0.2 * 400ns = 120ns
적중률 90% Taverage = 0.9 * 50ns + 0.1 * 400ns = 85ns
적중률 95% Taverage = 0.95 * 50ns + 0.05 * 400ns = 67.5ns
적중률 99% Taverage = 0.99 * 50ns + 0.01 * 400ns = 53.5ns

여기서 알 수 있는 점은 먼저 Tcache, Tmain 값을 봤을 때 캐시 접근이 훨씬 적은 시간이 걸린다는 것과, 적중률이 커지면서 주기억장치에 접근하는 횟수가 적어지기 때문에 결론적인 기억장치 접근시간이 훨씬 줄어드는 것이다.

 

 

6. 캐시 기억장치의 설계

주기억장치와 캐시기억장치 간의 정보 공유

워드는 CPU가 한 번에 처리할 수 있는 데이터 단위이고 이 워드들이 모이면 블록이된다.

 

*캐시기억장치 설계시 고려해야할 요소

캐시기억장치의 크기(size)

인출방식(fetch algorithm)

사상함수(mapping function)

교체 알고리즘(replacement algorithm)

쓰기 정책(write policy)

블록 크기(block size)

캐시기억장치의 수(number of caches)

 

 

6-1. 캐시 기억장치의 크기

-캐시기억장치의 크기가 클수록 확보할 수 있는 요량이 커지기 때문에 적중률은 높아지지만 즉 hit하는 횟수가 많아지지만 캐시 내용을 모두 확인하는데 시간이 많이 걸리기 때문에 평균 접근 시간과 비용이 증가한다.

-적중률을 향상시키고 평균 접근시간에 대한 저하를 막는 최적의 크기 결정이 필요한데 1K ~ 128K 단어(word)가 최적이라고 한다.

 

 

6-2. 인출 방식

인출방식이란 주기억장치에서 캐시기억장치로 명령어나 데이터 블록을 인출해 오는 방식이다.

요구인출(Demand Fetch) 방식 CPU가 현재 필요한 정보만을 주기억장치에서 블록 단위로 인출해 오는 방식
선인출(Prefetch) 방식 CPU가 현재 필요한 정보 외에도 앞으로 필요할 것이 예측되는 정보도 미리 인출하여 캐시기억장치에 저장하는 방식이다. 예를 들어 어떠한 데이터를 인출할 때 그 정보와 이웃한 위치에 있는 정보들을 함께 인출하여 캐시에 적재한다. 이는 정보를 예측하기위해 학습시켜야하기 때문에 요구인출보다 어려운 방식이다.

 

 

6-3. 사상함수

사상이란 Mapping이라고 하며 주기억장치와 캐시기억장치 사이에서 정보를 옮기는 것을 말한다.

먼저 주기억장치의 구조를 보면 하나의 주소번지에 저장되는 데이터의 단위를 단어(word)라고 하며 단어가 모이면 블록이된다. 캐시기억장치의 구조를 보면 슬롯과 태그가 있는데 슬롯은 데이터 블록이 저장되는 장소이고, 태그는 슬롯에 적재된 데이터 블록을 구분해주는 정보이다.

캐시기억장치의 사상방법에는 직접사상, 연관사상, 집합 연관 사상으로 총 3가지가 있다.

 

6-3-1. 직접 사상(direct mapping)

특징: 캐시기억장치로부터 데이터 블록 인출을 위해 데이터 블록의 슬롯번호에 해당하는 슬롯만 검색하면 된다.

장점: 사상 과정이 간단함

단점: 동일 슬롯 번호를 갖지만 태그가 다른 데이터 블록들에 대한 반복적인 접근은 적중률을 떨어뜨림

 

예제)

1

CPU가 00001번지의 블록을 필요로 하는 경우 실행 전 캐시기억장치는 비어있기 때문에 먼저 주기억장치의 주소를 2개, 3개로 잘라서 앞에 00은 태그로, 뒤에 001은 슬롯번호로 가며 데이터는 그대로 데이터로 넣는다.

2

CPU가 10001번지 블록을 필요로하는 경우도 예제 1번과 똑같이 진행된다.

3

하지만 CPU가 00010번지 블록을 필요로 하는 경우 예제1번과 슬롯번호가 같기 때문에 혼동이 생기며, 태그번호는 다르기 때문에 다시 주기억장치에서 새로 데이터를 가져온다.

4

다음으로 CPU가 00010번지의 블록을 필요로하는 경우 아까 예제 2에서 캐시 기억장치에 넣어놨으니 주기억장치에 접근하지 않고 캐시기억장치에서 바로 데이터를 가져온다.

 

 

6-3-2. 연관 사상(associative mapping)

캐시슬롯번호에 상관없이 주기억장치의 데이터블록을 캐시기억장치의 임의의 위치에 저장한다.

특징: 캐시기억장치로부터 데이터 블록 인출을 위해서 모든 슬롯에 대한 검색이 필요하다.

 

 

6-3-4. 집합 연관 사상(set-associative mapping)

직접 사상과 연관 사상 방식을 조합한 방식으로 아주 중요하다!

캐시는 v개의 집합들로 나뉘며, 각 집합들은 k개의 슬롯으로 구성된다.

직접 사상 방식에 의해 v개의 집합들 중 하나의 집합을 선택하고, 연관 사상 방식에 의해 선택한 집합 내의 k개의 슬롯 중에 하나의 슬롯을 선택한다.

집합은 무작위로 설정되며 여기서 하나의 집합에는 2개의 데이터 즉 2개의 태그가 있다.

 

 

 6-4. 교체 알고리즘

캐시기억장치의 모든 슬롯이 데이터로 채워져있는 상태 즉 full인 상태에서 실패일 때, 주기억장치에서 새로운 데이터 블록을 가져와서 캐시기억장치에 넣어야하는데 이 때 캐시에 있던 데이터 중 무엇을 제거할지 결정하는 방식이다.

직접사상은 교체 알고리즘이 필요지만 연관, 집합 연관 사상에는 교체 알고리즘이 필요하다.

 

종류

LRU(Least Recently Used) 최소 최근 사용 알고리즘
LFU(Least Frequently Used) 최소 사용 빈도 알고리즘
FIFO(First in First out) 선입력 선출력 알고리즘
Random 랜덤

 

 

6-5. 쓰기 정책

-즉시쓰기(Write-though) 방식

CPU에서 생성되는 데이터 블록을 캐시기억장치와 주기억장치에 동시에 기록한다. 이는 데이터의 일관성을 쉽게 보장할 수 있지만 매번 쓰기 동작이 발생할 때바다 캐시기억장치와 주기억장치간 접근이 빈번하게 일어나고 쓰기시간이 길어지게 된다는 단점이 있다.

 

-나중쓰기(Write-back) 방식

캐시기억장치에 기록한 후, 기록된 블록에 대한 교체가 일어날 때 주기억장치에 기록한다. 이는 주기억장치에 기록하는 동작을 최소화 할 수 있지만 중간에 데이터의 손실이나 변조의 위험성이 있어 캐시기억장치와 주기억장치 간에 데이터 불일치가 발생할 수도 있다.

 

 

6-6. 블록 크기

블록크기가 클수록 한 번에 많은 정보를 읽어올 수 있지만 블록 인출 시간이 길어지게 된다. 블록이 커질수록 캐시기억장치에 적재할 수 있는 블록의 수가 감소하기 때문에 블록이 더 빈번히 교체과 된다. 그래서 일반적으로 4 ~ 8 단어가 적당하다.

 

 

6-7. 캐시기억장치의 수

시스템 성능 향상을 위해서 다수의 캐시기억장치들을 사용하는 것이 보편화 되었다.

캐시기억장치들을 계층적 구조나 기능적 구조로 설치한다.

 


문제

더보기

1. 캐시 기억장치는 CPU안에 있으며 데이터를 임시 저장하는 역할을 한다. (O/X)

 

 

2. CPU가 명령어 또는 데이터 인출을 위해 캐시기억장치에 접근했을 때 그 정보가 있으면 (       ), 없으면 (       )라고 한다.

 

 

3. CPU가 캐시 기억장치에 100번 접근하고 80번 hit이었다고 할 때, 적중률은 (        )%이고, 캐시 접근 시간은 50ns, 주기억장치 접근 시간은 400ns일 때 평균 기억장치의 접근 시간은 (        )ns이다.

 

 

4. 직접사상 방식에서 CPU가 01010번지의 블록을 필요로 하고 있다. 현재 캐시기억장치는 MISS여서 주기억장치에서 데이터를 가져왔다고한다. 이 때, 데이터를 가져온 후 캐시기억장치의 슬롯번호에는 (      ), 태그에는 (        )가 저장되어 있다.

 

 

5. 인출방식의 종류 중 CPU가 현재 필요한 정보 외에도 앞으로 필요할 것으로 예측되는 정보를 미리 인출하여 캐시 기억장치에 저장하는 방식은 (           )방식이라고 한다.

 

 

6. 캐시 기억장치의 크기가 클수록, 적중률은 (높아/낮아)지고, 평균 접근 시간과 비용이 (증가/감소)한다.

 

 

7. 집합 연관 사상방식은 (        )와 (              )방식을 조합한 방식이다.

 

 

답안

더보기

1. x

CPU안에 있는 임시 기억장치는 레지스터이다.

 

 

2. 적중(hit), 실패(miss)

 

 

3. 80, 120

적중률은 적중 수 / 전체 메모리 참조 횟수이므로 100번중에 80번 적중했다고 하니 0.8인데 퍼센트로하면 80퍼센트이다. 또한 평균 기억장치 접근시간은 적중률 * 캐시접근시간 + (1 - 적중률) * 주기억장치 접근시간으로 나타낼 수 있으므로 0.8 * 50 + 0.2 * 400 = 120이다.

 

 

4. 010, 01

직접 사상에서 주소 앞 2개는 태그로 뒤 3개는 슬롯번호로 들어간다.

 

 

5. 선인출방식

이는 주기억장치에서 명령어나 데이터를 인출할 때 필요한 정보와 이웃한 위치에 있는 정보들을 함께 인출하여 캐시에 적재하는 방식이다.

 

 

6. 높아, 증가

 

 

7. 직접 사상, 연관 사상

 


추가 문제

더보기

1. 보조기억장치 중 접근 방식이 다른 하나를 고르시오.

1)하드 디스크

2)자기 테이프

3)플로피 디스크

4)DVD

5)CD-ROM

 

 

2. 입출력 처리 속도를 높이기 위해서, 입출력장치들과 중앙처리장치, 주기억장치사이에서 제어 역할을 하는 장치를 (             )이라고 한다.

 

 

3. 입출력 명령에 대한 내용으로 알맞은 것은?

입출력 명령 내용: 주변 장치를 활성화 시키고 무엇을 해야 하는지 알리는 데 사용한다.

1) 제어

2) 검사

3) 읽기

4) 쓰기

 

 

4. 직접 기억장치 액세스(DMA) 방식에 대한 설명으로 옳지 않은 것을 고르시오.

1) DMA 제어기는 CPU로 버스 요구 신호를 전송한다.

2) CPU는 DMA 제어기로 버스 승인 신호를 전송한다.

3) CPU의 도움으로 DMA 제어기가 주기억장치에 데이터를 읽거나 쓴다.

4) 전송할 데이터가 남아있으면, 1단계부터 3단계까지 다시 반복한다.

5) 모든 데이터의 전송이 완료되면 CPU로 INTR신호를 전송한다.

 

 

5. 시스템 버스는 데이터, 주소, 제어 버스로 분류할 수 있으며 인터럽트와 관련된 버스는 제어버스이다. (O / X)

 

 

답안

더보기

1.  2

자기 테이프는 순차적 접근 방법이며, 나머지는 직접 접근 방법이다.

 

 

2. 입출력 모듈

 

 

3. 1

해당 내용은 입출력 명령 중 제어에 해당한다.

 

 

4. 3

DMA 제어기가 주기억장치에 데이터를 읽거나 쓸 때 CPU는 개입하지 않는다.

DMA 제어기가 모든 입출력 동작을 전담하고, CPU는 전송의 시작과 마지막에만 입출력 동작에 관여한다.

 

 

5. O

인터럽트는 제어 버스와 관련있으며 관련 주요 신호에는 인터럽트 요구, 인터럽트 확인 신호가 있다.

 

1. 분기 명령어

분기한다: 연속적으로 가지않고 다른 곳으로 간다.

1-1. 분기의 형태

BRZ(branch if zero) A 조건 코드가 0이면 A번지로 분기하라는 명령어
BR A 무조건 A번지로 분기하라는 명령어 
BRE(branch if equal) R1, R2, A 레지스터 R1과 R2의 내용이 같다면 A번지로 분기하라는 명령어

202번지에 있는 SUB X, Y는 X에서 Y를 빼라는 명령어이다. 뺀 값이 0이 아니라면 그대로 가다가 210번지에서 BR 명령어를 만난 후 무조건 202번지로 분기할 것이다. 하지만 뺀 값이 0이라면 203번지에 있는 BRZ 명령어를 만났을 때 조건코드가 0이기 때문에 211번지로 분기한다. 이후 225번지의 BRE 명령어를 만나 레지스터 R1과 R2 내용이 같은지 비교하고, 같다면 235번지로 분기하고 다르다면 226번지로 갈 것이다.

 

2. 서브루틴

서브루틴은 한 블록으로 구성된 명령어 실행 중에 또 다른 블록으로 구성된 명령어를 삽입하여 실행하는 형태로 호출(CALL)과 복귀 명령어(RET)가 함께 사용된다.

CALL 명령어는 함수를 호출하는 명령어로 돌아와야할 주소를 스택에 저장하고, PC에는 호출될 서브 루틴의 시작 주소를 저장한 후 분기한다. 여기서 스택에 어디로 돌아갈지에 대한 데이터를 넣는 것을 push라고 한다.

RET 명령어는 분기하기 전 프로그램으로 되돌아가는 명령어로 스택에 저장되어있던 주소값을 PC에 넣어 CALL명령어 바로 다음 주소로 되돌아 간다. 여기서 스택에 저장되어있던 주소값을 가지고 오는 것을 pop이라고 한다.

여기서 짚고 갈 것은 push는 어떤 데이터를 넣을지 데이터가 추가적으로 필요하다. 돌아갈 주소가 추가적인 데이터라고 이해하면 된다. 하지만 pop은 추가적인 데이터가 필요없다. 스택은 후입선출구조이기 때문에 무조건 맨 위의 데이터를 가져오기 때문이다.

 

 

210번지에서 서브루틴 SUB1을 호출하면 현재 주소 + 1 = 211을 스택에 넣는다. 돌아왔을 때 210번지의 CALL SUB1을 만나면 무한대로 호출만 하기 때문이다. 그리고 SUB1의 시작주소 즉 250번지의 값을 pc에 넣고 250번지로 분기한다.

이후 260번지에서 서브루틴 SUB2를 호출했기 때문에 260 + 1 = 261을 스택에 넣고 SUB2의 시작주소인 300번지의 값을 pc에 넣고 300번지로 분기한다.

SUB2를 다 돌고 RET명령어를 만나면 다시 *스택포인터가 가리키는 주소를 pc값에 넣고 돌아온다. 261번지로 돌아와 명령어를 수행하던 도중 다시 280번지에서 SUB2를 호출하면 281을 다음 주소인 281을 스택에 넣고 SUB2의 시작주소인 300번지로 분기한다.

SUB2에서 RET를 만나 SUB1로 와서 RET를 만난 후 최종적으로 주프로그램의 END까지 만나면 프로그램이 종료된다.

 

*sp는 스택포인터로 스택의 맨 위를 가리킨다. RET 명령을 만나면 pop한 후 sp는 하나 밑으로 간다.

 

 

 

3. 명령어 분류

오퍼랜드에 저장되는 데이터의 형태에는 4가지가 있다.

주소 주기억장치의 주소나 레지스터의 주소
정수, 고정-소수점 수, 부동-소수점 수
문자 ASCII 코드
논리 데이터 비트(bit)혹은 플래그(flag)

 

오퍼랜드의 수에 따라 다음과 같이 3, 2, 1, 0 주소 방식이 있다.

이제 하나씩 자세히 알아보자.

 

 

3-1. 0주소 명령어

0주소 명령어는 오퍼랜드 없이 연산코드만 있는 것이다.

모든 연산은 스택의 자료들을 활용하기 때문에 스택머신이라고도 한다.

주소를 사용하지 않아 스택의 내용을 변경하면서 수행하기 때문에 원본 데이터가 없다.

 

 

3-2. 1주소 명령어

1주소 명령어는 주소의 형태 오퍼랜드 1개를 가진다.

 

어셈블리 언어) LOAD X        ;AC <- M[X]

*어셈블리어는 ;이 주석이다.

LOAD는 연산코드 X는 기억장치 주소로 X를 가지고 오라는 명령어이다.

M은 메모리를 말하고, []는 포인터같은 역할로 X번지의 데이터를 누산기(AC)에 저장하라는 것이다.

 

 

3-3. 2주소 명령어

2주소 명령어는 오퍼랜드 2개를 포함하는 명령어 형식으로, 둘다 주소를 저장한다.

주로 목적지에 다시 값을 넣음으로 목적지에 있던 원본 데이터가 없어진다.

 

어셈블리 언어) MOV X, Y        ;M[X] <- M[Y]

MOV는 이동시키는 명령어로 X가 목적지주소, Y가 소스주소이다. 즉 Y번지의 기억장치 데이터를 X번지의 기억장치로 이동시킨다.

 

 

3-4. 3주소 명령어

3주소 명령어는 오퍼랜드 3개를 포함하는 명령어 형식으로, 레지스터 주소들을 저장한다.

원본 자료를 파괴하지 않으며 프로그램 전체의 길이가 짧아지지만 명령어 한 개의 길이가 너무 길어진다는 단점이 있다.

또한 하나의 명령을 수행하기 위해 최소 4번의 기억장소 접근이 필요하여 수행시간이 길어진다.

 

어셈블리 언어) ADD X, Y, Z        ;M[X] <- M[Y] + M[Z]

ADD는 더하라는 명령어로 뒤에서 부터 읽어 앞에 넣는다. X가 목적지 주소, Y가 소스2 주소, Z가 소스1 주소이다. 즉 Y와 Z번지의 데이터를 덧셈해서 X번지에 저장하는 것이다.

*목적지 주소가 있는 오퍼랜드의 위치는 cpu제조사 마다 다를 수 있음!

 

 

3-5. 4가지 주소 형식을 사용한 수식 연산 프로그램

X = B * (C + D * E - F / G) 연산 프로그램을 구현후 비교

 

*사용할 명령어들에 대한 정리

명령어 동작
ADD 덧셈
SUB 뺄셈
MUL 곱셈
DIV 나눗셈
MOV 데이터 이동
LOAD 기억장치로부터 데이터 적재(데이터 가져옴)
STOR 기억장치로 데이터 저장

 

 

3-5-1. 0주소 명령어를 사용한 프로그램

0주소는 push랑 pop만쓰고 STOR을 쓰지 않는다.

X = B * (C + D * E - F / G)

0주소 명령어가 실행될 때 스택의 내용을 보자.

피연산자는 PUSH하고, 연산자를 만나면 연산에 사용할 피연산자를 POP한 후에 연산 결과를 PUSH한다.

여기서 B와 C를 바로 곱하지 않는 것은 괄호가 들어갔기 때문이다. 괄호가 들어오면 플래그 레지스터가 활성화 되어서 여는 괄호가 닫는 괄호를 만날 때까지 수행하지 않는다.

 

 

3-5-2. 1주소 명령어를 사용한 프로그램

X = B * (C + D * E - F / G)

 

여기서 AC는 누산기이고 M[A]는 기억장치 A번지에 저장된 데이터 내용을 가리킨다.

106번지 STOS T에서 STOS는 Store String으로 EDI가 가리키는 주소에 EAX값을 저장한다.

T는 기억장치 내의 임시 저장장소의 주소를 나타낸다.

1주소 명령어는 항상 기준이 누산기이다. 누산기에 있는 값을 연산한 후 다시 누산기에 넣는다.

 

 

3-5-3. 2주소 명령어를 사용한 프로그램

X = B * (C + D * E - F / G)

2주소는 명령어 A, B에서 A가 목적지, B가 소스 주소이다.

M[A]는 기억장치 A번지에 저장된 데이터 내용이며 R1, R2는 cpu내의 위치한 레지스터이다.

 

3-5-4. 3주소 명령어를 사용한 프로그램

X = B * (C + D * E - F / G)

3주소는 명령어 A, B, C에서 A가 목적지, B가 소스1, C가 소스2 주소이다. 여기서 주의해야할 점은 DIV나 SUB같은 명령어처럼 소스의 순서가 바뀌면 아예 값이 바뀌는 경우이다. 꼭 소스1에서 소스2를 연산하도록 해야한다.

*목적지 주소가 있는 오퍼랜드의 위치는 cpu제조사 마다 다를 수 있음!!

 

 

3-5-5. 명령어 주소 개수에 따른 장단점

많은 주소를 쓰면 전체적인 명령어 프로그램 길이가 짧아진다. 대신 하나의 명령어 처리 속도가 느려진다. 반면에 주소 개수가 적으면 명령어 인출과 실행 속도가 높아지며 프로그램 길이가 길어진다. 예를 들어 0주소는 가져오는 것, 더하는 것, 넣는 것 모두 따로 있다면 3주소는 가져와서 더하고 넣은 것이 하나의 명령어에 있기 때문이다.

 

 


문제

더보기

1. 분기의 형태 중 조건 분기를 하는 명령어를 모두 고르시오.

1) BRZ

2) BRT

3) BR

4) BRE

5) BRA

 

2. 서브루틴은 호출 명령어 (          )와 복귀 명령어 (           )가 함께 사용된다.

 

3. 현재 pc값이 259에서 260으로 바뀌었다. 이 때 스택에 들어갈 주소(A)와 pc값에 들어갈 주소값(B)을 쓰시오.

 

4. PUSH F는 몇주소 명령어인지 쓰시오.

(               )

 

5. 프로그램의 코드 일부분을 해석한 것이다. 몇주소 명령어인지 쓰시오.
코드 해석:
AC <- M[F]
AC <- AC / M[G]
M[T] <- AC
AC <- M[D]
(               )

 

 

답안

더보기

1. 1, 4

BRZ는 조건코드가 0이면 분기하라는 명령어이고 BRE는 레지스터의 내용이 
같다면 분기하라는 명령어로 둘 다 조건코드가 있기에 조건 분기를 한다.
하지만 BR은 무조건 분기하라는 명령어로 무조건 분기를 하며
BRT와 BRA는 분기 명령어가 아니다.

 

2. CALL, RET

 

3. (A)261, (B)300
스택에는 돌아올 주소가 들어가야한다. 현재 260번지이므로 돌아왔을 때는
260 + 1인 261번지로 와야한다.
pc값은 다음으로 갈 주소가 있어야한다. CALL SUB2명령어는 서브루틴 
SUB2를 호출하라는 뜻으로 SUB2의 시작주소 300이 들어가야한다.

 

4. 0주소 명령어
push는 스택 명령어로 스택을 사용하는 0주소 명령어에서 쓰인다.

 

5. 1주소 명령어
AC는 누산기이다. 연산값을 누산기로 다시 넣는 것을 보아
누산기를 쓰는 1주소 명령어이다.

1. 메모리 구조

프로그램이 실행되기 위해서 운영체제로부터 메모리 공간(RAM)을 할당받는다. 메모리 구조는 아래와 같이 데이터, 코드, 스택, 힙 영역을 가진다.

 

코드영역이 가장 낮은 주소이며 스택영역이 가장 높은 주소이다.

 

여기서 중요한 개념이 있는데 힙 영역과 스택 영역은 사실 같은 공간을 공유하는 것이다. 그래서 힙은 낮은 주소 즉 위쪽 주소부터 할당되고 스택은 높은 주소 즉 아래 쪽 주소부터 할당되는 것이다. 하지만 이 둘이 같은 공간을 공유하기 때문에 서로의 영역에 침범하는 일이 발생할 수 있는데 힙이 침범하면 힙 오버플로우, 스택이 침범하면 스택 오버플로우라고 한다.

스택 영역이 크면 힙 영역이 작아지며, 힙 영역이 커지면 스택 영역이 작아진다.

 

 

 

 

 

1-1. 코드 영역(=텍스트 영역)

-프로그램의 코드가 저장되는 영역으로 소스코드가 들어가는 부분이다. 실행파일을 구성하는 명령어 즉 함수, 제어문, 상수 등이 저장된다. 또한 프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있다.

 

1-2. 데이터 영역

프로그램의 전역 변수, 정적(static) 변수, 문자열 상수가 저장되는 영역으로 프로그램의 시작과 동시에 할당되며 프로그램이 종료되기 전까지 메모리에 있다.

 

1-3. 스택 영역 

프로그램이 자동으로 사용하는 임시 메모리 영역으로 함수 호출 시 생성되는 지역변수와 매개 변수가 저장되는 영역으로 이 변수들의 특징과 같이 함수가 끝나면 사라진다. 컴파일할 때 크기가 결정되며 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 된다. 위 사진에서 처럼 화살표 방향으로 할당된다.

 

1-4. 힙 영역

프로그래머가 할당 및 해제하는 공간이다. 이 공간에 할당하는 것을 동적 할당이라고 하며 malloc함수 또는 new 연산자를 통해 할당되며 free또는 delete에 의해 해제 된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되는 것도 특징이라고 할 수 있으며 런타임 할 때 크기가 결정된다.

 

 

2. 레지스터 종류

2-1. 범용 레지스터

EAX(Extended Accumulator Register) 덧셈, 곱셈, 나눗셈 등 산술 연산과 논리 연산을 수행하며 함수의 반환값이 이 레지스터에 저장되며 함수의 성공, 실패 여부를 파악할 수 있으며 반환값을 가져올 수 있다. 예를 들어 return 10을하면 EAX에 10이 입력된다고 생각하면 된다.
EBX(Extended Base Register) ESI나 EDI와 결합될 수 있으며, 메모리 주소를 저장하기 위한 용도로 쓰인다.
ECX(Extended Counter Register) 반복 명령어를 사용할 때 반복 카운터로 사용되는 레지스터이다.  for, while문과 같은 반복문 수행할 때 카운팅하는 역할이다.
EDX(Extended Data Register) EAX와 함께 쓰이며 큰 수의 곱셈 또는 나눗셈 등의 연산이 이루어질 때 몫은 EAX에 나머지는 EDX에 저장된다.
ESI(Extended Soource Index) 데이터 복사, 조작할 때 사용되며 복사의 원본 주소를 저장한다.
EDI(Extended Destination Index) 데이터 복사, 조작할 때 사용되며 복사의 목적지 주소가 저장된다.
ESP(Extended Stack Pointer) 스택의 끝 주소(가장 최근에 저장된 것)가 저장되며 push, pop 명령에 따라 값이 4바이트씩 변한다.
EBP(Extended Base Pointer) 스택의 시작 주소(가장 처음으로 저장된 것)가 저장되며 값은 고정이다.

2-2. 명령 포인터

EIP(Extended Instruction Pointer) 다음 실행할 명령어가 존재하는 메모리 주소가 저장된다.

2-3. 세그먼트 레지스터

세그먼트는 프로그램에 정의된 메모리 상의 특정 영역이다. 자신에게 지정된 주소를 가리키는 것이 특징이다.

CS(Code Segment) 코드 세그먼트의 시작주소를 가리킨다.
DS(Data Segment) 데이터 세그먼트의 시작주소를 가리킨다. 명령어는 이 데이터 세그먼트를 사용해서 데이터의 위치를 알아낸다.
SS(Stack Segment) 스택 세그먼트의 시작주소를 가리킨다. 메모리 상에 스택 구현을 가능하게 한다. 

2-4. 플래그 레지스터

CF(Carry Flag) 부호 없는 연산 결과가 용량보다 클 때 1이 된다.
ZF(Zero Flag) 산술 및 논리 연산의 결과가 0일 때 1이 된다.
OF(Overflow Flag) 정수형 결과 값이 너무 큰 양수거나 너무 작은 음수여서 오버 플로우가 발생할 때 1이 된다.
SF(Sign Flag) 연산 결과가 음수면 1이 된다.
PF(Parity Flag) 논리적으로 1인 비트의 수가 홀수인지 짝수인지를 신호하는 지시자로, 1인 비트 수가 짝수개면 1이 되고 그 이외의 경우 0이 된다. 
SF(Sign Flag) 음수(부호비트 1)면 1이되고 양수(부호비트 0)면 0이 된다.

 

 


문제

더보기

1. 프로그램이 실행되기 위해서 운영체제로부터 (          )을 할당 받는다. (           )는 데이터, 코드, 스택, 힙 영역을 가진다. 빈칸에 알맞은 용어를 쓰시오.

 

2. 메모리 구조 중 가장 낮은 주소를 가지는 영역을 고르시오.

1) 코드 영역

2) 데이터 영역

3) 힙 영역

4) 스택 영역

 

3. 힙 영역과 스택 영역을 실제도 같은 공간을 공유하는데, 만약 힙 영역이 스택 영역에 침범한 경우에 (             )라고 한다.

 

4. 메모리 구조에 대한 설명으로 알맞지 않은 것을 고르시오.

1) 코드 영역에는 함수, 제어문, 상수 등이 저장된다.

2) 데이터 영역에는 지역 변수, 전역 변수, 문자열 상수가 저장된다.

3) 스택 영역에 저장된 매개 변수는 함수가 끝나면 사라진다.

4) 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

 

5. 데이터를 복사, 조작할 때 필요한 레지스터를 모두 고르시오.

1)EAX

2)ECX

3)ESI

4)ESP

5)EDI

 

답안

더보기

1. 메모리 공간

 

2. 1

주소는 코드, 데이터, , 스택 영역 순으로 커진다.

 

3. 힙 오버플로우

힙 영역이 스택 영역을 침범한 경우 힙 오버플로우, 반대의 경우는 스택 오버플로우라고 한다.

 

4. 2

데이터 영역에는 지역 변수가 아닌 전역 변수, 문자열 상수가 저장되며 프로그램이 시작될 때부터 종료될 때까지 메모리에 있다.

 

5. 3, 5

EAX Extended Accumulator Register로 산술 연산과 논리 연산을 수행한 후, 반환값을 저장한다.

ECX Extended Counter Register로 반복 명령어를 사용할 때 반복 카운터로 사용된다.

ESP Extended Stack Pointer로 스택의 가장 아랫부분이 저장되며 push, pop할 때마다 4바이트씩 값이 변한다.

2주차에서 명령어 형식에 대해서 알아봤다.

3주차에서는 명령어를 효과적으로 실행하기 위한 기법을 다뤄보려고 한다.

 

명령어를 효과적으로 실행하기 위한 기법에는 주소 지정 방식, 파이프 라인 그리고 인터럽트가 있다.

 

1. 주소 지정 방식

주소란 주기억창치에서 데이터가 저장된 위치를 가리킨다. 주소 지정 방식은 주소를 지정하는 방식에따라 직접 주소 지정 방식, 간접 주소 지정 방식, 레지스터 주소 지정 방식, 레지스터 간접 주소 지정 방식, 변위 주소 지정 방식이 있다.

주소 지정 방식에서 쓰이는 내용과 그 내용에 대한 표기법을 알아보자.

 

정의 내용 표기 방법
유효 주소(기억장치의 실제 주소) EA
기억장치 주소 A
레지스터 번호 R
기억장치 A번지의 내용 (A)
레지스터 R번지의 내용 (R)

 

 

1-1. 직접 주소 지정 방식

 

 

-가장 일반적인 개념의 간단한 주소 방식으로 주소 필드에 유효 주소를 직접 저장한다.

-유효주소가 기억장치 주소이며 EA=A로 나타낼 수 있다.

-특징: 화살표가 한 번만 있어서 한 번만 접근하기 때문에 데이터를 빠르게 가지고 올 수 있다는 장점이 있지만, 16비트의 명령어중에서 연산코드가 4비트를 차지하고 있을 경우 오퍼랜드는 총 길이에서 연산코드길이를 뺀 12비트만을 사용할 수 있기 때문에 2^12까지의 주소만 사용할 수 있어 제한적이라는 단점이 있다.

 

 

2-2. 간접 주소 지정 방식

 

 

-유효주소가 기억장치 A의 내용이며 EA=(A)로 나타낼 수 있다. (A)는 포인터의 개념처럼 A라는 포인터가 가리키는 곳의 값이라고 이해하면 된다.

-직접 주소 지정 방식과는 다르게 기억장치에 두 번 접근한다. 처음 접근하는 곳은 유효주소의 주소를 가지고 있으며 두 번째로 접근하는 곳에는 실질적인 데이터가 있는 것이다.

-특징: 직접 접근 방식의 단점을 보완한 방식으로 오퍼랜드의 길이에 제한을 받지 않는다. 이 방식은 최대 기억장치 용량에 따라 활용할 수 있는 주소 공간을 확장할 수 있다. 따라서 긴 주소에 접근할 수 있다는 장점이 있다. 하지만 기억장치에 두 번 접근을 해야해서 직접 주소 지정 방식보다 속도가 느리며, 명령어 형식에서 주소 지정 방식을 표시하는 간접 비트 필드가 필요하다.

 

 

I가 0이면 직접 주소 지정 방식, 1이면 간접 주소 지정 방식이다.

 

 

1-3. 레지스터 주소 지정 방식

 

 

-오퍼랜드에 레지스터 번호가 저장되어 있으며 명령어 수행에 필요한 데이터가 해당하는 레지스터에 저장되어 있다. 주기억장치가아닌 레지스터에 데이터가 있다는 것이 중요하다.

-유효주소가 레지스터의 번호로 EA=R로 나타낼 수 있다.

-특징: 오퍼랜드 필드 비트수가 적어도 되며, 기억장치에 액세스 하지 않기 때문에 데이터 인출 시간이 적다는 장점이 있다. 하지만 데이터가 cpu내부의 레지스터에 저장되기 때문에 저장공간이 속도는 빠르지만 용량은 적은 레지스터로 제한된다.

 

 

1-4. 레지스터 간접 주소 지정 방식

 

 

-레지스터에 저장된 것이 연산에 사용할 실질적인 데이터가 아닌, 그 데이터를 가진 기억장치의 주소이다.

-유효 주소가 레지스터에 저장된 내용을 가리키므로 EA=(R)로 나타낼 수 있다. 간접 접근 지정 방식과 마찬가지로 (R)은 R포인터가 나타내는 곳의 데이터라고 이해하면 된다.

-레지스터의 길이에 따라 주소지정 영역이 결정되는데, 만약 레지스터의 길이가 16비트라면 2^16까지의 주소를 지정할 수 있다.

-특징: 사용되는 레지스터 길이에 따라 많은 주소 공간을 사용할 수 있다는 장점이 있다. 하지만 주기억장치에 직접 2번 접근하는 간접 주소 방식과 달리 주기억장치에는 한 번만 접근해서 메모리 참조가 적게 일어나지만 주기억장치에 접근하기 전 레지스터에 접근해야하므로 여분의 메모리 참조가 필요하다는 단점이 있다. 

 

 

1-5. 변위 주소 지정 방식

 

 

-직접 주소 지정 방식과 레지스터 간접 주소 지정 방식을 조합한 방식이다.

-유효주소가 R이 가리키는 레지스터의 내용과 변위 값 A를 더한 것으로 EA=(R)+A로 나타낼 수 있다. 따라서 두 필드의 조합으로 유효주소가 생성된다.

-16비트의 길이를 가진 레지스터는 2의 16승까지의 주소만 저장 가능하지만 변위값을 더하면 주소값을 더 많이 수용할 수 있기 때문에 이 방식을 사용한다.

-사용하는 레지스터에 따라 상대 주소 지정 방식, 인덱스 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나눌 수 있다.

 

 

1-5-1. 상대 주소 지정 방식

-프로그램 카운터(PC)값을 사용한다.

-주로 분기 명령어에서 사용되는데 분기명령어는 JUMP와 CALL같이 다른 위치의 명령어로 분기시키는 명령어를 말한다.

-유효 주소는 프로그램 카운터의 내용과 기억장치의 주소를 더한 것으로 EA=(PC)+A로 나타낼 수 있다.

-예를 들어, 120번지에 저장된 JUMP 명령어가 인출된 후에, PC의 내용이 121이 된 경우 A가 +50dlaus 171번지가 되고, A가 -70인 경우 51번지가 된다. 여기서 A값을 음수로 사용할 수 있는 이유는 2의 보수로 음수값이 표현가능하기 때문이다.

 

 

1-5-2. 인덱스 주소 지정 방식

-인덱스 레지스터를 사용한다. 인덱스 레지스터란 인덱스 값을 저장하는 특수 레지스터이다.

-유효 주소는 인덱스 레지스터의 내용과 기억장치 주소를 더한 것으로 EA=(IX)+A로 나타낼 수 있다.

-특징: 명령어가 실행될 때마다, 인덱스 레지스터의 내용이 자동적으로 증가 또는 감소하기 때문에 for문 같은 루프 프로그램에서 동일한 명령어를 사용해 배열내의 데이터에 접근하여 연산하는데 효율적으로 사용될 수 있다. 만약 명령어가 실행된다면 EA=(IX)+A와 IX<-IX+1이 연속적으로 수행된다.

 

 

1-5-3. 베이스 레지스터 주소 지정 방식

 

 

-베이스 레지스터를 사용한다.

-유효 주소는 베이스 레지스터의 내용과 기억장치 주소를 더한 것으로 EA=(BR)+A로 나타낼 수 있다.

 

 

2. 명령어 파이프 라인

-하나의 명령어를 여러 단계로 나누어서 단계별로 동시에 수행하여 처리 속도를 향상 시키는 방법이다.

-몇 단계로 나누냐에 따라 2단계, 4단계, 6단계 명령어 파이프라인으로 나눌 수 있다.

-파이프 라인 예시로 좋은 세탁기가 있는데, 세탁물 1, 2, 3이 있다고 하자, 이때 세탁물1의 빨래, 건조, 정리가 다 끝나고 세탁물2를 빨래, 건조, 정리하고 끝나면 또 세탁물3 빨래를 시작하면 시간이 오래걸리며 상당히 비효율적이다. 세탁기, 건조기와 내가 있기 때문에  세탁물이 1개가 모든 과정이 끝날 때까지 기다릴 필요없이 각각 자기 할 일을 수행하면 시간이 훨씬 단축되며 효율적이다.

-파이프 라인은 클록 주기라는 것을 사용하는데 이는 cpu가 명령어를 처리하는 주기이다.

 

 

2-1. 2단계 명령어 파이프 라인

 

 

-명령어를 인출 단계와 실행 단계라는 두 개의 독립적인 파이프라인 모듈로 분리해서 수행한다. 인출 단계에서 명령어 몇개를, 실행 단계에서 명령어 몇개를 동시에 수행하는 것이 아닌, 인출 단계에서 1개, 실행 단계에서 1개를 동시에 수행할 수 있다는 것이다.

-여기서 명령어 1이 들어가면 먼저 인출 단계를 거친다. 이때, 실행 단계는 아무 것도 수행하고 있지 않는다. 명령어 1이 인출 단계가 끝나면 실행 단계로 들어가게 되는데 그렇게 되면 인출 단계는 아무 것도 안하고 있으니 명령어 2를 받아서 수행한다. 이런식으로 각각의 명령어는 다음 명령어를 받아서 수행한다.

-주의할 점은 인출 단계를 거쳐야 실행 단계로 넘어갈 수 있다는 것이다.

 

 

2-2. 4단계 명령어 파이프 라인

 

 

-명령어 인출(IF), 명령어 해독,(ID) 오퍼랜드 인출(OF, 실제 데이터를 인출함), 실행(EX) 이렇게 4단계로 구성된 파이프 라인이다.

-2단계 파이프 라인처럼 명령어 인출이 끝나고 명령어 해독 단계로 넘어가면 다음 명령어가 명령어 인출을 시작한다. 클록 주기에서 '4'자리에 보면 명령어1은 4단계, 명령어2는 3단계, 명령어3은 2단계, 명령어4는 1단계를 동시에 수행하고 있는 것을 볼 수 있다.

 

 

2-3. 6단계 명령어 파이프 라인

 

 

-명령어 인출(FI), 명령어 해독(DI), 오퍼랜드 계산(CO), 오퍼랜드 인출(FO), 명령어 실행(EI), 오퍼랜드 저장(WO) 이렇게 6단계로 구성된 파이프 라인이다.

-2,4단계 파이프 라인과 마찬가지로 하나의 단계가 끝나면 다음 명령어가 그 단계에서 바로 수행된다. 클록 주기에서 '9'자리에 보면 명령어 4는 6단계, 5는 5단계, 6은 4단계 이런식으로 6단계가 각각 다른 명령어를 동시에 수행하고 있다.

 

 

*여기서 흥미로운 점은 4단계와 6단계의 같은 단계라도 영어가 다르다는 것이다.

단계 명 4단계 6단계
명령어 인출 Instruction Fetch IF Fetch Instruction FI
명령어 해독 Instruction Decode ID Decode Instruction DI
오퍼랜드 계산 X X Calculate Operand CO
오퍼랜드 인출 Operand Fetch OF Fetch Operand FO
명령어 실행 Execute EX Execute Instruction EI
오퍼랜드 저장 X X Write Operand WO

 

 

2-4. 파이프 라인에 의한 속도 향상

-명령어 실행 시간 계산

k 파이프 라인 단계 수(2단계는 2, 4단계는 4, 6단계는 6)
N 실행할 명령어들의 수
각 파이프라인의 단계 한 클록 주기씩 소요됨
T 파이프라인을 적용했을 때, N개의 명령어를 실행하는 데 소요되는 시간
T = k + (N - 1)
T 파이프라인을 적용하지 않았을 때, N개의 명령어를 실행하는 데 소요되는 시간
T` = k * N

-먼저 T = k + (N - 1)의 식을 해석해보자면,  k는 첫 번째 명령어를 실행하는 시간이며, (N - 1)은 첫 번째 명령어를 뺀 나머지 명령어들이 소요되는 시간이다.  1*(N - 1)에서 1*을 생략했다고 생각하면 된다. 

4단계 파이프라인을 예시로 들어보자.

 

 

클록 주기를 초단위로 생각해보면 명령어 1은 4초가 걸리고 나머지 명령어들은 1초씩만 사용한다고 생각할 수 있다. 따라서 4단계 파이프 라인에서 명령어 6개 실행시간 T는 명령어 1이 수행되는 시간 4 + 총 명령어 6에서 1을 뺀 값인 5을 하면 9가 된다.

 

이와 달리 파이프라인을 적용하지 않았을 경우에는 명령어 1개당 4개의 단계씩 거치지 때문에 명령어 총 개수 * 단계 수를 하면된다. 따라서 파이프 라인을 적용하지 않고 명령어 6개를 실행하는 시간은 4 * 6 = 24이다.

 

이 둘을 가지고 파이프 라이닝에 대한 속도 향상도 알 수 있는데 파이프 라이닝 하지 않고 소요된 시간 / 파이프 라이닝하고 소요된 시간 즉, T` / T로 나타낼 수 있으며 여기서는 24 / 9 해서 약 2.27배의 속도 향상이 있었다고 말할 수 있다.

 

3. 인터럽트

-cpu가 현재 실행 중인 프로그램의 처리를 강제적으로 중단시키고, 특정 주소에 위치한 프로그램을 수행하는 것이다.

 

 

3-1.동작원리

인터럽트 서비스 루틴(ISR, Interrupt Service Routine): 인터럽트를 처리하기 위해 실행되는 프로그램 루틴이다.

인터럽트가 발생하면 현재 실행하고 있던 프로그램의 중요한 데이터는 주기억장치에 저장되며 중지된다. 중지 된 후 인터럽트 서비스 루틴이 처리하는 프로그램이 종료된 후에 다시 재개된다. 예를 들어 어떤 유튜브 영상을 보고 있는데 친구에게 카톡이 와서 카톡을 확인한 후 다시 유튜브로 가서 아까 보다 멈춘 곳 부터 다시 보는 것이 있다.

 

3-2. 인터럽트 종류와 발생 원인

1)전원 이상 인터럽트(Power Failed Interrupt): 정전이 되거나 이상이 있는 경우 발생한다.

 

2)기계 착오 인터럽트(Machine check interrupt): CPU의 기능적인 오류로 발생한다. 

 

3)입출력 인터럽트(I/O Interrupt): 입출력 데이터의 종료나 오류에 의해 cpu기능이 요청되는 경우 발생하며 예로 사용자 입력 요청을 보냈을 때 사용자의 입력이 끝날 때까지 다음 명령어를 수행안하는 것을 들 수 있다.

 

4)외부신호 인터럽트(External Interrupt): 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우 발생하며 타이머에 의해 설정된 시간을 알리는 경우나 외부 장치로부터 인터럽트 요청이 있는 경우가 있다.

 

5)프로그램 검사 인터럽트(Program Check Interrupt): 오버플로우나 0에 의한 나누기, 프로그램에서 명령어 잘못사용하는 경우처럼 프로그램 실행 중 보호된 기억공간 내에 접근하거나 불법적인 명령 수행으로 발생한다.

 

6) 슈퍼바이저 호출 인터럽트(Supervisor Call Interrupt): 사용자가 슈퍼바이저 호출(SVC) 명령어를 써서 운영체제에 서비스를 요청하거나 복잡한 입출력 처리를 해야하는 경우 발생한다.

 

7)재시작 인터럽트(Restart Interrupt): 콘솔 상에서 재시작 버튼이나 Ctrl-Alt-Del키를 누른 경우 발생한다.

 

 

3-3. 인터럽트 사이클

-인터럽트 발생을 처리하기 위한 사이클로 cpu가 인터럽트 요구의 존재 여부를 검사한다.

 

 

만약 인터럽트 발생이 없으면 다음 명령어를 인출하면 되지만 인터럽트 요구가 대기 중이면, 진행하고 있던 프로그램을 중단 한 후, 프로그램 상태에 저장한다. 이후 프로그램 카운터를 인터럽트 처리 루틴의 시작 주소로 설정하고 인터럽트를 처리한다.

인터럽트를 처리하기 위해서는 현재 프로그램의 데이터를 저장해야 인터럽트가 끝난 후 다시 재개할 수 있으며 프로그램 카운터를 인터럽트 주소로 해야 다음 명령어 대신 인터럽트를 수행할 수 있다.

 

 

3-4. 다중 인터럽트 처리

다중 인터럽트란 인터럽트 서비스 루틴을 수행하는 동안 또 다른 인터럽트가 발생한 것이다. 이 때는 원래 실행하고 있던 인터럽트가 끝난 후에 처리할 지, 또 다른 인터럽트가 발생한 순간 처리하고 원래 실행하던 인터럽트를 처리할 지의 문제가 발생하기 때문에 다중 인터럽트 처리하기 위한 2가지 방식이 있다.

 

-순차적인 다중 인터럽트 처리

 

 

원래 발생했던 x를 처리한 후 y를 처리하는 방식이다. x를 처리할 동안 y는 대기상태에 있다.

 

 

-우선순위 다중 인터럽트 처리

 

 

인터럽트의 우선 순위를 정한 후, 만약 x 우선순위가 높다면 x가 끝난 후 y를 처리하고, y의 우선순위가 높다면 x를 잠시 중단한 후 y를 처리하고 다시 x를 재개한다.

 

*우선순위

전원 이상(Power fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) > 명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)


문제

더보기

1. 기억장치에 두 번 접근하여 데이터를 가져오는 방식 종류로 알맞은 것은?

1) 직접 주소 지정 방식

2) 간접 주소 지정 방식

3) 레지스터 간접 주소 지정 방식

4) 변위 주소 지정 방식

 

2. EA=R로 나타낼 수 있는 주소 지정 방식은?

(                   )

 

3. 변위 주소 지정 방식에서 프로그램 카운터 값을 사용하는 방식은?

1) 상대 주소 지정 방식

2) 인덱스 주소 지정 방식

3) 레지스터 주소 지정 방식

4) 베이스 레지스터 주소 지정 방식

 

4. 6단계 명령어 파이프 라인을 적용했을 때 15개의 명령어를 실행하는 데 소요되는 시간은?

(                   )

 

5. 4단계 명령어 파이프 라인에서 파이프 라인을 적용하지 않았을 때 20개의 명령어를 실행하는 데 소요되는 시간은?

(                    )

 

6. 2단계 명령어 파이프 라인을 적용했을 때 6번째 명령어가 실행되는 시점은? (클록 주기를 기준으로 한다.)

(                    )

 

7. (          )가 발생하면 현재 실행하고 있던 프로그램의 중요한 데이터는 주기억장치에 저장되며 중지된다. 괄호안에 알맞은 용어를 쓰시오.

 

8. 0에 의한 나누기로 발생하는 인터럽트의 종류는?

1) 기계 착오 인터럽트

2) 입출력 인터럽트

3) 외부신호 인터럽트

4) 프로그램 검사 인터럽트

 

9. 우선순위 다중 인터럽트처리에서 만약 외부신호 인터럽트를 실행하는 도중 기계 착오 인터럽트가 나타났을 경우 먼저 실행되는 것은 기계 착오 인터럽트이다. (o / x)

 

10. 5개의 명령어를 4단계 파이프 라인으로 실행했을 때 실행하지 않았을 때보다 속도는 얼마나 향상되는지 계산하시오.

(          )

 

답안

더보기

1. 2

직접 주소 지정 방식은 기억장치에 한 번 접근하며, 레지스터 간접 주소 지정 방식과 변위 주소 지정 방식은 레지스터에 한 번, 기억장치에 한 번 접근한다.

 

2. 레지스터 주소 지정 방식

유효주소가 레지스터의 번호이다. 그 레지스터에는 실질적인 데이터가 들어있다.

 

3. 1

인덱스 주소 지정 방식은 인덱스 값을 저장하는 특수 레지스터인 인덱스 레지스터를 사용하고 레지스터 주소 지정 방식은 레지스터를 사용하며 베이스 레지스터 주소 지정 방식은 베이스 레지스터를 사용한다.

 

4. 20

파이프 라인을 적용할 경우 명령어 실행 시간 T는 파이프 라인의 단계 수 k + 실행할 명령어 수 N – 1  T = k + (N – 1)로 나타낼 수 있다. 따라서 T = 6 + 15 – 1이므로 20이다.

 

5,. 80

파이프 라인을 적용하지 않을 경우 명령어 실행 시간 T`는 파이프 라인의 단계 수 k * 실행할 명령어 수 N  T` = k * N으로 나타낼 수 있다. 따라서 T` = 4 * 20으로 80이다.

 

6. 6

명령어 파이프 라인을 적용할 경우 n번째 명령어는 단계에 상관 없이 n번째 클록에서 시작된다. 첫 번째 단계가 명령어를 하나씩 처리하기 때문이다. 따라서 6번 째 명령어는 6번째 클록에서 시작된다.

 

7. 인터럽트

 

8. 4

기계 착오 인터럽트는 cpu의 기능적인 오류로 발생하며, 입출력 인터럽트는 입출력 데이터의 종료나 오류에 의해 나타나고, 외부신호 인터럽트는 오퍼레이터나 타이머 또는 외부장치로부터 요청이 오면 발생한다.

 

9. O

다중 인터럽트가 발생할 경우 우선 순위 다중 인터럽트 처리에서는 우선 순위가 높은 인터럽트부터 먼저 처리하는데 기계 착오 인터럽트가 외부 신호 인터럽트보다 높기 때문에 먼저 수행된다.

 

10. 2.5

문제 5, 6의 해설을 보면 명령어 파이프 라인을 실행한 경우, 실행하지 않은 경우에 대한 시간 공식을 알 수 있다. 파이프 라인 실행한 경우 속도 T 4 + (5 - 1) 8이며 파이프 라인 실행하지 않은 경우 속도 T` 4 * 5 20이다. 20 / 8하면 2.5배 향상된 것을 알 수 있다.

 

1. 컴퓨터 프로그래밍 언어

    -상위 프로그래밍 언어: 사람과 가까운 쪽(사람이 쉽게 알아보고 이해할 수 있다.)

       ex) c, c++, JAVA 등

    -하위 프로그래밍 언어

       ex) 기계어, 어셈블리어

 

2. 기계어

    -컴퓨터가 직접 이해할 수 있는 언어

    -2진수 형태로 표현

    -수행시간이 짧음

    -호환성 없음

 

3. 어셈블리어

    -기계어와 1:1 대응(기계어를 문자로 기호화함)

    -CPU에 따라 형식이 다름

    -직관적임

    -어셈블러 필요: 어셈블리 언어를 번역하여 오브젝트 코드를 생성하는 프로그램


4. 어셈블리 명령어(Intel CPU 버전)_2진수로 모든 것을 처리함

레이블 부: 연산부     오퍼랜드 부     ; 주석문 부

레이블 부

CPU실행을 해당 레이블로 이동시킬 때 사용

연산 부

명령어, 지시어로 구성

피연산자 부

레지스터 이름, 정수, 라벨, 연산자, 주소등으로 구성

주석문 부

세미콜론으로 시작

 

 

 

만약, 기계코드가 8170이면 8은 연산코드에 170은 오퍼랜드 1에 들어가며 오퍼랜드 2는 패딩영역으로 쓴다.

 

-연산 코드

    >함수 연산기능: 산술, 논리 연산 수행

    >전달기능: CPU와 주기억장치 사이 정보교환과 적재, 저장

    >제어기능: 프로그램 수행흐름 제어

        분기 명령어

              -오퍼랜드: 다음에 실행할 명령어 주소를 포함

        서브루틴 호출 명령어

              -호출 명령어: 현재 PC 내용을 스택에 저장하고 서브루틴의 시작주소로 분기함

              -복귀 명령어: CPU가 원래 실행하던 프로그램으로 되돌아가도록함                                     

    >입출력기능: CPU와 외부 장치들 간의 데이터 이동

 

-오퍼랜드: 연산을 수행하는데 필요한 데이터 혹은 데이터의 주소

 

-데이터이동

     -mov: 데이터를 이동한다.

-사칙연산

     -add: 덧셈

     -sub: 뺄셈

     -mul: 곱셈

     -div: 나눗셈

-기억장치 관련

     -load: 기억장치로부터 데이터 적재

     -srot: 기억장치로 데이터 저장

 

5. 어셈블리 프로그램 예제

 

 

먼저 기계코드를 설명하자면, 컴퓨터만 이해할 수 있는 코드로 명령어와 주소를 합친 것이다. LOAD명령어를 나타내는 기계코드는 1이고, ADD명령어를 나타내는 기계코드는 5인 것이다.

 

100번지에 있는 1250은 '250번지의 값을 가져와라'라는 것이다. 그럼 컴퓨터는 250번지에 있는 값을 가져와서 누산기에 넣는다. 이후 101번지에 있는 5251코드로 인해 컴퓨터는 251번지에 가서 값을 가져와 누산기의 값과 더한 후 102번지에 있는 2251코드로 인해 251번지에 값을 저장한다. 이 명령이 끝나면 103번지의 170번지로 점프하라는 기계코드를 실행한다.

 

이 예시를 단계별로 도식화해보자.

여기서 PC는 프로그램 카운터, AC는 누산기, IR은 명령어 레지스터이다.

 

LOAD 250

 

CPU 레지스터의 프로그램 카운터 값이 100번지를 가리키고 있으므로 기억장치의 100번째 주소의 기계코드를 명령어 레지스터에 넣는다. 컴퓨터는 이를 이해하고 누산기에 250번지의 값을 넣는다. 이후 프로그램 카운터값은 101번지를 가리킨다.

 

 

ADD 251

 

프로그램 카운터 값이 101이므로 기억장치의 101번째 주소의 명령어를 해석한다. 이후 251번지의 값을 누산기에 있는 250번지의 값과 더해서 다시 누산기에 넣는다.

 

 

STOR 251

 

프로그램 카운터 값이 102이므로 기억장치의 102번째 주소의 명령어를 해석한다. 이후 251번지에 누산기의 값을 가져와 저장한다.

 

 

JUMP 170

 

프로그램 카운터 값이 103이므로 기억장치의 103번째 주소의 명령어를 해석한다. 이후 170번지로 점프한다.(프로그램 카운터 값이 170으로 바뀐다.)

 

5. 명령어 집합

    -2진수 코드로 된 명령어들의 집합(기계코드)

    -어셈블리 코드 형태로 표현

    -연산 종류, 데이터 형태, 명령어 형식, 주소지정 방식이 명령어 집합 설계에 중요하다.

 

 


 

[컴퓨터 구조 WEEK2_2]27기변주현_답안.hwp
0.01MB
[컴퓨터 구조 WEEK2_2]27기변주현_문제.hwp
0.08MB

컴퓨터 정보의 표현

1. 단위

    -비트(Bit): 가장 기본 단위, 0또는 1로 표현

    -바이트(Byte): 1바이트 = 8비트

    -워드(Word): half word: 2byte, full word: 4 byte, double word:8 byte

 

2. 진법

    -10진법: 0~9를 사용(일상생활에서 사용하는 체계)

    -2진법: 0, 1을 사용(컴퓨터가 사용)

    -8진법: 0부터 7숫자를 사용

    -16진법: 0부터 9숫자를 사용하지만 이후 A, B, C, D, E, F를 사용

    ex) 10진수 15는 2진수로는 1111, 16진수로는 F이다.

         10진수 8은 2진수로는 1000, 16진수로는 8이다.

 

2-1. 부호 없는 2진 정수 표현

    -2진수 -> 10진수 변환

        ex) 2진수 1101를 뒤에서 부터 2^0, 2^1, 2^2, 2^3 ... 를 곱해서 모두 더해준다.

            1 x 2^0 + 0 x 2^1 + 1 x 2^2 + 1 x 2^3 = 1 + 0 + 4 + 8 = 13 임을 알 수 있다.

 

2-2. 부호 있는 2진 정수 표현_n비트의 부호 절댓값 형식

    -최상위 1비트를 양수면 0, 음수면 1로 표시한다.

       ex) +15 = 00001111, -15 = 10001111

    -n비트로 -2^(n-1) ~ +2^(n-1) 표현이 가능하다.

    -하지만 0을 나타낼 때 00000000, 10000000 모두 가능하다는 논리오류가 있다.

 

2-3 부호 있는 2진 정수 표현_1의 보수 형식

    -2진수의 절댓값에 1의 보수를 사용(비트 반전)

       ex) +15 = 00001111, -15 = 11110000

    -n비트로 -2^(n-1) ~ +2^(n-1) 표현이 가능하다.

    -0을 표현하는데 논리 오류가 있다.

 

2-4 부호 있는 2진 정수 표현_2의 보수 형식

    -1의 보수에 1을 더한다.

       ex) +15 = 00001111, -15 = 11110001

    -n비트로 -2^(n-1) ~ +2^(n-1)-1 표현이 가능하다.

 

 

 

*오버플로우

    -최상위 비트를 부호비트로 쓰기 때문에 자리 올림이 일어나면 양수의 최고값을 넘어서는 것.

    -2의 보수에서 127값은 01111111인데 여기서 1값이 올라가면 10000000이 된다. 즉 -128이 되는 것.

    -c = (a + b) mod 2^n = a + b - 2^n < a 즉, a + b 인 c가 c < a 거나 c < b 면 오버 플로우

 

3. 2진수의 논리 연산

    -기본 논리 연산

 AND연산 모두 1이여야 1, 하나라도 0이면 0
OR연산 하나라도 1이면 1, 모두 0이면 0

    -응용 논리 연산

Selective-set(선택적 세트) 연산 선택적으로 비트를 1로 세트 시킴

특정비트가 1로 세트된 데이터와

OR연산한다.

Selective-complement(선택적 보수) 연산 선택적으로 비트를 1의 보수화

특정비트가 1로 세트된 데이터와

XOR연산한다.

Mask(마스크) 연산 선택적으로 비트를 0으로 세트 시킴 

특정비트가 0으로 세트된 데이터와

AND연산한다.

Insert(삽입) 연산 특정 위치에 새로운 비트 삽입 마스크 연산 후 선택적세트 연산한다.
Compare(비교) 연산 두 입력값을 비교 비트를 XOR연산한다.
Circlular shift(순환 이동) 비트가 순환하면서 이동 예를 들어 1001 좌측 이동은 0011
Arthmetic shift(산술적 이동) 부호비트 유지, 숫자만 이동 예를들어 1001 좌측 이동은 1010

 

 


[컴퓨터 구조 WEEK2_1]27기변주현_답안.hwp
0.01MB
[컴퓨터 구조 WEEK2_1]27기변주현_문제.hwp
0.01MB

컴퓨터 구성요소

컴퓨터 하드웨어 중앙처리장치(CPU) 연산장치
제어장치
기억장치 주기억장치
보조기억장치
입출력장치 입력장치
출력장치
소프트웨어 시스템 소프트웨어  
응용 소프트웨어  

 

 

1. 하드웨어 구성

1-1 CPU란?
  -Central Processing Unit의 약자로 인간의 '뇌' 역할을 한다.
  -컴퓨터 시스템을 통제하고 프로그램 연산을 실행 및 처리한다.
  -CPU의 성능이 PC의 속도와 성능을 결정한다.

 

1-2 CPU 레지스터란?(2번에서 설명 추가)

 -CPU 내에서 데이터를 저장한다.

 -주기억장치로부터 읽어온 명령어와 데이터를 임시 보관한다.

 -ALU 처리 결과 데이터를 임시 보관한다.

 

1-3 제어장치란?

 -명령어를 해독하고 제어 신호를 해당 장치에 전달한다.

 -명령어 형식: 연산 코드 + 기억장치 주소

 -연산코드: 수행되어야 할 연산이 지정되어 있는 필드

 -기억장치 주소: 해당 연산을 수행할 때 데이터가 저장되어 있는 주소


1-4 주기억장치란?
  -RAM과 ROM이 존재한다.
  -CPU와 직접 데이터 교환이 가능하다.


1-5 RAM이란?
  -읽고 쓰기가 가능한 기억장치이다.
  -현재 사용 중인 프로그램이나 데이터를 저장한다.
  -전원이 꺼지면 데이터가 사라진다.
  -주로 주기억장치로 사용된다.

 

1-6 ROM이란?
  -읽기만 가능한 기억장치이다.
  -전원이 꺼져도 데이터가 사라지지 않는다.

 

1-7 보조기억장치란?
  -하드디스크, 디스크, 자기 테이프 등이 있다.
  -CPU와 직접 데이터 교환이 불가능하다.


1-8 캐시 메모리란?
  -CPU와 주기억장치 사이에 존재한다.
  -처리속도가 빠르다.

  -데이터를 임시적으로 가지고 있으며 CPU가 주기억장치로부터 데이터를 읽고 쓰는 속도를 높여준다.

 

Low CPU 내의 레지스터: Register High
용량 캐시 기억장치: Static Ram 속도, 가격
주기억장치: Dynamic Ram
High 보조기억장치: 하드 디스크, 플로피 디스크, 자기테이프 Low

 

 

2. CPU 레지스터

2-1 기억 장치 버퍼 레지스터

 -CPU가 명령어를 처리하기 위해 주기억장치에서 읽어온 데이터를 임시적으로 저장하는 것이다.

 -데이터를 임시적으로 저장하고 있기 때문에 완충제 역할을 한다고 볼 수 있다.

 

2-2 명령어 레지스터

 -기억 장치 버퍼 레지스트의 명령어를 저장한다.

 

2-3 기억장치 주소 레지스터

 -명령어 레지스터에 저장된 명령어의 주소 번지를 저장한다.

 ex) 만약 ADD(2,3)이 들어왔다면 2와 3의 주소를 전달 받는 것

 -데이터를 임시적으로 저장하고 있기 때문에 완충제 역할을 한다고 볼 수 있다.

 

2-4 명령어 해독기

 -명령어 레지스터에 저장된 명령어 연산코드의 필드를 전달받는다.

 -연산코드 필드를 해독/ 수행할 연산을 결정해서 연산장치에 전달한다.

 ex) 만약 ADD(2,3)이 들어왔다면 ADD를 전달 받는 것

 

2-5 프로그램 카운터

 -다음 수행할 명령어의 주소 번지를 저장한다.

 -프로그램 카운터에 들어있던 명령어 주소에 있는 명령어가 실행되는 순간 다음 수행할 명령어의 주소가 프로그램 카운터에 들어간다.

 

2-6 제어장치의 기본 동작 과정

 1. RAM에서 먼저 실행할 명령어를 명령어 레지스터에 넣는다.

 2. 명령어 레지스터에 하나의 명령어가 들어가는 순간 다음 수행할 명령어 주소를 프로그램 카운터에 넣는다.

 3. 현재 명령어 레지스터를 해석해서 명령어는 명령어 해독기에, 데이터의 주소는 기억장치 주소 레지스터에 전달한다.

 4. ALU가 동작하면서 연산을 실행한다. 

 

 

3. 버스

 

3-1 데이터 신호(데이터 버스)

 -CPU와 기억장치와 입출력장치가 데이터를 주고 받는 신호선

 -실질적인 데이터 전달

 

3-2 명령 신호(제어 버스)

 -CPU가 컴퓨터 시스템의 장치 동작을 제어하기 위한 신호선

 -제어장치에서 발생되는 제어 신호를 전달

 

 

4. CPU 명령어 수행과정

4-1 인출(Fetch)

 -주기억장치에서 명령어를 불러온다.

 -수행을 시작할 주소를 프로그램 카운터에 저장한다.

 

4-2 해독(Decode)

 -불러온 명령어를 해독한다.

 -여기서 명령어의 종류와 타켓을 판단한다.

 

4-3 실행(Execute)

 -연산을 수행한다.

 

4-4 저장(Store)

 -처리된 데이터를 메모리에 저장한다.

 

 

5. ALU(산술논리연산장치)

5-1 ALU란?

 -연산에 필요한 자료를 입력받아 산술 및 논리 연산을 수행한다.

 

5-2 구성요소

 -가산기: 덧셈

 -레지스터: 연산에 사용되는 데이터와 연산 결과 등을 임시적으로 기억

    ex) 명령 레지스터, 프로그램 카운터, 연산용 레지스터 등

 -보수기: 컴퓨터에서 감산을 할 때 빼는 수를 보수로 바꾸어 가산기에 입력하여 덧셈을 하도록 한다.

 -오버플로 검출기: 오버플로를 검출하여 데이터 상태를 표시한다.(음수, 0, 오버플로)

   *오버플로: 연산 결과를 레지스터에 모두 저장할 수 없는 경우

 

5-3 산술연산과 논리연산

 -산술연산: 사칙 연산 가능

 -논리연산: 논리 조작, 자리 이동, 편집, 변환

 

 

참고)

디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007,

컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011


스터디에서 나온 질문

Q1. 프로그램 카운터의 값은 어느 시점에 무슨 값으로 바뀌어야 할까?

Q2. 3번 과정의 명령어 해석과정을 수행하는 레지스터는?

Q3. 명령어 레지스터에 명령어가 패치 된 이후에 하는 또 다른 한 가지의 작업은 무엇일까?

Q4. 1번 과정에서 언급되지 않은 레지스터는? 그 용도와 역할은?

 

A1. 실행할 명령어가 명령어 레지스터에 들어갈 때 다음 명령어의 주소값으로 바뀐다.

A2. 명령어 레지스터가 해석해서 데이터의 주소는 기억장치 주소 레지스터로, 명령어는 명령어 해독기로 보낸다.

A3. 프로그램 카운터 값이 바뀐다.

A4. 기억 장치 버퍼 레지스터. CPU가 명령어를 처리하기 위해 주기억장치에서 읽어온 명령어를 임시적으로 저장한다.

 


개별 문제 출제 & 답안

 

[컴퓨터 구조 WEEK1]27기변주현_답안.hwp
0.01MB
[컴퓨터 구조 WEEK1]27기변주현_문제.hwp
0.01MB

 

+ Recent posts