一 代码实现
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.运行结果如下