-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathex3.asm
247 lines (186 loc) · 4.9 KB
/
ex3.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
data segment
n db 0 ;n的阶乘
result db 18 dup(0)
temp db 18 dup(0)
base dw 0;保存数组基地址
multi db 2;乘数
carry db 0;进位
arr_size db 18
times db 0;计算乘的次数
temp_multi db 0
data ends
code segment
assume cs:code, ds: data
start:
mov ax, data
mov ds, ax
;从键盘读取n
input:
call inputch
cmp al, 13
je input_over
sub al, 30h
mov dl, al
mov al, n
mov cl, 10
mul cl
add al, dl
mov n, al
jmp input
input_over:
;打印换行符
mov dl, 10
mov ah, 02h
int 21h
;打印回车符
mov dl, 13
mov ah, 02h
int 21h
;开始计算阶乘
;jmp over
lea di, result
mov [di], 1
cmp n, 1 ;1的阶乘则直接打印
je print
;n不是1则开始计算
calcul:
lea di, result
mov ah, multi
cmp ah, n
ja print
cmp multi, 9
ja double
jmp single
double:;multi是两位数需要获取个位和十位
mov cl, 10
mov al, multi
mov ah, 0
mov temp_multi, al
div cl
mov multi, ah
lea si, temp
inc si
mov cx, 17
assign:
mov ah, [di]
mov [si], ah
inc si
inc di
loop assign
lea di, result
double_1:
mov ah, times
cmp ah, arr_size
je d_m_p_p
mov al, [di]
mul multi
add al, carry
cmp al, 10
jae d_carry_1
mov carry, 0
mov [di], al
inc di
inc times
jmp double_1
d_carry_1:
mov cl, 10
div cl
mov carry, al
mov [di], ah
inc di
inc times
jmp double_1
jmp d_m_p_p;double计算完应该multi++
;multi是一位数乘一次即可
single:
mov ah, times
cmp ah, arr_size
je m_p_p ;乘完了18次让multi++,否则继续计算
mov al, [di]
mul multi
add al, carry
cmp al, 10
jae carry_1
mov carry, 0
mov [di], al
inc di
inc times
jmp single
carry_1:
mov cl, 10
div cl
mov carry, al
mov [di], ah
inc di
inc times
jmp single
jmp m_p_p;singl计算完应该multi++
m_p_p:
mov carry, 0
mov times, 0
inc multi
jmp calcul
d_m_p_p:
mov carry, 0
mov times, 0
inc temp_multi
mov dl, temp_multi
mov multi, dl
;令temp与result相加
lea di, result
lea si, temp
inc si
inc di
mov cx, 17
plus:
mov al, [di]
add al, [si]
add al, carry
cmp al, 9
ja plus_carry
mov [di], al
mov carry, 0
inc di
inc si
jmp plus_over
plus_carry:
mov carry, 1
sub al, 10
mov [di], al
inc di
inc si
plus_over:
loop plus
jmp calcul
print:
lea di, result
mov base, di
add di, 17
di_cmp:
cmp [di], 0
je di_sub
jmp print_re
di_sub:
dec di
jmp di_cmp
print_re:
mov dl, [di]
add dl, 30h
mov ah, 02h
int 21h
cmp di, base
je over
dec di
jmp print_re
over:
mov ah, 4ch
int 21h
inputch proc
push dx
mov ah, 01h
int 21h
pop dx
ret
inputch endp
code ends
end start