일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Constraint
- 순차 컨테이너
- Stack
- 2020.04.19
- list
- 스택
- Reversing
- 컴퓨터 구조
- Reverse Engineering
- 컴퓨터구조
- 2020.05.17
- BOJ
- Animation
- 알고리즘
- UIView
- scroll
- 모달인듯 모달 아닌 뷰
- class
- UIPanGestureRecognizer
- Swing
- NavigationBar
- stl
- 2020.06.14
- struct
- 백준 1920
- SWiFT
- ios
- 백준 10828
- vector
- 표준 템플릿 라이브러리
- Today
- Total
야금야금
#4 컴퓨터 구조 - 명령어 형식 본문
분기 명령어
: 실행의 흐름을 변경하거나 어떤 루틴을 호출하는데 사용되는 명령어
형태
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-주소 명령어
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
'SWING > 컴퓨터구조' 카테고리의 다른 글
#6 컴퓨터구조 - MIPS구조 (1) | 2020.06.14 |
---|---|
#5 컴퓨터 구조 - 캐시 기억장치 (2) | 2020.06.06 |
#3(2) 컴퓨터 구조 - 메모리 구조 & 레지스터 종류 (0) | 2020.05.23 |
#3 컴퓨터 구조 - 명령어를 효과적으로 처리하기 위한 기법 (0) | 2020.05.23 |
#2-(2) 컴퓨터 구조 - 어셈블리 명령어 (0) | 2020.04.18 |