(1)排序 对输入的多个数字进行排序。
要求:
(a)所有数字从键盘输入;
(b)数字中至少包含一个大于 10 的数字;
(c)排好序的数字以十进制形式在屏幕显示
DATA SEGMENT
FLAG DB 0
COUNT DB 0
SAVE DW 20 DUP(0)
INPUTWARN DB 'INPUT YOUR NUMBERS,SEPARATE WITH /,END WITH ENTER','$'
OUTPUTWARN DB 'SORTED RESULTS','$'
ERRORWARN DB 'INPUT ERROR!','$'
DATA ENDS
STACK SEGMENT
DW 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SI,SAVE
LEA DX,INPUTWARN
MOV AH,9H
INT 21H
L0:;对输入字符进行检查
MOV AH,1H
INT 21H
CMP AL,2FH
JZ L1;输入为'/',将上一组输入字符存为数字
CMP AL,0DH
JZ L2;输入回车,输入过程结束
CMP AL,30H
JB L3;不是数字字符提示输入错误
CMP AL,39H
JA L3
JMP L4;输入为数字字符
L1:
MOV FLAG,0
MOV [SI],BX
INC SI
INC SI
INC COUNT
JMP L0
L2:
MOV [SI],BX;保存最后一个数字
INC COUNT
MOV DL,0AH;以下三行未知
MOV AH,02H
INT 21H
JMP L6
L3:
LEA DX,ERRORWARN
MOV AH, 9H
INT 21H
JMP OVER
L4:
CMP FLAG,1
JZ L5;是两位数
SUB AL,30H
MOV BL,AL
MOV BH,0
ADD FLAG,1;FLAG为1说明已经输入一个数字
JMP L0
L5:
MOV FLAG,0
SUB AL,30H
MOV BH,BL
MOV BL,AL;以BCD码形式存储在BX中
JMP L0
L6:;接下来对SAVE中的BCD码数进行冒泡排序,见课本96页
MOV AL,COUNT
DEC AL
MOV AH,0
MOV CX,AX;循环次数
ADD AX,AX
LEA SI,SAVE
ADD SI, AX
L7:
PUSH CX
PUSH SI
L8:
MOV AX,[SI]
CMP AX,[SI-2]
JAE L9
XCHG AX,[SI-2]
MOV [SI],AX
L9:
DEC SI
DEC SI
LOOP L8
POP SI
POP CX
LOOP L7
LEA DX,OUTPUTWARN
MOV AH,9H
INT 21H
MOV AL,COUNT
MOV BL,AL;BL控制最后一个数字后无/符号
MOV AH,0
MOV CX,AX
LEA SI,SAVE
L10:;将BCD码转换为ASCII码输出
MOV DL,[SI+1];十位
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,[SI];个位
ADD DL,30H
MOV AH,02H
INT 21H
CMP BL,1;间隔/符号
JZ OVER
MOV DL,2FH
MOV AH,02H
INT 21H
INC SI
INC SI
DEC BL
LOOP L10
OVER:
CODE ENDS
END START
结果: