조건문 구조(2)

2025. 5. 22. 20:28어셈블리 프로그래밍

복합 조건문 구조

  • AND 복합 조건 구조
  • 두 조건이 모두 참이면 @THEN, 아니면 @ELSE문장 실행
IF(조건_1 AND 조건_2)
 THEN 참의 문장
 ELSE 거짓의 문장
END_IF
ex)
입력받은 문자가 대문자이면 대문자를 출력, 아니면 처음부터 다시 시작
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
@BEGIN
	MOV AH, 02H
    MOV DL, '?'
    INT 21H
    
    MOV AH, 01H
    INT 21H
    MOV BL, AL
    CMP BL, 'A' ;AL<'A'이면 대문자(X)
    JB WRONG
    CMP BL, 'Z' ;AL>'Z'이면 대문자(X)
    JA WRONG
    
    MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    MOV DL, BL
    INT 21H
    JMP EXIT
WRONG:
	MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    JMP EXIT
EXIT:
	MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN​
?B
B
  • OR 복합 조건 구조
  • 한 가지 조건만 참이어도  THEN, 아니라면 ELSE
IF(조건_1 OR 조건_2)
 THEN 참의 문장을 실행
 ELSE 거짓의 문장을 실행
END_IF
ex)
소문자가 아니면 CX 레지스터에 1을 저장
.MODEL SMALL
.STACK 100H
.DATA 
	MSG1 DB 0DH, 0AH, "CHAR INPUT: $"
    NOT_LOWER_MSG DB 0DH, 0AH, "NOT LOWER$"
    
.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX

    MOV AH, 09H
    LEA DX, MSG1
    INT 21H
    
    MOV AH, 01H
    INT 21H
    
    CMP AL, 'a'
    JB THEN 
    CMP AL, 'z'
    JA THEN
    
    MOV CX, 0
    JMP END_IF
    
THEN:
	MOV CX, 1
END_IF:
	CMP CX, 1
    JNE EXIT
    
    LEA DX, NOT_LOWER_MSG
    MOV AH, 09H
    INT 21H
    
EXIT:
	MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN​

CHAR INPUT:G (CX=0)
NOT LOWER​

실습 문제

  • 소문자를 대문자, 대문자를 소문자, 이 둘이 아니라면 ERROR를 출력
.MODEL SMALL
.STACK 100H
.DATA
	MSG DB 'ERROR$'

.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX

    MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV AH, 01H
    INT 21H
    MOV BL, AL

    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    CMP BL, 'A'
    JL ERROR
    CMP BL, 'Z'
    JLE UPPER
    CMP BL, 'a'
    JL ERROR
    CMP BL, 'z'
    JLE LOWER
    JMP ERROR

UPPER:
	ADD BL, 20H
    MOV DL, BL
    MOV AH, 02H
    INT 21H
    JMP END_CASE

LOWER:
	SUB BL, 20H
    MOV DL, BL
    MOV AH, 02H
    INT 21H
    JMP END_CASE

ERROR:
	MOV AH, 09H
    LEA DX, MSG
    INT 21H

END_CASE:
	MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?A
a
  • -9~9 사이의 수를 입력받아 BL레지스터에 저장하고 입력받은 수의 절댓값을 출력하는 프로그램
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
	MOV AX, @DATA
	MOV DS, AX

	MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV CX, 0
    MOV AH, 01H
    INT 21H
    CMP AL,'-'
    JE MINUS
    CMP AL,'+'
    JE PLUS
    JMP SAVE

MINUS: 
	MOV CX, 1
PLUS:
	INT 21H

SAVE:
	SUB AL, 30H
    MOV BL, AL
    CMP CX, 1
    JNE NEXT1
    NEG BL

NEXT1:
	CMP BL, 0
    JGE NEXT2
    NEG BL

NEXT2:
	MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    MOV DL, BL
    ADD DL, 30H
    INT 21H

    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?-4
4
  • 0~9두 수를 입력 받고 입력받은 두 수의 차이를 구하는 프로그램
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
	MOV AX, @DATA
	MOV DS, AX

	MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV AH, 01H
    INT 21H
    SUB AL, 30H
    MOV BL, AL

    MOV AH, 01H
    INT 21H
    SUB AL, 30H
    MOV CL, AL

    MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    MOV AL, BL
    SUB AL, CL
    JNS OUTPUT
    NEG AL

OUTPUT:
    ADD AL, 30H
    MOV DL, AL
    MOV AH, 02H
    INT 21H

    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?58
3
  •  두 개의 소문자를 이볅 받아 알파벳 순서대로 출력하는 프로그램
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
	MOV AX, @DATA
	MOV DS, AX

@BEGIN:
	MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV AH, 01H
    INT 21H
    MOV BL, AL

    CMP AL, 'a'
    JL WRONG
    CMP AL, 'z'
    JG WRONG

    MOV AH, 01H
    INT 21H
    MOV CL, AL

    CMP CL, 'a'
    JL WRONG
    CMP CL, 'z'
    JG WRONG

    MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    CMP BL, CL
    JLE OUTPUT
    XCHG BL, CL

OUTPUT:
	MOV DL, BL
    MOV AH, 02H
    INT 21H

    MOV DL, CL
    MOV AH, 02H
    INT 21H
    JMP EXIT

WRONG:
	MOV AH, 02H
	MOV DL, 0DH
	INT 21H
    MOV DL, 0AH
    INT 21H
    JMP BEGIN

EXIT:
	MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?db
bd
  • 세 개의 대문자를 입력 받아 알파벳 순서의 반대로 출력하는 프로그램
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
	MOV AX, @DATA
	MOV DS, AX

	MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV AH, 01H
    INT 21H
    MOV BL, AL

    MOV AH, 01H
    INT 21H
    MOV BH, AL

    MOV AH, 01H
    INT 21H
    MOV CL, AL

    CMP BL, BH
    JLE NEXT1
    XCHG BL, BH
NEXT1:
	CMP BL, CL
    JLE NEXT2
    XCHG BL, CL
NEXT2:
	CMP BH, CL
    JLE OUTPUT
    XCHG BH, CL
OUTPUT:
	MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    MOV DL, BL
    INT 21H
    MOV DL, BH
    INT 21H
    MOV DL, CL
    INT 21H

    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?cab
abc
  • 세 개의 대문자를 입력 받아 알파벳 순서상 중간에 오는 대문자의 소문자를 출력하는 프로그램
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
	MOV AX, @DATA
	MOV DS, AX

	MOV AH, 02H
    MOV DL, '?'
    INT 21H

    MOV AH, 01H
    INT 21H
    MOV BL, AL

    MOV AH, 01H
    INT 21H
    MOV BH, AL

    MOV AH, 01H
    INT 21H
    MOV CL, AL

    CMP BL, BH
    JLE NEXT1
    XCHG BL, BH
NEXT1:
	CMP BL, CL
    JLE NEXT2
    XCHG BL, CL
NEXT2:
	CMP BH, CL
    JLE OUTPUT
    XCHG BH, CL
OUTPUT:
	MOV AH, 02H
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H

    ADD BH, 20H
    MOV DL, BH
    INT 21H

    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?CAB
b

'어셈블리 프로그래밍' 카테고리의 다른 글

조건문 심화  (0) 2025.05.25
반복문  (0) 2025.05.25
조건문 구조  (0) 2025.05.22
플래그 래지스터&디버거  (0) 2025.04.27
문자 입출력  (0) 2025.04.13