匯編語言判斷能否構成三角形


問題描述:

三角形判斷。輸入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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM