1 ;测试样例1:
2 ;输入3 4 5
3 ;输出12
4
5 ;测试样例2:
6 ;输入100 200 300
7 ;输出ERROR
8
9
10 enterline macro ;定义回车换行的宏指令
11 mov dl,13
12 mov ah,2
13 int 21h
14 mov dl,10
15 mov ah,2
16 int 21h
17 endm
18
19
20 DATAS SEGMENT
21 ;此处输入数据段代码
22 input db 'Please input the length of tiangle with three numbers,use a space between numbers:$'
23 output db 'ERROR$'
24 output1 db 'The circumference of this triangle is:$'
25 err db 'Illegal input! Please Try Again$'
26 out1 db 'Sorry, please leave the result between 0 and 65535.Please Try Again$'
27 buf db 20,?,20 dup(0) ;定义键盘接收字符缓冲区,最多接收19个字符
28 a dw ?
29 b dw ?
30 cc dw ? ;a b cc 分别是三条线段
31 flag db 0
32 DATAS ENDS
33
34 STACKS SEGMENT
35 ;此处输入堆栈段代码
36 STACKS ENDS
37
38 CODES SEGMENT
39 ASSUME CS:CODES,DS:DATAS,SS:STACKS
40 START:
41 MOV AX,DATAS
42 MOV DS,AX
43 ;此处输入代码段代码
44
45 begin:
46 lea dx,input ;给出输入提示
47 mov ah,9
48 int 21h
49 enterline ;回车换行
50
51
52 lea dx,buf ;从键盘接收输入数值放入buf缓冲区(输入操作)
53 mov ah,10
54 int 21h
55 enterline ;回车换行
56
57
58 mov cl,buf+1 ;获取实际键入字符数,置于CX寄存器中
59 xor ch,ch ;ch清0
60
61 xor di,di ;累加器清0
62 xor dx,dx ;dX寄存器清0
63 mov bx,1 ;由于从个位数开始算起,因而将所乘权值设为1
64
65 lea si,buf+2 ;将si指向接收到的第1个字符位置
66 add si,cx ;因为从个位算起,所以将si指向最后1个接收到的个位数
67 dec si ;往回减1使其指向字串最后一个元素
68
69
70 ;cov是检测并生成第一个数字的步骤
71 cov:mov al,[si] ;取出个位数给al
72 cmp al,' '
73 jz next1 ;遇见空格则跳转
74
75 cmp al,'0' ;边界检查:如果输入不是0-9的数字,就报错
76 jb wrong
77 cmp al,'9'
78 ja wrong
79
80 sub al,30h ;将al中的ascii码转为数字
81 xor ah,ah
82 mul bx ;将当前位上的数值乘以当前位的权值
83
84
85 add di,ax ;将形成的数值叠加放在累加器di中
86
87
88 mov ax,bx ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
89 mov bx,10
90 mul bx
91 mov bx,ax
92
93 dec si ;si指针减1,指向前一数位
94 loop cov ;按CX中的字符个数计数循环
95
96
97 ;跳到次处表明第一个数字已经生成,接着去检测第二个数字
98 next1:
99 mov a,di
100 xor ax,ax
101 xor di,di ;累加器清0
102 xor bx,bx
103 mov bx,1 ;由于从个位数开始算起,因而将所乘权值设为1
104 dec si ;向前移动一格位置
105 dec cx ;遇到空格cx相应的减少1
106
107
108 ;cov2是检测并生成第2个数字
109 cov2:
110 mov al,[si] ;取出个位数给al
111 cmp al,' '
112 jz next2 ;遇见空格则跳转
113
114 cmp al,'0' ;边界检查:如果输入不是0-9的数字,就报错
115 jb wrong
116 cmp al,'9'
117 ja wrong
118
119
120 sub al,30h ;将al中的ascii码转为数字
121 xor ah,ah
122 mul bx ;将当前位上的数值乘以当前位的权值
123
124
125 add di,ax ;将形成的数值放在累加器di中
126
127
128 mov ax,bx ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
129 mov bx,10
130 mul bx
131 mov bx,ax
132
133 dec si ;si指针减1,指向前一数位
134 loop cov2 ;按CX中的字符个数计数循环
135
136
137 ;跳到次处表明第2个数字已经生成,接着去检测第3个数字
138 next2:
139 mov b,di
140 xor ax,ax
141 xor di,di ;累加器清0
142 xor bx,bx
143 mov bx,1 ;由于从个位数开始算起,因而将所乘权值设为1
144 dec si
145 dec cx
146
147 ;cov3是检测并生成第3个数字
148 cov3:mov al,[si] ;取出个位数给al
149
150 sub al,30h ;将al中的ascii码转为数字
151 xor ah,ah
152 mul bx ;将当前位上的数值乘以当前位的权值
153
154
155 add di,ax ;将形成的数值放在累加器di中
156
157
158 mov ax,bx ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
159 mov bx,10
160 mul bx
161 mov bx,ax
162
163 dec si ;si指针减1,指向前一数位
164 loop cov3 ;按CX中的字符个数计数循环
165
166 next3:
167 mov cc,di
168
169
170 ;三个数a b cc已经生成后,接下来开始进行定义的比较,如a+b 和cc去比较
171 mov bx,a
172 mov cx,b
173 add bx,cx
174 cmp bx,cc
175 jbe error ;若不满足两边之和大于第三边则跳error
176
177 mov bx,b
178 mov cx,cc
179 add bx,cx
180 cmp bx,a
181 jbe error
182
183 mov bx,a
184 mov cx,cc
185 add bx,cx
186 cmp bx,b
187 jbe error
188 ;上述比较全部通过时代表能构成一个三角形
189
190 mov bx,a; ;下面是溢出判断操作
191 add bx,b;
192 jo yichu
193 add bx,cc;
194 jo yichu
195
196
197 ;输出结果提示语
198 lea dx,output1 ;给出输入提示
199 mov ah,9
200 int 21h
201 enterline ;回车换行
202
203 ;求三角形周长
204 xor ax,ax
205 mov ax,a
206 add ax,b
207 add ax,cc
208
209 ;三角形周长储存在ax中,接下来转为字串并输出
210 xor dx,dx ;先清0
211 xor bx,bx
212 xor cx,cx
213
214 mov bx,10000 ;初始数位权值为10000
215
216 cov1:
217 xor dx,dx ;将dx:ax中的数值除以权值
218 div bx
219 mov cx,dx ;余数备份到CX寄存器中
220
221 cmp flag,0 ;检测是否曾遇到非0商值
222 jne nor1 ;如遇到过,则不管商是否为0都输出显示
223 cmp ax,0 ;如未遇到过,则检测商是否为0
224 je cont ;为0则不输出显示
225
226 nor1:
227 mov dl,al ;将商转换为ascii码输出显示
228 add dl,30h
229 mov ah,2
230 int 21h
231
232 mov flag,1 ;曾遇到非0商,则将标志置1
233
234 cont:
235 cmp bx,10 ;检测权值是否已经修改到十位了
236 je outer ;如果相等,则完成最后的个位数输出显示
237
238 xor dx,dx ;将bx数位权值除以10
239 mov ax,bx
240 mov bx,10
241 div bx
242 mov bx,ax
243
244 mov ax,cx ;将备份的余数送入AX
245 jmp cov1 ;继续循环
246
247
248 outer:
249 mov dl,cl ;最后的个位数变为ascii码输出显示
250 add dl,30h
251 mov ah,2
252 int 21h
253 enterline
254 jmp stop
255
256 error: ;输出"ERROR"
257 lea dx,output
258 mov ah,9
259 int 21h
260 wrong: ;给出相应的边界错误提示
261 lea dx,err
262 mov ah,9
263 int 21h
264 enterline
265
266 jmp begin ;如出错则返回起始点重新输入
267
268 yichu: ;溢出的提示
269 lea dx,out1
270 mov ah,9
271 int 21h
272 enterline
273
274 jmp begin ;返回起始点重新输入
275 stop:
276 MOV AH,4CH
277 INT 21H
278 CODES ENDS
279 END START