본문 바로가기
컴퓨터 구조

컴퓨터 구조 4주차

by 몰라몰라개복치 2020. 5. 28.

분기 명령어

분기: 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주소 명령어

오퍼랜드 한 개만 포함하는 명령어로서, 오퍼랜드 형태는 주소

1주소 명령어

EX)

LOAD  X                                          ; AC<-M[X] (X번지의 데이터를 누산기에 저장)

LOAD는 연산 코드, X는 기억장치 주소

 

 

(2) 2주소 명령어

오퍼랜드 2개를 포함하는 명령어 형식으로, 오퍼랜드 2개 모두 주소를 저장하는데 사용됨

2주소 명령어

EX)

어셈블리 언어로 2-주소 명령어를 표현한 예 

MOV  X, Y           ;  M[X] ← M[Y]

- X, Y의 두 개의 변수가 주소

- Y번지의 기억장치 데이터를 X 번지의 기억장치로 이동

 

 

 

(3) 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 : 기억장치 내의 임시 저장장소의 주소

 

1주소 명령어

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: 레지스터 R1R2 내용이 같지 않다면 235번지로 분기하라는 명령어

 

 

 

 

(Q2~Q3). 다음은 그림에 있는 프로그램의 수행 과정이다 설명으로 맞으면 O, 틀리면 X를 쓰시오.

Q2. 260번지의 CALL SUB2 명령어를 만나면 300번지로 JUMP하게 된다. (   )

Q3. RET를 만나게 되면 나를 호출했던 명령어 줄로 돌아가게 된다. 즉 서브루틴 SUB2RET 명령어는 SUB2를 호출한 SUB1로 돌아간 뒤 호출한 명령어의 번지인 260번지로 돌아가게 된다. (    )

 

 

 

Q4. 다음 그림이 설명하고 있는 명령어 형식의 이름은 무엇인가?       (                )

 

 

 

 

Q5. 다음은 0주소 명령어를 사용한 프로그램의 연산 과정의 일부이다 보기에 들어갈 연산식을 쓰시오    (         )

스택에 B가 입력됨 -> 스택에 C가 입력됨 -> 스택에 D가 입력됨 -> 스택에 E가 연결됨 -> ED를 연속해서 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번지로 돌아가게 된다. ()

 

해설: 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