zoukankan      html  css  js  c++  java
  • 汇编语言判断能否构成三角形

    问题描述:

    三角形判断。输入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
  • 相关阅读:
    64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.
    64位内核开发第十讲,IRQL中断级别了解
    64位内核开发第九讲,注册表编程.
    64位内核开发第8讲,文件操作.以及删除文件.
    64位内核第七讲.内核中字符串编程注意事项
    【Unity】7.5 移动设备输入
    【Unity】7.4 游戏外设输入
    【Unity】7.3 键盘输入
    【Unity】7.2 鼠标输入
    【Unity】7.1 Input类的方法和变量
  • 原文地址:https://www.cnblogs.com/xwh-blogs/p/12544565.html
Copyright © 2011-2022 走看看