现在的位置: 首页 > 综合 > 正文

求最大数(汇编)

2013年09月18日 ⁄ 综合 ⁄ 共 4185字 ⁄ 字号 评论关闭

 老师要求是:输出学号和姓名,

                   输入数并以空格间隔

                   能判断错误的输入

                   能够循环判断

 

编程思路:

 

先输出学号和姓名

输出"Input datas(0 - 9999):"

然后输入数字,以空格间隔

错误判断

比较数的大小

转换为十进制

按回车,输出最大数

再循环输入数字

 

* 比较(compare)过程:

定义一个空间buffer,初值为0
输入数字,转换为十进制,数字存储在bx中
当按下空格后,进行比较(compare)
先把buffer中的值存储到dx中,再比较bx和dx谁大,谁大就把谁存进buffer中
循环再输入数字,在进行比较
最后回车限于跳转问题,另外用store存储,

 

* 差错处理:
当输入小于0,或大于9的字符时,跳到wrong,输出"Wrong number, please input again!"
在跳到开始,初始化数据,重新输入

 

DATAS SEGMENT
      STRING  DB  13,10,'0913070209,    Li Pengfei',13,10,'$'
     
      WORD0 DB '****************************************************',0AH,0DH,'$'
      
      WORD1   DB  'Input datas(0 - 9999):',0AH,0DH,'$'
    
      WORD2   DB  'Wrong number, please input again!',0AH,0DH,'$'
    
      OUTPUT  DB  'The max data is:',0AH,0DH,'$'
    
      SPACE   DB  0AH,0DH,'$'  ;回车
    
      buffer DW 10 DUP(0)  ;存输入字符

DATAS ENDS

 

STACKS SEGMENT
        DB        20H DUP(?)
STACKS ENDS

 

 

CODES SEGMENT
 
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
      
START:

      MOV  AX,DATAS
      MOV  DS,AX
               
      LEA     DX,STRING        ;输出学号,姓名
      MOV  AH,9
      INT  21H
     
      MOV     DX,OFFSET WORD0   
      MOV     AH,09H         
      INT     21H
               
again:   

      MOV  bx,0    ;全部清零
      MOV  dx,0
      MOV  buffer,0
  
      MOV     DX,OFFSET SPACE    ;换行
      MOV     AH,09H         
      INT     21H
    
      MOV  DX,OFFSET WORD1    ; "input the datas:"
      MOV     AH,09H     
      INT     21H
     
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
   
      CALL input                            ;开始输入数字
   
   
                  
over:   
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
     
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H

 

      MOV     dx,OFFSET OUTPUT    ;显示字符串
      MOV     AH,09H        
      INT     21H

 

      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
   
      CALL toTen       ;开始转换成十进制
     
     
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H     
    
      
      JMP  again
           
      MOV AH,4CH     ;返回DOS
      INT 21H
     
     
     
;*************************子程序input***************************

input  proc near 

      MOV  bx,0 
 
  newchar:
  
      MOV  AH,01H    ;输入
      INT  21H 
                 
      CMP  AL,20H    ;输入空格跳到compare    
      JE    compare
          
      CMP  AL,0DH    ;输入回车,跳到over,输出结果
      JE  store
     
      SUB  AL,30H           
      JL  wrong    ;如果小于0
      CMP  al,9d    ;如果大于9
      JG  wrong
         
      cbw     
      XCHG ax,bx     
      MOV  cx,10d  
      MUL  cx   
      XCHG ax,bx      
      ADD  bx,ax
   
      JMP  newchar

 

 compare:

      MOV  dx,buffer   ;先取出buffer中的数据
           
      CMP  dx,bx    ;比较大小
      JGE  max     ;DX大,就跳到max
   
      MOV     buffer,bx     ;如果BX大,放在buffer中
      MOV  bx,0
      JMP  newchar
  
 max:
      MOV     buffer,dx     ;存较大的数据DX
      MOV  bx,0
      JMP  newchar  

 store:
      MOV  dx,buffer   ;先取出buffer中的数据
      MOV  buffer,bx   ;把bx中的数据赋给buffer
   
      CMP  dx,bx    ;比较大小
      JGE  max2    ;DX大,就跳到max
   
      MOV     buffer,bx     ;如果BX大,放在buffer中
      JMP  over    

 max2:   
      MOV     buffer,dx     ;存较大的数据DX
      JMP  over 
    
 wrong:   
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
   
      MOV  DX,OFFSET WORD2     ;"Wrong number, please input again!"
      MOV     AH,09H     
      INT     21H
     
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
     
      MOV     dx,OFFSET SPACE     ;换行
      MOV     AH,09H        
      INT     21H
     
      JMP  again
               
 exit:   
   
   ret 
     
input  endp
;********************************************************************

         
;***************************子程序toTen*****************************
toTen  proc  near    ;转换成十进制

      mov  bx,buffer
      mov  cx,1000d
      call  trans
     
      mov  cx,100d
      call  trans
     
      mov  cx,10d
      call  trans
     
      mov  cx,1d
      call  trans
     
      ret
     
toTen       endp
;********************************************************************

 

;******************************子程序trans**************************
trans   proc near
 
      mov   ax,bx
      mov   dx,0
      div   cx
      mov   bx,dx
      mov   dl,al
      add   dl,30h
  
      mov   ah,02h
      int   21h
  
      ret
trans endp
;********************************************************************     
   
 
   
CODES ENDS
    END START

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.