问题描述:
三角形判断。输入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