728x90
반응형
1. 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
; 문자 상수 정의
cr equ 0dh
lf equ 0ah
; 스택 세그먼트 정의
segment stack stack
resw 512
tos:
; 데이터 세그먼트 정의
segment data
mess1 db "Enter number : $"
crlf db cr, lf, "$"
linput db 20
db 0
resb 20
; 코드 세그먼트 정의
segment code
..start:
mov ax, data
mov ds, ax
mov es, ax
; 스택 설정
cli
mov ax, stack
mov ss, ax
mov sp, tos
sti
start:
; 입력 메시지 출력
mov dx, mess1
mov ah, 09h
int 21h
; 입력 받기
mov dx, linput
mov ah, 0ah
int 21h
; 개행 출력
mov dx, crlf
mov ah, 09h
int 21h
; 입력 처리 시작
xor di, di ; di 초기화
mov si, linput + 2 ; 입력 버퍼 시작 위치 설정
processinput:
mov al, [si]
inc si
cmp al, ' '
je processinput
cmp al, 09h
je processinput
processinginput:
cmp al, cr
je endprocessinginput
; 문자를 정수로 변환
sub al, '0'
jb inputerr
cmp al, 09h
jbe inputisnum
inputerr:
; 에러 메시지 출력 후 다시 시작
mov dx, errm
mov ah, 09h
int 21h
jmp start
inputisnum:
; 입력된 숫자를 16비트로 처리
add di, di
mov cx, di
add di, di
add di, di
add di, cx
xor ah, ah
add di, ax
; 다음 문자 처리
mov al, [si]
inc si
jmp processinginput
endprocessinginput:
; 입력된 숫자가 0이면 종료
cmp di, 2
je isprime
cmp di, 1
je inputerr
cmp di, 0
jne inputisnotzero
mov ax, 4c00h
int 21h
inputisnotzero:
|
cs |
- linput에 [전체 buffer 크기] [현재 buffer에 입력 받은 문자열의 크기] [ 실제 입력 받은 문자열] 이러한 모양으로 입력 받는다.
- inputisnum에서 a * 10 + b 를 통해 아스키코드를 정수로 처리한다.
- 결과는 di에 저장되게 된다.
2. 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
mov ax, di ; 출력할 값은 di에 저장되어있다.
xor dx, dx
xor cx, cx
print:
mov bx, 10
div bx ; dx:ax / bl
push dx ; 나머지를 스택에 저장
xor dx, dx
inc cx ; 소수 자릿수 증가
cmp ax, bx
jae print
cmp ax, 0
je printloop
push ax
inc cx
printloop:
xor dx, dx
pop dx
add dl, '0'
mov ah, 02h
int 21h
loop printloop
mov dx, crlf
mov ah, 09h
int 21h
jmp start
mov ax, 4c00h
int 21h
|
cs |
- 출력할 값은 di에 저장되어있다.
- overflow를 방지하기 위해 32bit 나눗셈으로 처리한다.
- print:에서 계속해서 몫을 10으로 나누어주면서 나머지를 stack에 저장한다.
- printloop:에서 stack에 저장했던 나머지들을 pop해서 아스키코드로 출력한다.
728x90
반응형