-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinputDec.asm
142 lines (125 loc) · 1.39 KB
/
inputDec.asm
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
.model small
.stack 100h
.data
in1 dw 0
in2 dw 0
result dw 0
.code
main proc
mov ax,@data
mov ds,ax
call inputDec
mov AX,result
mov in1,AX
MOV ax,0
mov result,ax
call inputDec
mov AX,result
add AX,in1
call OUTDEC
mov ah,4ch
int 21h
main endp
inputDec PROC
mov ax,@data
mov ds,ax
PUSH AX
PUSH BX
PUSH CX
PUSH DX
BEGIN:
MOV AH,2
MOV DL,'?'
INT 21H
;BEGIN
XOR BX,BX
;NEGATIVE =FALSE
XOR CX,CX
;READ A CHARACTER
MOV AH,1
INT 21H
;CASE CHARACTER OF
CMP AL,'-'
JE MINUS
CMP AL,'+'
JE PLUS
JMP REPEAT2
MINUS:
MOV CX,1
PLUS:
INT 21H
REPEAT2:
CMP AL,'0'
JNGE NOT_DIGIT
CMP AL,'9'
JNLE NOT_DIGIT
;CONVERT CHARACTER TO DIGIT
AND AX,000FH ;conversion to decimal
PUSH AX
; TOTAL = T0TAL*10+DIGIT
MOV AX,10
MUL BX
POP BX
ADD BX,AX
; READ A CHARACTER
MOV AH,1
INT 21H
CMP AL,0DH
JNE REPEAT2
;IF NEGATIVE
OR CX,CX
JE EXIT
NEG AX
EXIT:
mov result,BX
POP DX
POP CX
POP BX
POP AX
NOT_DIGIT:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
RET
inputDec ENDP
OUTDEC PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
OR AX,AX ;ax<0
JGE END_IF1
PUSH AX
MOV DL,'-'
MOV AH,2
INT 21H
POP AX
NEG AX
END_IF1:
;GET DECIMAL DIGITS
XOR CX,CX
MOV BX,10D
REPEA:
XOR DX,DX
DIV BX
PUSH DX;remainder
INC CX
;UNTIL
OR AX,AX
JNE REPEA
; CONVERT DIGIT TO CHARACTER AND PRINT
MOV AH,2
PRINT_LOOP:
POP DX
ADD DL,30H
INT 21H
LOOP PRINT_LOOP
POP AX
POP BX
POP CX
POP DX
RET
OUTDEC ENDP
end main