C H A P T E R

11
ㅔ

제어 흐름의 구현

공부할 내용

★ 제어 흐름의 구현

- CASE 구조

- CASE-ELSE 구조

- IF-THEN-ELSE 구조

- IF-THEN 구조

- REPEAT-UNTIL 구조

- WHILE 구조

(1) CASE 구조

예)	; 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:

--- (seq1) ---

JMP     L4

L2:

--- (seq2) ---

JMP     L4

L3:

--- (seq3) ---

L4:

(2) CASE-ELSE 구조

CASE-ELSE 구조의 형식

CASE

cond1: seq1,

cond2: seq2,

cond3: seq3,

.

.

ELSE: else-seq

예)	; 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:

--- (seq1) ---

JMP     L4

L2:

--- (seq2) ---

JMP     L4

L3:

--- (else-seq) ---

L4:

(3)IF-THEN-ELSE 구조

예)	; 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:

--- (seq1) ---

JMP     L3

L2:

--- (seq2) ---

L3:

(4) IF-THEN 구조

예)	; 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

;    read the input, test the input

;    until (CF not= 1)

L1:

CALL    GET_INPUT

CALL    TEST_INPUT

JC       L1

예)  ; repeat

;    read the input, test the input

;    until (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의 형태

예)	; 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) LOOP(N)E를 사용한 REPEAT-UNTIL의 형태

예)	; 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 구조

예)	; while COUNT>0

;    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: