본문 바로가기

CS/컴퓨터구조(Mano)

[컴퓨터구조] ch.5 기본 컴퓨터의 구조와 설계 (7) 메모리 참조 명령어

Mano의 컴퓨터시스템구조 제3판, 프로텍 미디어, 김종상 옮김 도서를 정리, 요약하는 글입니다.

 

1. 메모리 참조 명령어

 

출처 : https://upscfever.com/upsc-fever/en/gatecse/en-gatecse-chp156.html

 

- 위는 7가지의 메모리 참조 명령어를 기술한 표이다.각 명령은 디코더의 출력 Di에 의해 구별된다. 

- 피연산자에 대한 유효 주소를 찾아오는 것은 T2(I = 0일 때)나 T3(I = 1일 때) 시간에 AR 레지스터로 전송된다. (I = 1이면 간접 주소 방식이므로 한번 더 메모리의 유효 주소에 접근해야 하므로 T3 시간이 되어야 한다.) 명령의 수행은 T4 시간에 시작된다.

 

2. AND 명령어

D0T4 : DR ← M[AR]

D0T5 : AC ← AC∧DR, SC ← 0

 

- AC와 유효 주소로 지정된 메모리 워드의 각 비트쌍에 대해 AND 연산 수행 후, 결과값 AC에 전송한다.

- 메모리로부터 데이터를 가져와야 하므로 두 개의 명령이 같은 시간에 동시에 실행될 수는 없다.

 

3. ADD 명령어

D1T4 : DR ← M[AR]

D1T5 : AC ← AC + DR, E Cout, SC ← 0

 

- 유효 주소로 지정된 메모리 워드의 내용을 AC와 더한 다음, 그 합을 AC에 저장하고 출력 캐리(Cout)는 E 플립플랍에 전송한다.

 

4. LDA 명령어

D2T4 : DR ← M[AR]

D2T5 : AC DR, SC ← 0

 

- 유효 주소로 지정된 메모리 워드의 내용을 AC에 전송한다.

사진 출처 : https://www.geeksforgeeks.org/common-bus-system/

 

- 위의 사진을 다시 참고해보면, AC 레지스터와 직접 연결된 경로가 없다. 따라서 메모리의 내용을 DR에 담은 후 가산 논리 회로(Adder and Logic Circuit)를 통해서 AC로 전송할 수 있다. (DR의 출력은 가산 논리 회로와 연결되어 있다.)

- 버스 시스템에서는 가산 논리 회로에서의 지연을 막기 위해서 버스에서 AC와의 연결이 없다. 그렇기 때문에 원래 메모리에서 읽어온 데이터를 버스를 통해 전송하기 위하여 하나 이상의 클럭 사이클이 필요하다고 가정하면, 여기서는 각 마이크로 연산을 한 클럭 사이클에 수행되도록 구현할 수 있다. 

 

5. STA 명령어

D3T4 : M[AR] ← AC, SC ← 0

 

- store AC라는 뜻으로, AC의 내용을 유효 주소로 지정된 메모리 워드에 전송한다. 즉 AC의 내용을 메모리에 저장한다.

- AC의 출력이 버스를 통해서 메모리에 입력되어 있으므로 한 번의 마이크로 연산으로 가능하다.

 

6. BUN 명령어

D4T4 : PC ← AR, SC ← 0

 

- BUN(Branch Unconditionally)는 무조건 분기한다는 뜻으로, 프로그램의 수행을 유효 주소로 지정된 명령어로 옮겨준다. 

- AR의 유효 주소가 버스를 타고 PC로 전송되어 그 명령어가 fetch된다.

 

7. BSA 명령어

D5T4 : M[AR] ← PC, PC ← AR + 1

D5T5 : PC ← AR, SC ← 0

 

사진 출처 : https://upscfever.com/upsc-fever/en/gatecse/en-gatecse-chp156.html

 

- BSA(Branch and Save Return Address)는 서브 루틴(프로시저) 분기라는 뜻으로, 현재 PC에 저장된 순서상의 다음 명령어 주소가 유효 주소로 지정된 메모리에 저장되고 유효 주소보다 1 큰 값이 PC로 전송되어 서브 루틴의 첫 번째 명령어를 가리키게 한다.

- 서브루틴 시작 명령어 바로 위에 돌아가야할 복귀 주소를 저장하고 분기를 시키는 것이다. 위 그림에서 왼쪽의 예를 보면, 현재 T4 일 때, PC = 21이고 AR = 135이다. M[135]에 21을 저장하고(서브 루틴 시작 주소 바로 위에 저장) PC에는 136을 전송한다. 서브루틴이 다 끝나면 맨 끝에 간접 BUN 명령어를 이용해 135에 저장된 21을 꺼내와 PC에 저장해 다음 명령을 수행한다. 하지만 대부분의 컴퓨터는 복귀 주소를 프로세서 레지스터나 스택에 저장한다.

 

8. ISZ 명령어

D6T4 : DR ← M[AR]

D6T5 : DR ← DR + 1

D6T6 : M[AR] ← DR, if(DR = 0) then (PC ← PC + 1), SC ← 0

 

- ISZ(increment and skip if zero)는 유효 주소로 지정된 워드의 값을 1 증가시키고, 증가된 값이 0이면 PC도 증가시켜 다음 명령어를 수행하게 하는 것이다.

- ISZ는 for 반복문과 같은 구조에서 많이 쓰이는 분기문이다. 레지스터 DR의 값을 계속 증가시키다가 만약 0이 되면 빠져나와서 분기하는 것과 비슷하다. 

 

9. 제어 흐름도

 

사진 출처 : https://upscfever.com/upsc-fever/en/gatecse/en-gatecse-chp157.html

 

 

- 앞서 살펴본 7가지의 메모리 참조 명령어에 해당하는 마이크로 연산들을 보여주는 전체 흐름도이다. 

- 이 흐름도의 경우에 순차 카운트는 3bit로 만들어야 할 것이다. 가장 긴 명령어인 ISZ가 T6에 끝나기 때문에 T0~T6까지 7개의 타이밍 신호가 필요하기 때문이다.