분기 명령어
분기: JUMP, 연속적으로 명령어가 저장되어 있지 않고 다른 곳으로 가는 것
분기의 형태
(1). BRZ(branch if zero) a: 조건 코드가 0이면 a번지로 분기하라는 명령어
(2). BR: 무조건 a번지로 분기하라는 명령어
(3). BRE(branch if equal) R1, R2, A: 레지스터 R1과 R2의 내용이 같다면 a 번지로 분기하라는 명령어
명령어는 코드 영역에 들어가 있음
BRZ 211 명령어를 통해 211번지로 분기했다는 것은 X=Y였다는 것을 뜻
레지스터 R1과 레지스터 R2의 내용이 같다면 235번지로 분기
<서브루틴>
1. [210번지] CALL SUB1 => 250번지로 JUMP
(SUB1라는 이름을 가진 함수를 호출. SUB1 이름을 가진 함수의 첫 번째 명령어가 저장된 메모리로 분기)
˙ ˙ ˙
2. [[260번지] CALL SUB2 ==> 300번지로 JUMP
(SUB2라는 이름을 가진 함수를 호출. SUB2 이름을 가진 함수의 첫 번째 명령어가 저장된 메모리로 분기)
˙ ˙ ˙
3. RET: 돌아가라. 나를 호출했던 명령어 다음 줄로 돌아감. SUB2를 호출한 함수는 SUB1이므로 SUB1으로 돌아간 뒤 나를 호출한 명령어(260번지) 다음 줄인 261번지로 돌아감.
˙ ˙ ˙
4. [[280번지]] CALL SUB2 ==> 300번지로 JUMP
˙ ˙ ˙
5. (SUB2의)RET ==> 281번지로 돌아감
˙ ˙ ˙
6. (SUB1의)RET ==> 211번지로 돌아감
˙ ˙ ˙
7. END
(**점프를 통해 레지스터 중에서 바뀌는 값: 프로그램 카운터)
<서브루틴 수행과정에서 스택의 변화>
**PUSH는 스택에 대한 데이터를 집어 넣는 것. 어떤 데이터를 집어넣을 것인지에 대한 추가적인 정보 필요.
**POP 연산은 어떤 데이터를 빼낼 것인지에 대한 데이터 정보 필요 X. 무조건 맨위에 있는 데이터만 뽑아낼 수 있음.
명령어 분류
오퍼랜드에 저장되는 데이터 형태
주소: 주기억장치의 주소나 레지스터의 주소
수: 정수, 고정-소수점 수, 부동-소수점 수
문자: ASCII 코드
논리 데이터: 비트(bit) 혹은 플래그(flag)
오퍼랜드가 주소를 나타내는 경우
- 오퍼랜드 수에 따라 3,2,1,0 주소 방식 존재
(1) 1주소 명령어
오퍼랜드 한 개만 포함하는 명령어로서, 오퍼랜드 형태는 주소
EX)
LOAD X ; AC<-M[X] (X번지의 데이터를 누산기에 저장)
LOAD는 연산 코드, X는 기억장치 주소
(2) 2주소 명령어
오퍼랜드 2개를 포함하는 명령어 형식으로, 오퍼랜드 2개 모두 주소를 저장하는데 사용됨
EX)
어셈블리 언어로 2-주소 명령어를 표현한 예
MOV X, Y ; M[X] ← M[Y]
- X, Y의 두 개의 변수가 주소
- Y번지의 기억장치 데이터를 X 번지의 기억장치로 이동
(3) 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 )
<0주소 명령어를 사용한 프로그램>
X = B *( C+ D * E – F / G )
104 MUL: 곱하는 대상이 나와 있지 X, 즉 저장되어 있던 데이터를 차례대로 POP해서 나온 E와 D를 곱해서 곱하고 PUSH
105 ADD: 더하는 대상이 나와 있지 X, 저장되어 있던 데이터를 차례대로 POP해서 나온 E*D와 C를 더하고 PUSH
108 DIV: 나누는 대상이 나와 있지 X, 저장되어 있던 데이터를 차례대로 POP해서 나온 F를 G로 나누고 PUSH
109 SUB: F/G와 C+E*D를 POP하고 뺄셈(C+D*E-F/G) 수행 후 PUSH
110 MUL: (C+D*E-F/G) 와 B를 연속해서 POP 하고 곱셈을 수행 후 결과 PUSH
111 POP: 기억장치 X번지에 저장하기 위해 결과를 POP
(**0주소 명령어에선 STOR 명령어를 쓰지 않음)
<1주소 명령어를 사용한 프로그램>
- M[A] : 기억장치 A번지에 저장된 데이터 내용
- T : 기억장치 내의 임시 저장장소의 주소
100 LOAD F: 주기억장치에 F 번지에 있는 데이터를 가져와서 누산기에 넣음
101 DIV G: 누산기에 있는 값을 G번지에 있는 데이터로 나눈 뒤 누산기에 넣음
102 STOS T: 누산기에 있던 값을 메모리 T에 잠시 넣어둠
103 LOAD D: D번지에 있던 데이터를 누산기에 넣음
104 MUL E: 누산기에 있는 값에 E번지에 있는 데이터를 곱해준 뒤에 누산기에 넣어줌
105 ADD C: 누산기에 있는 값이랑 C번지에 있는 데이터를 더해주고 누산기에 넣음
106 SUB T: 누산기에 있는 값에서 T번지에 있는 데이터를 빼고 누산기에 넣음
107 MUL B: 누산기에 있는 값과 B번지에 있는 데이터를 곱해서 다시 누산기에 넣음
108 STOS X: 누산기에 있는 값을 X번지에 저장
<2주소 명령어를 사용한 프로그램>
M[A] : 기억장치 A번지에 저장된 데이터 내용
R1, R2: CPU내의 위치한 레지스터
<3주소 명령어를 사용한 프로그램>
세 개의 오퍼랜드 모두 주소를 나타냄
R1, R2: CPU내의 위치한 레지스터
소스코드의 양이 적어지는 반면에 명령어 하나를 처리하는데 걸리는 시간이 오래 걸림
문제
Q1. 다음은 분기의 형태와 이에 대한 해설이다. 다음 중 틀린 보기는?
1. BR 111: 무조건 111번지로 분기하라는 명령어
2. BRZ 203: 조건 코드가 0이면 203번지로 분기하라는 명령어
3. BR 204: 무조건 204번지로 분기하라는 명령어
4. BRE R1, R2, 235: 레지스터 R1과 R2 내용이 같지 않다면 235번지로 분기하라는 명령어
(Q2~Q3). 다음은 그림에 있는 프로그램의 수행 과정이다 설명으로 맞으면 O, 틀리면 X를 쓰시오.
Q2. 260번지의 CALL SUB2 명령어를 만나면 300번지로 JUMP하게 된다. ( )
Q3. RET를 만나게 되면 나를 호출했던 명령어 줄로 돌아가게 된다. 즉 서브루틴 SUB2의 RET 명령어는 SUB2를 호출한 SUB1로 돌아간 뒤 호출한 명령어의 번지인 260번지로 돌아가게 된다. ( )
Q4. 다음 그림이 설명하고 있는 명령어 형식의 이름은 무엇인가? ( )
Q5. 다음은 0주소 명령어를 사용한 프로그램의 연산 과정의 일부이다 보기에 들어갈 연산식을 쓰시오 ( )
스택에 B가 입력됨 -> 스택에 C가 입력됨 -> 스택에 D가 입력됨 -> 스택에 E가 연결됨 -> E와 D를 연속해서 POP하고 곱셈을 수행한 후 결과를 PUSH -> ( )와 C를 연속해서 POP하고 더한 후 결과를 PUSH
정답
A1. 다음은 분기의 형태와 이에 대한 해설이다. 다음 중 틀린 보기는? ( 4 )
1. BR 111: 무조건 111번지로 분기하라는 명령어
2. BRZ 203: 조건 코드가 0이면 203번지로 분기하라는 명령어
3. BR 204: 무조건 204번지로 분기하라는 명령어
4. BRE R1, R2, 235: 레지스터 R1과 R2 내용이 같지 않다면 235번지로 분기하라는 명령어
해설: BRE(branch if equal) R1, R2, A는 레지스터 R1과 R2의 내용이 같다면 a 번지로 분기하라는 명령어다. 즉 4번의 보기는 레지스터 R1과 R2의 내용이 같다면 235번지로 분기하라는 명령어다.
(A2~A3). 다음은 그림에 있는 프로그램의 수행 과정이다 설명으로 맞으면 O, 틀리면 X를 쓰시오.
A2. 260번지의 CALL SUB2 명령어를 만나면 300번지로 JUMP하게 된다. ( O )
해설: SUB2라는 이름을 가진 함수를 호출하게 된다. SUB2 이름을 가진 함수의 첫 번째 명령어가 저장된 메모리로 분기한다.
A3. RET를 만나게 되면 나를 호출했던 명령어 줄로 돌아가게 된다. 즉 서브루틴 SUB2의 RET 명령어는 SUB2를 호출한 SUB1 함수로 돌아간 뒤 호출한 명령어의 번지인 260번지로 돌아가게 된다. ( X )
해설: SUB2를 호출한 함수는 SUB1이므로 SUB1으로 돌아간 뒤 나를 호출한 명령어(260번지) 다음 줄인 261번지로 돌아감. 260번지로 돌아가지 X
A4. 다음 그림이 설명하고 있는 명령어 형식의 이름은 무엇인가? ( 2-주소 명령어 형식 )
해설: 오퍼랜드 2개를 포함하는 명령어 형식으로, 오퍼랜드 2개 모두 주소를 저장하는데 사용됨
A5. 다음은 0주소 명령어를 사용한 프로그램의 연산 과정의 일부이다 보기에 들어갈 연산식을 쓰시오 ( E*D )
스택에 B가 입력됨 -> 스택에 C가 입력됨 -> 스택에 D가 입력됨 -> 스택에 E가 연결됨 -> E와 D를 연속해서 POP하고 곱셈을 수행한 후 결과를 PUSH -> ( E*D )와 C를 연속해서 POP하고 더한 후 결과를 PUSH
해설: 더하는 대상이 나와 있지 X, 저장되어 있던 데이터를 차례대로 POP해서 나온 E*D와 C를 더하고 PUSH
'컴퓨터 구조' 카테고리의 다른 글
컴퓨터구조 6주차 (0) | 2020.06.13 |
---|---|
컴퓨터 구조 5주차 (0) | 2020.06.05 |
컴퓨터 구조 3주차(2) (0) | 2020.05.23 |
컴퓨터 구조 3주차(1) (0) | 2020.05.23 |
컴퓨터 구조 2주차(2) (0) | 2020.04.16 |