기타

nasm 16bit 숫자 입력, 출력

YunSeong 2024. 5. 12. 17:50
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
반응형