输入10个数字并且排序后输出(汇编)

DATA   SEGMENT             ;  数据段
ARRAY DW 10 DUP(?)
MESS DB 'PLEASE INTPUT YOUR NUMBER',0DH,0AH,'$';请输入数字
MESS2 DB ',','$';逗号
MESS3 DB 'EEROR',0DH,0AH,'$';错误提示
MESS4 DB 'H,','$';H跟逗号
MESS5 DB 0DH,0AH,'RESULT:',0DH,0AH,'$';结果提示
LEN        EQU 20;
LEN2        EQU 10;输入的数字个数
FLAG DB 1;标志输出是否结束
CHANGE  DB  0;标志位,用于结束冒泡循环
DATA   ENDS

STACK  SEGMENT STACK       ;   堆栈段
STA         DB    64 DUP(0)
STACK_TOP   DB    0
STACK  ENDS

CODE   SEGMENT             ;   代码段
       ASSUME CS:CODE , DS:DATA ,  ES:DATA , SS:STACK   

START:  
;   程序开头必须要有的五条指令
        MOV    AX, DATA
        MOV    DS, AX         ;   设置数据段
        MOV    AX, STACK
        MOV    SS, AX         ;   设置堆栈段
        LEA    SP, STACK_TOP  ;   设置栈顶指针
 
;---------------------------------------        
;   程序的中间部分
                MOV AH,09H
                LEA DX,MESS;输入提示
                INT 21H                 
                MOV SI,0
                LEA BX,ARRAY
INPUT1:                
                XOR DX,DX              
INPUT:
                MOV AH,01H
                INT 21H
                CMP AL,48H
                JE ENTER;等于H,说明结束一个四位数的输入                            
                CMP AL,30H;与0比较
                JB ERROR;小于0,错误                
                CMP AL,39H;与9比较
                JBE GET1;在0-9之间
                CMP AL,41H
                JB ERROR;错误
                CMP AL,46H
                JBE GET2;在A-F之间
                JMP ERROR;错误
GET1:;在0-9之间,减去30H
                SUB AL,30H
                JMP GET
GET2:;在A-F之间,减去37H
                SUB AL,37H                
                JMP GET
GET:;将DX左移4位用于存储新输入的位(本质跟10进制一样)
                MOV CL,4
                SHL DX,CL
                XOR AH,AH;消除高位的影响
                ADD DX,AX
                JMP INPUT;继续输入                            
ENTER:    
                MOV [BX+SI],DX;将四位数存入当前指针所指的位置    
                INC SI;自增2字节
                INC SI
                ;;输出逗号
                PUSH DX
                MOV AH,09H
                LEA DX,MESS2
                INT 21H
                POP DX
                ;;判断是否输入了10个数
                CMP SI,LEN
                JB INPUT1
                ;;清楚影响                                
                XOR DX,DX
                XOR SI,SI
                XOR AX,AX                
                JMP SORT
ERROR:;;错误提示    
                MOV AH,09H
                LEA DX,MESS3
                INT 21H                 
                JMP EXIT                
;排序                
SORT:   
                MOV   SI, OFFSET ARRAY                                 
        MOV   CX, LEN2-1                                 
        MOV   CHANGE, 0                                      
GOON:   
                MOV   AX,  [SI]    ;  
        INC     SI;
        INC     SI;                                  
        CMP   AX,  [SI]                                   
        JNA        NEXT      
        MOV        CHANGE, 1                            
        MOV        DX, [SI]
        MOV        [SI], AX
        MOV   [SI-2], DX        
NEXT:        
                LOOP  GOON
                CMP        CHANGE, 0            
             JNE   SORT
             ;输出RESULT提示   
             MOV AH,09H
                LEA DX,MESS5
                INT 21H
                XOR DX,DX
;;输出排序结果             
PRINTHEAD:                
                INC FLAG;该标记用于判断是否输出完毕
PRINT:  MOV SI,1;SI用于指示下一步执行STEP几         
                MOV DX,[BX]            
STEP1:    MOV CL,12
                PUSH DX                
                SHR DX,CL
                MOV SI,2
                JMP    DO
STEP2:    PUSH DX
                AND DX,0FFFH;消除高位
                MOV CL,8                
                SHR DX,CL
                MOV SI,3
                JMP DO
STEP3:    PUSH DX
                AND DX,00FFH;
                MOV CL,4
                SHR DX,CL
                MOV SI,4
                JMP DO
STEP4:    PUSH DX
                AND DX,000FH;    
                MOV SI,5                                
                JMP DO                        
DO:
                CMP DX,09H                
                JBE PUT1
                JMP PUT2
PUT1:        
                ADD DX,30H                
                JMP PRINT1
PUT2:        
                ADD DX,37H    
PRINT1:    
                MOV AH,02H
                INT 21H
                POP DX        
                CMP SI,2
                JE STEP2
                CMP SI,3
                JE STEP3        
                CMP SI,4
                JE STEP4    
                ;;打印H,字样
                MOV AH,09H
                LEA DX,MESS4
                INT 21H
                XOR DX,DX                                
                INC BX
                INC BX        
                ;;判断是否结束输出        
                CMP FLAG,LEN2
                JBE PRINTHEAD                                                         
EXIT:                                             
;-----------------------------------------                                                      
;   程序结束必须要有的两条指令
        MOV   AX,4C00H       ;                            
        INT   21H            ;                         
;------------------------------------------                                                      
CODE    ENDS                                          
        END  START           ; 最后一行要按回车键
        
                                           
                                           

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值