C H A P T E R

11
ㅔ

제어 흐름의 구현

공부할 내용

★ 순서, 택일, 반복 구조

★ 제어 흐름을 프로그램하는 체계화된 접근법

- CASE 구조

- CASE-ELSE 구조

- IF-THEN-ELSE 구조

- IF-THEN 구조

- REPEAT-UNTIL 구조

- WHILE-REPEAT 구조

순서, 택일, 반복

★ 프로그램 안에서의 제어 흐름의 근본적인 구조

-  순서, 택일, 반복

(1) 순서/시퀀스(sequence) - 문장들을 순서대로 1개씩 실행한다.

; swap the values in TOTAL and VALUE

MOV     AX, TOTAL

XCHG    AX, VALUE

MOV     TOTAL, AX

(2) 택일(alternation) - 지정된 조건의 값에 따라서 여러 시퀀스의 명령문들 중에서 한 개의 시퀀스가 택하여 실행한다.

예)  IF CHOICE = 1 THEN SWAP (TOTAL, VALUE)를 구현

; if CHOICE = 1 then swap TOTAL and VALUE

CMP     CHOICE, 1

JNE      L1

MOV     AX, TOTAL

XCHG    AX, VALUE

MOV     TOTAL, AX

L1:

(3) 반복(repetition) - 어떤 조건이 만족될 때까지 또는 만족되는 동안에 명령 시퀀스를 반복하여 실행한다.

제어 흐름을 프로그램하는 체계화된 접근법

(1) CASE 구조

CASE의 구조의 형식

CASE

cond1: seq1,

cond2: seq2,

cond3: seq3, ...

예) CASE

CHOICE=1: DISPLAY 프로시저를 호출하라,

CHOICE=2: GET_INPUT 프로시저를 호출하라,

CHOICE<0: TOTAL을 AX 레지스터에 더하라.

어셈블리 언어로

; case CHOICE=1: call DISPLAY

;      CHOICE=2: call GET_INPUT

;      CHOICE<0: add TOTAL to AX

CMP     CHOICE, 1

JE      L1

CMP     CHOICE, 2

JE      L2

CMP     CHOICE, 0

JL      L3

JMP     L4

L1:                                     ; CHOICE=1

CALL    DISPLAY

JMP     L4

L2:                                     ; CHOICE=2

CALL    GET_INPUT

JMP     L4

L3:                                     ; CHOICE<0

ADD     AX, TOTAL

L4:

CASE 구조의 일반적인 패턴

; case cond1: seq1,

;      cond2: seq2,

;      cond3: seq3,

CMP     (cond1)

Jcond1  L1

CMP     (cond2)

Jcond2  L2

CMP     (cond3)

Jcond3  L3

JMP     L4

L1:                                     ; cond1

--- (seq1) ---

JMP     L4

L2:                                     ; cond2

--- (seq2) ---

JMP     L4

L3:                                     ; cond3

--- (seq3) ---

L4:

(2) CASE-ELSE 구조

CASE-ELSE 구조의 형식

CASE

cond1: seq1,

cond2: seq2,

cond3: seq3,

.

.

.

ELSE: else-seq

예)  CASE-ELSE 구조에 대한 예제

CASE

CHOICE=1: DISPLAY 프로시저를 호출하라,

CHOICE=2: GET_INPUT 프로시저를 호출하라,

CHOICE<0: TOTAL을 AX 레지스터에 더하라,

ELSE:   BAD_CHOICE에 1을 더하라.

어셈블리 언어로

; case CHOICE=1: call DISPLAY,

;      CHOICE=2: call GET_INPUT,

;      CHOICE<0: add TOTAL to AX,

;      else:     add 1 to BAD_CHOICE

CMP     CHOICE,1

JE      L1

CMP     CHOICE,2

JE      L2

CMP     CHOICE,0

JL      L3

JMP     L4

L1:                                     ; CHOICE=1

CALL    DISPLAY

JMP     L5

L2:                                     ; CHOICE=2

CALL    GET_INPUT

JMP     L5

L3:                                     ; CHOICE<0

ADD     AX,TOTAL

JMP     L5

L4:                                     ; else

ADD     BAD_CHOICE,1

L5:

CASE-ELSE 구조의 일반적인 패턴

; case cond1: seq1,

;      cond2: seq2,

;      else:  else-seq

CMP     (cond1)

Jcond1  L1

CMP     (cond2)

Jcond2  L2

JMP    L3

L1:                                    ; cond1

--- (seq1) ---

JMP     L4

L2:                                    ; cond2

--- (seq2) ---

JMP     L4

L3:

--- (else-seq) ---                 ; else

L4:

(3)IF-THEN-ELSE 구조

IF-THEN-ELSE의 형식

IF cond THEN

seq1

ELSE

seq2

예)  IF CHOICE>0 THEN

GOOD_CHOICE에 1을 더하라

ELSE

BAD_CHOICE에 1을 더하라

어셈블리 언어로

; if CHOICE>0: add 1 to GOOD_CHOICE

; else         add 1 to BAD_CHOICE

CMP     CHOICE,0

JG      L1

JMP     L2

L1:

ADD     GOOD_CHOICE,1

JMP     L3

L2:

ADD     BAD_CHOICE,1

L3:

IF-THEN-ELSE 구조의 일반적인 패턴

; if cond: seq1,

;    else: seq2

CMP     (cond)

Jcond   L1

JMP     L2

L1:                                     ; cond

--- (seq1) ---

JMP     L3

L2:                                     ; else

--- (seq2) ---

L3:

(4) IF-THEN 구조

IF-THEN의 형식

IF cond THEN seq

예)  IF	CHOICE<0 THEN

GOOD_CHOICE에 1을 더하라

CHOICE를 0으로 세트하라

어셈블리 언어로

; if CHOICE<0 then

;   add 1 to GOOD_CHOICE

;   set CHOICE to 0

CMP     CHOICE, 0

JNL     L1

ADD     GOOD_CHOICE,1

MOV     CHOICE, 0

L1:

IF-THEN 구조의 일반적인 패턴

; if cond then seq

CMP     (cond)

JNcond  L1

--- (seq) ---

L1:

(5) REPEAT-UNTIL 구조

REPEAT-UNTIL의 형식

REPEAT

seq

UNTIL cond

REPEAT_UNTIL을 사용한 프로그램의 논리적 구조

REPEAT

CALL GET_INPUT

CALL TEST_INPUT

UNTIL (input is valid)

어셈블리 언어로

; repeat

;    read the input,

;    test the input; until (input is valid; CF not= 1)

L1:

CALL    GET_INPUT

CALL    TEST_INPUT

JC       L1

예)  ; repeat

;    read the input;

;    test the input; until (input is valid: AX=0)

L1:

CALL    GET_INPUT

CALL    TEST_INPUT

CMP     AX, 0

JNE      L1

REPEAT-UNTIL 구조의 일반적인 패턴

; repeat seq until cond

L1:

--- seq ---

CMP     cond

JNcond  L1

(6) LOOP를 사용한 REPEAT-UNTIL의 변형된 형태

예) TABLE   DW      100 DUP(?)

.............

구조

AX 를 0으로 초기화하라

SI 를 0으로 초기화하라

CX 를 100으로 초기화하라

REPEAT

TABLE[SI]를 AX에 더하라

2를 SI에 더하라

UNTIL (명령문 열이 100회 수행되었다)

어셈블리 언어로

; set AX to the sum of 100 numbers,

; stored as words in TABLE

MOV     AX, 0

MOV     SI, 0

MOV     CX, 100

L1:

ADD     AX, TABLE[SI]

ADD     SI, 2

LOOP    L1

일반적인 패턴

; repeat seq N times

MOV     CX, N

L1:

--- seq ----

LOOP    L1

(7) LOOPE와 LOOPNE를 사용한

REPEAT-UNTIL의 변형된 형태

예) 테이블을 검색하면서 가장 왼쪽에 있는 -1을 찾는 프로그램

TABLE   DW      100  DUP(?)

...............

REPEAT-UNTIL 구조의 변형된 형태

SI를 -2로 초기화하라

CX를 100 으로 초기화하라

REPEAT

SI에 2를 더하라

TABLE[SI]와 -1을 비교하라

UNTIL (TABLE[SI]=-1 이거나 루프내의 시퀀스가 100번

실행되었다)

어셈블리 언어로

; search a table of 100 words for the value = -1

MOV     SI, -2

MOV     CX, 100

L1:

ADD     SI, 2

CMP     TABLE[SI], -1

LOOPNE  L1

일반적인 패턴

; repeat seq until (cond or n times)

MOV     CX, N

L1:

---- seq -----

CMP     cond

LOOPNE  L1

(8) WHILE-REPEAT 구조

WHILE-REPEAT의 형식

WHILE cond  REPEAT

seq

예) WHILE COUNT>0 REPEAT

CALL PRINT_DATA,

COUNT에서 1을 뺀다

어셈블리 언어로

; while COUNT>0 repeat

;    send data to printer,

;    subtract 1 from COUNT

L1:

CMP     COUNT, 0

JNG     L2

CALL    PRINT_DATA

SUB     COUNT, 1

JMP     L1

L2:

WHILE-REPEAT의 일반적인 패턴

; while cond repeat seq

L1:

CMP     cond

JNcond  L2

----  seq  ----

JMP     L1

L2: