야금야금

#4 컴퓨터 구조 - 명령어 형식 본문

SWING/컴퓨터구조

#4 컴퓨터 구조 - 명령어 형식

hyk0425 2020. 5. 30. 21:52

분기 명령어

: 실행의 흐름을 변경하거나 어떤 루틴을 호출하는데 사용되는 명령어

 

형태

1. BRZ(branch if zero) 메모리 주소 : 조건 코드가 0이면 해당 번지로 분기하라는 명령어

2. BR 메모리 주소 : 무조건 해당 번지로 분기하라는 명령어

3. BRE(branch if equal) R1, R2, 메모리 주소 : 레지스터 R1과 레지스터 R2의 내용이 같다면 해당 번지로 분기하라는 명령어

 

 

ex)

 

 

 

BRZ(branch if zero) 211

: 조건 코드가 0이면 211로 분기

 

BR 202

: 무조건 202번지로 분기

 

BRE(branch if equal) R1, R2, 235

: 레지스터 R1과 레지스터 R2의 내용이 같다면 235번지로 분기

 

 

 

 

 


 

서브루틴

: 한 블록으로 구성된 명령어 실행 중 다른 블록의 명령어를 삽입하여 실행하기를 원하는 형태로 프로그램을 구성할 때 사용되는 명령어. 호출과 복귀 명령어가 함께 사용됨 (https://syundev.tistory.com/68)

 

- 호출 명령어 (CALL)

: 현재 PC(프로그램 카운터)의 내용을 스택에 저장하고 PC에 서브루틴의 시작 주소를 저장하여 해당 서브루틴으로 분기한다.

 

- 복귀 명령어 (RET)

: 스택에 저장되어있던 주소를 PC에 넣어 저장함으로써 CALL명령어의 바로 다음 주소로 되돌아가도록 하는 명령어

 

ex)

1. 주 프로그램(main)의 호출 명령어 CALL SUB1을 통해 서브루틴 SUB 1으로 분기한다.

 

2. SUB 1의 CALL SUB 2(260번지)를 통해 서브루틴 SUB 2로 분기한 후 프로그램 수행 후 RET명령어를 통해 SUB 1에서의 호출다음 번지(261번지)로 돌아간다.

 

3. SUB 1의 CALL SUB 2(280번지)를 통해 다시 한번 SUB 2를 수행한 후 RET명령어를 통해 SUB 1의 호출 다음 번지(281번지)로 돌아간다.

 

4. SUB 1의 RET명령어를 통해 주 프로그램에서의 SUB 1호출 다음 번지(211번지)로 돌아간 후 수행을 마치고 프로그램을 종료한다.

 

 

 

앞서 프로그램의 수행 과정을 살펴보았다. 이제 위와 같은 서브루틴 수행과정에서 스택의 변화를 살펴보자

 

우선 스택이란 후입선출(LIFO-Last In First Out)을 따르는 자료구조이다. 따라서 데이터의 액세스가 한 지점에서 이루어진다. 해당 지점을 가리키는 포인터를 스택 포인터(SP)라 한다. 따라서 스택에 데이터가 추가/제거 될 경우 스택 포인터의 값이 증가/감소 한다. 

 

위의 서브루틴 수행과정에서의 스택의 변화

 


명령어 분류

오퍼랜드에 저장되는 데이터 형태

- 주소 : 주기억장치의 주소나 레지스터의 주소

- 수 : 정수, 고정-소수점 수, 부동-소수점 수

- 문자 : ASCII 코드

- 논리 데이터 : 비트(bit) 혹은 플래그(flag)

 

오퍼랜드가 주소를 나타내는 경우

: 오퍼랜드 수에 따라 3, 2, 1, 0 주소 방식 존재

 

오퍼랜드 수에 따른 주소 방식

1) 0-주소 명령어

: 연산코드부만 존재하고 주소를 지정하는 오퍼랜드가 존재하지 않는 명령어로서 모든 연산은 스택포인터가 가리키는 오퍼랜드롤 이용하여 명령을 수행한다. 다른 주소 명령어들과 달리 STOR명령어를 사용하지 않는다.(PUSH/POP 사용)

 

 

2) 1-주소 명령어

: 오퍼랜드를 한 개만 포함하는 명령어로서, 오퍼랜드는 주소를 저장한다. 누산기(AC)를 이용하여 처리하며 수행 결과 또한 누산기에 저장된다.

ex)  LOAD X               ;AC←M[X] (X번지의 데이터를 누산기에 저장해라)         

 

 

3) 2-주소 명령어

: 오퍼랜드 두 개를 포함하는 명령어로서, 오퍼랜드는 2개 모두 주소를 저장한다. 실행 속도가 빠르며 기억 장소 효율이 좋다. 연산 결과는 한 쪽에 저장되어 다른 한 쪽의 자료는 사라진다.

ex)  MOV X, Y               ;M[X]←M[Y](X, Y는 주소를 나타낸다. Y번지의 기억장치 데이터를 X번지의 기억장치로 이동시켜라)

 

 

 

3) 3-주소 명령어

: 오퍼랜드 세 개를 포함하는 명령어로서, 레지스터의 주소를 저장하는 명령어 형식이다. 연산 결과를 한 영역을 사용하여 원래의 자료가 사라지지 않는다. 명령어 인출에 필요한 주기억장치 접근 횟수가 적다. 대신 하나의 명령어를 수행하는 시간이 길어진다.

 

ex)  ADD X, Y, Z               ;M[X]←M[Y]+M[Z] (X,Y,Z는 각각 주소를 나타낸다. Y와 Z번지의 데이터를 더하여 X번지에 저장해라)

 

 


 

 

4가지 주소 형식으로 다음과 같은 연산 프로그램을 구현해 보자

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

명령어의 동작

1) 0-주소 명령어

 

0-주소 명령어 실행 중 스택의 변화

 

2) 1-주소 명령어

 

3) 2-주소 명령어

 

4) 3-주소 명령어

 

 

 

명령어 주소 개수에 따른 장단점

주소 개수가 많은 경우

- 저장할 오퍼랜드의 수가 많아지기 때문에 명령어가 더 복잡해진다.

- 레지스터 수가 많아져서 연산 속도가 빨라진다.

- 프로그램이 짧아져서 프로그램 당 명령어 수가 감소한다.

 

주소 개수가 적은 경우

- 오퍼랜드의 수가 적어서 간단하므로 명령어 인출과 실행 속도가 높아진다.

- 프로그램의 길이가 증가한다.

 

 

 

 

문제

더보기

Q1. 다음 중 조건에 상관 없이 무조건 해당 주소로 이동하는 분기 명령어는?

BRZ

② BR

BRE

 

Q2. 다음 서브루틴 수행 과정에서 옳은 것을 고르시오

 

① 서브루틴 SUB 1은 주 프로그램이 끝난 후 실행된다.

 

② 서브루틴 SUB 2보다 서브루틴 SUB 1이 먼저 종료된다.

 

③ 서브루틴 SUB 1의 RET명령어가 실행되면 PC에 211이 저장된다.

 

④ 프로그램 카운터의 값은 명령어에 상관 없이 기억장치 주소 순서대로 작은 값부터 저장된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Q3. 다음을 보고 O/X를 표기하시오.

- 스택 포인터는 데이터가 채워진 첫 번째 위치를 가리킨다 (O/X)

- 2-주소 명령어에서 MOV X, Y는 "Y번지의 기억장치 데이터를 X번지의 기억장치로 이동시켜라" 라는 뜻이다 (O/X)

 

Q4. 다음은 어떠한 연산을 처리하는 과정인지 연산 식을 쓰시오.

 

 

답 : ___________________

 

 

 

 

 

 

Q5. 3-주소 명령어와 0-주소 명령어 중 프로그램을 실행하기 위한 명령어가 적고 각각의 명령어 처리 속도가 느린 것은 어느 것인가?

답 : ________

 

 

 

해설

더보기

A1. ② BR

- BRZ(branch if zero) 메모리 주소 : 조건 코드가 0이면 해당 번지로 분기하라는 명령어

- BRE(branch if equal) R1, R2, 메모리 주소 : 레지스터 R1과 레지스터 R2의 내용이 같다면 해당 번지로 분기하라는 명령어

 

A2. ③ 서브루틴 SUB 1의 RET명령어가 실행되면 PC에 211이 저장된다.

: 주 프로그램에서 CALL SUB 1가 호출되며 현재 PC의 내용을 스택에 저장하고 SUB 1의 RET명령어가 수행되면서 스택에 저장했던 주소를 PC에 넣어 CALL SUB 1의 바로 다음 주소가 저장된다.

 

A3.

- 스택 포인터는 데이터가 채워진 첫 번째 위치를 가리킨다 (X)

: 스택 포인터는 데이터가 채워진 마지막 위치를 가리킨다.

 

- 2-주소 명령어에서 MOV X, Y는 "Y번지의 기억장치 데이터를 X번지의 기억장치로 이동시켜라" 라는 뜻이다 (O)

 

A4.

MUL D, E, R1       ;D와 E를 곱한 후 연산 결과를 R1에 저장
ADD C, R1, R1      ; C와 R1의 D*E값을 더한 후 연산 결과를 R1에 저장
DIV F, G, R2         ; F와 G를 나눈 후 연산 결과를 R2에 저장
SUB R1, R2, R1     ; R1의 D*E+C값과 R2의 F/G값을 뺀 후 연산 결과를 R1에 저장
MUL B, R1, X        ; B와 R1의 D*E+C-F/G값을 곱한 후 연산 결과를 X에 저장

 

따라서 위의 과정은 B*(D*E+C-F/G)를 연산하기 위한 과정이다.

 

A5. 답 : 3-주소 명령어

명령어 주소의 개수가 많을 수록 프로그램을 실행하기 위한 명령어가 적고 각각의 명령어 처리 속도가 느리다.

 

 

 

 

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