본문 바로가기
Study/컴퓨터구조

[4] 분기 명령어와 오퍼랜드 개수에 따른 명령어 형식

by 투말치 2020. 5. 30.

목차

    반응형

    분기 명령어

    - 명령어 내용에 따라서 무조건 오퍼랜드의 주소로 이동하거나 조건 만족 시에만 이동. 명령어의 흐름을 변경해 비순차적으로 명령어를 수행한다.

     

    *분기 명령어의 형태

    - BRZ(branch if zero) 211 : 조건 코드의 결과가 0이라면 211번지로 분기하라는 명령어

    - BR 202 : 무조건 202번지로 분기하라는 명령어

    - BRE(branch if equal) R1, R2, 235 : 레지스터 R1과 R2의 값이 같으면 235번지로 분기하라는 명령어

    => 조건을 만족하지 않으면 분기하지 않고 순차적으로 명령어를 수행하면 된다.

     

     

    서브루틴 명령어

    - 명령어 실행 중에 또 따른 명령어를 삽입해 실행하는 명령어로 호출과 복귀 명령어가 함께 사용된다. 

        1) 호출(CALL) 명령어 : 현재 프로그램 카운터(PC) 내용을 스택에 저장하고 서브루틴의 시작 주소로 분기하는 명령어

        2) 복귀(RET) 명령어 : 분기하기 전 CPU가 원래 실행하던 프로그램으로 되돌아가도록 하는 명령어

     

     

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

    출처 : 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011

    1. 210번지의 CALL SUB 1 명령어를 수행하기 전에 서브루틴을 끝내고 다시 돌아와야 할 주소인 211번지가 스택에 저장된다.

    2. SUB 1을 수행하기 위해 해당 주소로 간다.

    3. 260번지의 CALL SUB 2 명령어를 수행하기 전에 서브루틴을 끝내고 다시 돌아와서 수행할 명령어의 주소인 261이 스택에 저장된다.

    4. SUB 2를 수행하기 위해 해당 주소로 간다. 

    5. SUB 2의 명령어를 다 수행하고 RET 명령어를 만나면 스택을 POP한다. 돌아가야 할 주소인 261번지가 나오기 때문에 해당 주소로 이동한다.

    6. 다시 SUB 1으로 돌아와서 명령어를 수행하다가 CALL SUB 2를 만나면 스택에는 돌아와야 할 주소인 281번지가

    저장된다.

    7. SUB 2의 명령어를 수행하고 RET 명령어를 만나면 스택을 POP한다. 돌아가야 할 주소인 281이 나오기 때문에 해당 주소로 간다.

    8. 이제 SUB 1으로 복귀해서 다시 명령어를 수행하다가 RET 명령어를 만나면 스택을 POP해서 211번지로 돌아간다.

     

     

    명령어 분류

    *명령어의 오퍼랜드에 저장되는 데이터 형태

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

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

    - 문자 : ASCII 코드

    - 논리 데이터 : 비트 or 플래그

     

    *명령어 형식은 오퍼랜드 수에 따라 0~3주소 명령어로 나뉜다.

    출처 : 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011

     

    1. 1주소 명령어

    - 오퍼랜드가 1개만 있는 명령어 형식

    - 오퍼랜드 형태는 주소

    - EX) LOAD X     => X번지의 데이터를 가져오라는 뜻

     

    2. 2주소 명령어

    - 오퍼랜드가 2개 있는 명령어 형식
    - 오퍼랜드 2개 모두 주소를 저장한다.

    - EX) MOV X, Y   => Y번지의 데이터를 X번지로 옮기라는 뜻

     

    3. 3주소 명령어

    - 오퍼랜드가 3개 있는 명령어 형식

    - 오퍼랜드가 레지스터의 주소를 저장한다.

    - 결과를 저장하는 오퍼랜드의 위치는 CPU 제조사마다 다르다.

    - EX) ADD X, Y, Z => Y와 Z번지의 데이터를 더해서 X번지에 저장하라는 뜻

     

    4. 0주소 명령어

    - 연산 코드만 존재하는 명령어 형식

    - 스택 구조에서 사용된다.

     

     

    *0~3주소 명령어를 사용해서 X = B *( C+ D * E – F / G ) 을 구현해보자

     

    1) 0주소 명령어 사용

     

    PUSH B : 스택에 B를 넣음

    PUSH C : 스택에 C를 넣음

    PUSH D : 스택에 D를 넣음

    PUSH E : 스택에 E를 넣음

    MUL : E와 D를 POP해서 곱한 뒤 결과 값을 스택에 PUSH

    ADD : E*D의 결과 값과 C를 POP해서 더한뒤 스택에 PUSH

    PUSH F : 스택에 F를 넣음

    PUSH G : 스택에 G를 넣음

    DIV : G와 F를 POP해서 나눈 뒤 결과 값을 스택에 PUSH

    SUB : F/G의 결과 값과 C+E*D의 결과 값을 POP해서 빼준 뒤 스택에 PUSH

    MUL : (C+D*E-F/G)의 결과와 B를 POP해서 곱한 뒤 스택에 PUSH

    POP : 기억장치 X번지에 저장하기 위해 최종 결과 값을 POP

    출처 : 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011

    => 해당 과정에서 스택의 모습이다.

     

    2) 1주소 명령어 사용

    LOAD F : F주소의 값을 불러옴. 불러온 값은 누산기에 저장된다.

    DIV G : 누산기에 있는 값을 G로 나눈다.

    STOS T : T에 나눈 결과 값을 저장한다.

    LOAD D : D주소의 값을 불러옴.

    MUL E : 누산기에 있는 값과 E를 곱한다.

    ADD C : E*D에 C를 더해줌

    SUB T : C+E*D에서 T에 저장된 값을 뺀다.

    MUL B : C+D*E-F/G에 B를 곱한다.

    STOS X : X에 최종 결과 값을 저장한다.

     

    3) 2주소 명령어 사용

    MOV R1, D : D주소의 값을 R1으로 옮긴다.

    MUL R1, E : R1의 값과 E를 곱한다.    (D*E)

    MOV R2, F : F주소의 값을 R2로 옮긴다.   

    DIV R2, G : R2의 값을 G로 나눈다.  (F/G)

    SUB R1, R2 : R1-R2  (D*E-F/G)

    ADD R1, C : R1+C     (C+D*E-F/G)

    MUL R1, B : R1*B   {B*(C+D*E-F/G)}

    MOV X, R1 : X에 최종 결과 값을 저장한다.

     

    4) 3주소 명령어 사용

    MUL D, E, R1 : D*E를 R1에 저장한다.    

    ADD C, R1, R1 : C+R1을 R1에 저장한다.    (C+D*E)

    DIV F, G, R2 : F/G를 R2에 저장한다.

    SUB R1, R2, R1 : R1-R2를 R1에 저장한다. (C+D*E-F/G)

    MUL B, R1, X : B*R1을 X에 저장한다.

    => DIB, SUB에서 무엇에서 무엇을 빼는지, 무엇에서 무엇을 나누는지 주의해야 한다. (결과를 저장하는 오퍼랜드의 위치는 CPU 제조사마다 다르기 때문)

     

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

    1) 주소 개수가 많은 경우

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

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

    - 전체적인 프로그램 속도는 빨라지고 하나의 명령어를 수행하는 속도는 느려진다.

     

    2) 주소 개수가 적은 경우

    - 오퍼랜드의 수가 적어서 간단하기 때문에 명령어 인출과 실행 속도가 높아진다

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

     

     

     

    더보기

    문제

    1. 스택 구조에서 사용되는 명령어 형식은?

     

    2. 레지스터 주소는 명령어 오퍼랜드에 저장되는 데이터의 형태다. (O/X)

     

    3. 250번지에 있는 명령어 CALL SUB 1을 수행하기 전에 스택에 들어가야 할 값은 무엇인가?

     

    4. BRZ 211 명령어의 의미로 알맞은 것은?

     1) 211번지의 데이터 로드

     2) 211번지의 데이터 복사

     3) 조건 코드의 결과가 1이라면 211번지로 분기하라는 명령어

     4) 조건 코드의 결과가 0이라면 211번지로 분기하라는 명령어

     

    5. 명령어 주소 개수가 많으면 프로그램이 짧아져 프로그램 당 명령어의 수가 감소한다. (O/X)

      

     

     

    더보기

    정답 및 해설

    1. 0주소 명령어 형식

    - 0주소 명령어는 연산코드만 존재하는 명령어 형식으로 스택 구조에서 사용된다.

     

    2. O 

    - 레지스터 주소는 명령어 오퍼랜드에 저장되는 데이터 형태다.

     

    3. 251

    - 서브루틴을 끝내고 돌아왔을 때 다음 명령어를 순차적으로 실행해야 하므로 call sub 1의 다음 번지인 251이 스택에 저장되어야 한다.

     

    4. 4

    - BRZ 211 명령어는 branch if zero의 약자로 조건 코드의 결과가 0이라면 211번지로 분기하라는 명령어이다.

     

    5. O

    - 명령어 주소 개수가 많으면 프로그램이 짧아져 프로그램 당 명령어의 수가 감소한다.

    반응형

    'Study > 컴퓨터구조' 카테고리의 다른 글

    [6] MIPS 시스템  (0) 2020.06.09
    [5] 캐시 기억장치  (0) 2020.06.04
    [3-2] 메모리 구조와 레지스터 종류  (0) 2020.05.23
    [3-1] 컴퓨터 명령어 실행 기법  (0) 2020.05.22
    [2-2] 컴퓨터의 명령어  (0) 2020.04.17