汇编语言判断能否构成三角形

问题描述:

三角形判断。输入a,b,c 三边后,判断是否能构成三角形,如能构成三角形,输出三角形的周长,否则输出“ERROR”。要求:提示输入三角形三边长度a b c;键盘输入,中间空格隔开;Enter 键结束输入,并换行显示判断结果。

 附加功能有:
1.判断输入是否符合规范(如字母不能出现,数与数之间只有一个空格隔开)若溢出则重新输入
2.判断最后的结果是否有溢出,若溢出则重新输入

C/C++20行之内能解决的代码,汇编硬是写了我两百多行,说多了都是泪,直接上代码(有大量注释):

  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
原文地址:https://www.cnblogs.com/xwh-blogs/p/12544565.html