조건문 구조

2025. 5. 22. 19:24어셈블리 프로그래밍

점프 명령어

  • (a-b)를 수행하면 상태 플래그에 변화가 발생하게 된다.
  • 예를 들면 a> b이면 a-b>0이어야 한다.
  • 하지만 a-b<0이면 a-b 연산에서 오버플로우가 발생하게 된다.
  • 즉 a<b인 경우에는 SF=1, OF=1이어야 한다.

CMP 명령어

  • CMP명령어는 두 개의 내용을 빼서 두 내용을 비교하는 역할을 한다.
CMP AX,BX ;(AX-BX)의 결과에 따라 상태 플래그가 변화한다.
  • 위의 코드에서 AX는 목적지, BX는 근원지라고 한다.

JXXX

  • JXXX는 참 거짓의 조건에 따라서 위치를 이동하는 명령어이다.
  • XXX는 조건으로 목적지 래이블은 점프 명령어가 참일 때 이동하는 메모리 위치를 나타낸다.
JXXX 목적지_레이블
  • 목적지 레이블은 점프 명령어 보다 +127바이트 이내 또는 -126바이트 이내에 있어야 한다.

부호 없는 조건 점프 명령어

명령어 설명 상태 플래그
JA(JBNE) A>B, 아니면 다음 명령어 CF=0이고 ZF=0
JAE(JNB) A>B 이거나 A=B, 아니면 다음 명령어 CF=0
JB(JNAE) A<B, 아니면 다음 명령어 CF=1
JBE(JNA) A<B 이거나 A=B, 아니면 다음 명령어 CF=1이고 ZF=1
ex)
AX=7 FFFH, BX=8000H

CMP AX, BX ;부호 없는 두 수를 비교한다.
JA @NEXT ;조건이 거짓이 되어 다음 명령어를 수행한다.

AX-BX=FFFFH이므로 CF=1이고 ZF=0이기 때문에 JA명령어는 거짓이 되기 때문에 다음 명령어를 수행한다.

부호 있는 조건 점프 명령어

명령어 설명 상태 플래그
JG(JNLE) A>B, 아니면 다음 명령어 ZF=0이고 SF=OF
JGE(JNL) A>B 이거나 A=B, 아니면 다음 명령어 SF=OF
JL(JNGE) A<B, 아니면 다음 명령어 SF<>OF
JLE(JNG) A<B 이거나 A=B, 아니면 다음 명령어 ZF=1 또는 SF<>OF
  • 오버플로우가 발생하지 않으면 ZF=0, SF=0, OF=0인지 확인하고 아니라면 ZF=0, SF=1, OF=1을 해주면 된다.
AX=7FFFH, BX-8000H
CMP AX,BX
JA @NEXT
음수가 나왔기 때문에 OF는 1이고 SF는 1이 된다.
@NEXT로 이동하게 된다.

단일 플래그 점프 명령어

  • 1개의 상태 플래그를 활용하여서 참인지를 판단한다.
명령어 설명 상태 플래그
JE (JZ) 만약 같으면 점프
만약 0이면 점프
ZF=1
JNE (JNZ) 같지 않으면 점프
0이 아니면 점프
ZF=0
JC 캐리가 발생하면 점프 CF=1
JNC 캐리가 발생하지 않으면 점프 CF=0
JO 오버플로우가 발생하면 점프 OF=1
JNO 오버플로우가 발생하지 않으면 점프 OF=0
JS 결과가 음수라면 점프 SF=1
JNS 결과가 음수가 아니면 점프 SF=0
ex)
CX=0001H 일 때 다음 점프 명령어를 해석
DEC CX
JZ @NEXT
루프 카운터를 1 감소 시키면 0이 되고
ZF는 1이 되기 때문에 @NEXT로 이동한다.​

무조건 점프 명령어

  • 특정 위치로 무조건 이동할 때 사용한다.
  • JMP명령어는 무조건 같은 점프 명령어로 같은 세그먼트 내에 있는 목적지 레이블로 이동한다.
JMP 목적지_레이블
  • 범위는 127바이트 앞 뒤에 있어야 한다.
  • 목적지 레이블의 위치가 해당 범위를 벗어나게 되면 무조건 점프 명령어를 사용해서 이동해야 한다.
@TOP:
	DEC CX
    JNZ @TOP ;126비트 ;0이 아닌 경우 @TOP 레이블로 이동
@TOP:
	DEC CX
    JNZ @NEXT
    JMP @EXIT
@NEXT:
	JMP @TOP
@EXIT:
ex) 
.MODEL SMALL
.STACK 100H
.DATA
	MSG DB 'LOOP FINSISHED.$'

.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX
    
    MOV CX,5
@START_LOOP:
	DEC CX
    JNZ @NEXT_LOOP
    
    JMP @END_PROGRAM
    
@NEXT_LOOP
	JMP @START_LOOP
    
@END_LOOP
	MOV AH, 09H
    LEA DX, MSG
    INT 21
    
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN​


-CX가 0이라면 @END_LOOP레이블로 이동하고, 아니라면 @NEXT_LOOP으로 이동하고 START_LOOP로 이동해 준다.

단일 조건문 구조

  • IF-ELSE구조
  • 조건이 참이면 TEHN, 조건이 거짓이면 IF문을 종료
	CMP A,0
	JGE @END_IF ;음수가 맞으면 @NEG_IF로 이동
	NEG A
@END_IF
ex)
ABS값을 출력하는 코드
.MODEL SMALL
.STACK 100H

.DATA
	A DB -50
    MSG DB 'ABS COMPLETE.$'
    
.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX
    
    MOV AL, A
    CMP AL, 0
    JG @END_IF
    
    NEG AL
    
@END_IF
	MOV A, AL
    
    MOV AH, 09H
    LEA DX, MSG
    INT 21H
    
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN​


부호를 반대로 변환

.MODEL SMALL
.STACK 100H
.DATA 
    A DB ?
    PROMPT DB '?$'
    MSG_DONE DB 13, 10, 'ABS COMPLETE.$'
    INBUF DB 5, ?, 5 DUP(?) 
    ;최대 입력길이: 5
    ;실제 입력 길이:?
    ;DUP(?)로 ?로 초기화
    
.CODE 
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX
    
    MOV AH, 09H
    LEA DX, PROMPT
    INT 21H
    
    LEA DX, INBUF
    MOV AH, 0AH
    INT 21H
    
    LEA SI, INBUF + 2 
    ;[INBUF + 2]부터 데이터가 존재
    MOV BL, [SI]
    
    CMP BL, '-'
    JNE PARSE_POSITIVE
    INC SI
    MOV AL, [SI]
    SUB AL, '0'
    NEG AL
    JMP STORE_IN_A

PARSE_POSITIVE:
    SUB BL, '0'
    MOV AL, BL

STORE_IN_A:
    MOV A, AL

    MOV AL, A
    CMP AL, 0 ;0보다 작으면 점프
    JGE END_IF  

    NEG AL ;아니라면 음수로 변환

END_IF:
    MOV A, AL
    
    MOV AH, 09H
    LEA DX, MSG_DONE
    INT 21H
    
    MOV AH, 4CH
    INT 21H
MAIN ENDP
END MAIN
?-7 ;7로 변환
ABS COMPLETE.


AX, BX를 빅 하여 큰 수는 AX 작은 수는 BX에 저장

.MODEL SMALL
.STACK 100H
.DATA 
	PROMPT1 DB "? AX:$"
    PROMPT2 DB "? BX:$"
    MSG DB 13, 10, 'COMPLETE (UNSINGED).$'
    
.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX
    
    MOV AAH, 09H
    INT 21H
    SUB AL, '0'
    MOV AH, 0
    MOV AX, AX
    
    MOV AH, 09H
    LEA DX, PROMPT2
    INT 21H
    
    MOV AH, 01H
    INT 21H
    SUB AH, '0'
    MOV AH, 0
    MOV BX, AX
    
    CMP AX, BX
    JAE END_IF
    XCHG AX, BX 
    ;AX에는 큰수를 BX에는 작은 수를 저장
    
    END_IF
    MOV AH, 09H
    LEA DX, MSG
    INT 21H
    
    MOV AH, 09H
    INT 21H
MAIN ENDP
    END MAIN

IF-THEN-ELSE 구조

ex)
AL, BL을 비교하여 CL에 큰 수를 저장
	CMP AL, BL
    JL @THEN
    MOV CL, AL
    
    JMP @END_IF
@THEN:
	MOV CL, BL
@END_IF:​


두 문자를 입력받아 ASCII코드 값이 큰 문자를 화면에 출력하는 프로그램

.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
	PMOV AH, 02H
    MOV DL, '?'
    INT 21H
    
    MOV AH, 01H
    INT 21H
    
    MOV CL, AL
    CMP BL, CL
    JA @THEN
    MOV DH, CL
    JMP @END_IF
@THEN:
	MOV DH, BL
@END_IF
	MOV AH,2
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    
    MOV DL, DH
    INT 21H
    
    MOV AH, 4CH
    INT 21H
    
MOV ENDP
END MAIN

CASE 구조

CASE 표현식
 값 1: 실행 문장
 값 2: 실행 문장
 ...
 값 N: 실행 문장
END_CASE
ex)
AX>BX이면 CX=1, AX=BX이면 CX=0, AX<BX이면 CX=-1로 저장
	CMP AX, BX
    JG @LARGE
    JE @EQUAL
    JL @SMALL
    
@LARGE:
	MOV CX, 1
    JMP @END_CASE
@EQUAL:
	MOV CX, 0
    JMP @END_CASE
@SMALL:
	MOV CX,-1
@END_CASE:​


입력받은 문자가 1이면 'SPRING', 2이면 'SUMMER', 3이면 'FALL', 4이면 'WINTER' 그 외 이면 ERROR를 출력

.MODEL SMALL
.STACK 100H
.DATA 
	SPR_MSG DB 0DH, 0AH, 'SPRING$'
	SUM_MSG DB 0DH, 0AH, 'SUMMER$'
    FAL_MSG DB 0DH, 0AH, 'FALL$'
    WIN_MSG DB 0DH, 0AH, 'WINTER$'
    ERR_MSG DB 0DH, 0AH, 'ERROR$'
    
.CODE
MAIN PROC
	MOV AX, @DATA
    MOV DS, AX
    
    MOV AH, 02H
    MOV DL, '?'
    INT 21H
    
    MOV AH, 01H
    INT 21H
    
    SUB AL, 30H
    CMP AL, 1
    JE SPRING
    CMP AL, 2
    JE SUMMER
    CMP AL, 3
    JE FALL
    CMP AL, 4
    JE WINTER
    
    LEA DX, ERR_MSG
    JMP END_CASE
SPRING:
	LEA DX, SPR_MSG
    JMP END_CASE
SUMMER:
	LEA DX, SUM_MSG
    JMP END_CASE
FALL:
	LEA DX, FAL_MSG
    JMP END_CASE
WINTER:
	LEA DX, WIN_MSG
    JMP END_CASE
END_CASE:
	MOV AH, 9
	INT 21H
    
    MOV AH, 4CH
    INT 21H
MAIN ENDP
	END MAIN
?2
SUMMER

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

반복문  (0) 2025.05.25
조건문 구조(2)  (0) 2025.05.22
플래그 래지스터&디버거  (0) 2025.04.27
문자 입출력  (0) 2025.04.13
8086 어셈블리 언어  (0) 2025.04.04