조건문 구조
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 |