FOR문
- 3,8,12,16.. 4의 배수를 50개의 합을 AX에 저장하는 프로그램
MOV CX, 50
MOV BX, 4
MOV AX, 0
@TOP:
ADD AX, BX
ADD BX, 4
LOOP @TOP
- CX 횟수를 50으로 지정
- BX,4를 활용하여서 4의 배수들을 저장
- AX, 0에는 전체 합을 저장
- ADD BX,4로 4의 배수를 모두 구해줌
- LOOP @TOP에서 계속 @TOP으로 이동하다가 CX가 0이면 다음으로 넘어감
| LOOP횟수 | AX(누적합) | BX(4의 배수) | AX+BX (이진) |
| 1 | 0+4 | 4 | 0000 0000 0000 0100 |
| 10 | 180+40 | 40 | 0000 0000 1101 1100 |
| 50 | 4900+200 | 200 | 0001 0011 1110 1100 |
- 16비트 스택을 표로 구성하여 값 저장한 상태를 묘사하면 다음과 같음
| 주소 | 저장된 값 | 상태 |
| 0FF4H | BZ=12 | 현 상태에서는 가장 마지막에 PUSH |
| 0FF6H | AX=8 | AX레지스터에 8 저장 후 PUSH |
| 0FF8H | BX=8 | BX에 8 저장 후 PUSH |
| 0FFAH | AX=4 | AX에 4 저장 후 PUSH |
| 0FFCH | BX=4 | BX에 4 저장 후 PUSH |
| 0FFEH | AX=0 | 첫번째로 AX에 저장 후 PUSH |
- SP는 PUSH 될 때마다 16비트 기준으로 2바이트씩 감소함
DO-WHILE
- 입력 받은 한 문장에서 알파벳 순서상 가장 앞에 오는 대문자를 출력하는 프로그램
MOV BL, '[' ; '['는 'Z'보다 큰 문자 → 최소값 초기화
MOV AH, 1
@DO_WHILE:
INT 21H ; AL에 문자 입력
CMP AL, 'A'
JB @END_IF ; AL < 'A' → 대문자 아님
CMP AL, 'Z'
JA @END_IF ; AL > 'Z' → 대문자 아님
CMP AL, BL
JAE @END_IF ; AL >= BL → 더 작지 않음
MOV BL, AL ; AL이 더 작으면 저장
@END_IF:
CMP AL, 13 ; Enter 키 입력? (ASCII 13)
JNE @DO_WHILE ; 아니면 계속 반복
; 여기서 BL에 가장 작은 대문자 저장됨
MOV AH, 4CH
INT 21H
실습 예제
MOV AH, 1 ; 문자 입력
INT 21H
SUB AL, 30H ; ASCII → 숫자
MOV CL, AL ; 반복 횟수 = 입력값
MOV BL, 0
@TOP:
ADD BL, CL ; BL += CL (입력값)
LOOP @TOP
MOV AH, 4CH
INT 21H
- 2진수에서 1의 개수를 카운트하여 출력하는 프로그램
MOV BL, 0 ; 숫자 개수 초기화
@WHILE:
MOV AH, 1 ; 문자 입력
INT 21H
CMP AL, 0DH ; Enter(0DH) 입력?
JE @END_WHILE
CMP AL, '0' ; '0'인가?
JE @WHILE ; 0이면 넘김
INC BL ; 0이 아닌 숫자면 개수 증가
; 개수를 출력 (BL은 8비트 정수)
MOV DL, BL
ADD DL, 30H ; 숫자를 ASCII 문자로
MOV AH, 2
INT 21H
JMP @WHILE
@END_WHILE:
MOV AH, 4CH
INT 21H
- 1,2,4,7....처럼 3개의 숫자의 합을 BX에 저 정하는 프로그램
MOV CX, 30 ; 반복 횟수 (예: 30번)
MOV BX, 1 ; 첫 번째 수열 값
MOV DX, 0 ; 증가값 (1부터 시작하게 INC DX 사용)
MOV AX, 0 ; 누적 합
@TOP:
ADD AX, BX ; 현재 수를 누적합에 더함
INC DX ; 증가값 +1 (1,2,3,...)
ADD BX, DX ; 다음 수열 값 계산
LOOP @TOP ; CX번 반복
MOV AH, 4CH
INT 21H