汇编语言实现输出键盘输入的十进制数字从小到大的排序结果功能

一 代码实现

DATAS SEGMENT ;数据段
    SHUZI DB 4,?,4 DUP(?)
    STRING0 DB 0DH,0AH,'$'
    STRING1 DB 'Input ten decimal numbers:',0DH,0AH,'$'
    NUMBERS  DB 10 DUP(?)   ;
    STRING2 DB 'The hexadecimal numbers are:',0DH,0AH,'$' 
DATAS ENDS

STACKS SEGMENT
STACKS ENDS

CODES  SEGMENT ;代码段
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS   ;定义DS:DX
    MOV DS,AX      ;DS指向缓冲区首地址基地址
    LEA DX,STRING1 ;把STRING1的地址传给DX
	MOV AH,9       ;DOS9号功能调用,显示输入提示语
	INT 21H	
    MOV CX,10      ;10赋给CX,循环次数
    MOV SI,0       ;0赋给SI
L1: CALL  INPUT    ;调用子程序INPUT
    LOOP L1        ;循环L1,直到输入所有数据
    CALL  SORT     ;调用子程序SORT
    LEA DX,STRING2 ;把STRING2的地址传给DX
	MOV AH,9       ;DOS9号功能调用,显示结果提示语
	INT 21H
	MOV CX,10      ;10赋给CX,循环次数
	MOV SI,0       ;0赋给SI
L2:	CALL  OUTPUT   ;调用子程序INPUT
	LOOP L2	       ;循环L1,直到输出所有数据

    MOV  AH,  4CH  ;返回DOS
INT  21H

;输入子程序*************
    INPUT PROC
    LEA DX,SHUZI       ;把SHUZI的地址传给DX
	MOV AH,10          ;DOS10号功能调用,键盘输入到缓冲区
	INT 21H
	LEA DX,STRING0     ;把STRING0的地址传给DX
	MOV AH,9           ;DOS9号功能调用
	INT 21H
	MOV AL,SHUZI[2]    ;把地址SHUZI[2]即键入第一个字符的ASCII码的地址传给AL
	SUB AL,30H         ;将键入字符的ASCII码加30h,转换到显示该字符对应的ASCII码
	MOV BL,10          ;乘数
	MUL BL             ;将AL*10结果传给AL
	MOV BL,AL          ;将结果传给BL
	MOV AL,SHUZI[3]    ;把地址SHUZI[3]即键入第二个字符的ASCII码的地址传给AL
	SUB AL,30H         ;将键入字符的ASCII码加30h,转换到显示该字符对应的ASCII码
	ADD BL,AL          ;BL+AL结果传给BL,即十位数*10与个位相加,完成键入数转十进制数
	MOV NUMBERS[SI],BL ;把该十进制数传给NUMBERS[SI]
	INC SI             ;SI自增1,完成一个十进制数的输入与存储后进行下一个
	RET 
	INPUT ENDP

;排序子程序*************	
	SORT PROC          
	MOV CX,10         ;10赋给CX,循环次数
P1:	MOV SI,0          ;0赋给SI
    DEC SI            ;SI自减1
P2: INC SI            ;SI自增1
    MOV AL,NUMBERS[SI] ;把第一个数据传给AL
    CMP AL,NUMBERS[SI+1] ;将AL与下一个数据比较
    JB P3                ;前一位小于后一位则跳转到P3
    MOV AL,NUMBERS[SI]   ;否则,把前一位数据传给AL
    XCHG AL,NUMBERS[SI+1] ;将AL与NUMBERS[SI+1]的内容交换
    XCHG NUMBERS[SI],AL   ;将NUMBERS[SI]与AL的内容交换,完成较大的数据往后排,完成一次冒泡排序
P3: CMP SI,8 ;SI与8比较,判断是否完成所有排序
    JNZ P2   ;不等于,未完成排序继续跳转到P2
    LOOP P1  ;循环P1
    RET      ;返回主程序
SORT ENDP

;输出子程序**************  
    OUTPUT PROC
    MOV AL,NUMBERS[SI] ;把第一个数据传给AL
    MOV AH,0           ;AH清0
    MOV BL,16          ;16赋给BL
    DIV BL             ;AL/BL,商存到AL,余数存到AH
    CMP AH,9           ;余数与9比较
    JA O1              ;大于则跳转到01
    ADD AH,48          ;小于则加48,转换到显示该数字字符对应的ASCII码
    JMP O2             ;跳转到02
O1: ADD AH,55          ;余数大于9是,加55转换到显示该数字字符对应的十六进制的ASCII码
O2: ADD AL,48          ;商的ASCII码加48,转换到显示该数字字符对应的ASCII码
    MOV BX,AX          ;把AX存有商和余数传给BX
    MOV DL,BL          ;把商传给给DL
	MOV AH,2           ;DOS2号功能调用,显示输出
    INT 21H
	MOV DL,BH          ;把余数传给DL
	MOV AH,2           ;DOS2号功能调用,显示输出
	INT 21H
	MOV DL,'H'         ;把H的ASCII码传给DL
	MOV AH,2           ;DOS2号功能调用,显示输出,十六进制数的标志
	INT 21H
	LEA DX,STRING0     ;把STRING0的地址传给DX
	MOV AH,9           ;DOS9号功能调用,回车换行
	INT 21H
	INC SI             ;SI自增1,继续显示下一位数
	RET
	OUTPUT ENDP	
	
CODES  ENDS
    END START

该程序的功能是:从键盘输入十个2位十进制数(正数)到内存中。每输入2位十进制数(正数)即回车。程序将按从小到大排序,把这些数以十六进制形式在屏幕上显示出来。

二 运行结果
输入01,02,04,03,06,05,08,09,07,10.运行结果如下
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值