問題描述:
三角形判斷。輸入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