📄 输入一组十进制数,按从小到大到顺序输出。.txt
字号:
输入一组十进制数,按从小到大到顺序输出。
输入:126,78,456,3,890 (注意“,”这个逗号)
输出:3,78,126,456,890
STACK SEGMENT STACK
DB 128 DUP(0)
STACK ENDS
DATA SEGMENT
ARR DW 50 DUP(?) ;存放输入的数
STR DW 50 DUP(?) ;输出字符串
COUNT DW ? ;输入数的个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA SI,ARR
MOV DI,0 ;DI用来标志是否输入了回车
L1: CALL DCB ;将输入的十进制数化为二进制存在BX
INC COUNT
MOV [SI],BX
CMP DI,0 ;有回车是,输入结束
JNZ L2
ADD SI,2
JMP L1
L2: CALL BBB ;回车换行
SUB COUNT,1 ;将输入个数减1
CALL SORTP ;采用冒泡排序法
ADD COUNT,1 ;输入个数加1,即为原输入个数
MOV CX,COUNT
LEA DI,ARR
LEA SI,STR
L3: MOV AX,[DI]
CALL BCD ;将AX中的进制数化为十进制依次存在[SI]
ADD DI,2
LOOP L3
DEC SI ;去掉最后一个","号
MOV [SI], BYTE PTR 0DH
MOV [SI+1], BYTE PTR 0AH
MOV [SI+2], BYTE PTR '$'
LEA DX,STR
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
BBB PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
BBB ENDP
DCB PROC
PUSH AX
PUSH CX
MOV BX,0
NEW: MOV AH,1
INT 21H
CMP AL,',' ;如果是分号,则输入一个十进制数结束
JZ NDIG
CMP AL,0DH ;如果是回车,则置DI为1输入结束
JNZ NHC
MOV DI,1
NDIG: POP CX
POP AX
RET
NHC: CMP AL,30H
JL NDIG
CMP AL,39H
JG NDIG
AND AL,0FH
CBW
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
JMP NEW
DCB ENDP
BCD PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,10
MOV CX,0
R1: MOV DX,0
DIV BX
PUSH DX
INC CX
OR AX,AX
JNZ R1
R2: POP AX
CMP AL,10
JB R3
ADD AL,7H
R3: ADD AL,30H
MOV [SI],AL
INC SI
LOOP R2
MOV [SI],BYTE PTR ',' ;每个数后放一个','号
INC SI
POP DX
POP CX
POP BX
POP AX
RET
BCD ENDP
SORTP PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DI
PUSH SI
MOV DI,OFFSET ARR
MOV BX,-1 ;设标志-1
LOOPOUT:CMP BX,-1
JNE SORTEND ;标志不为-1,则排序完成
XOR BX,BX ;0->BX
MOV CX,COUNT
MOV SI,DI
LOOPIN: MOV AX,[SI]
CMP AX,[SI+2] ;两两比较
JLE NOCHANGE ;如果<=则不交换
XCHG [SI+2],AX ;否则交换
MOV [SI],AX
MOV BX,-1 ;置BX为-1,标示有交换
NOCHANGE:ADD SI,2
LOOP LOOPIN ;判断本次排序是否完成
JMP LOOPOUT
SORTEND:POP SI
POP DI
POP CX
POP BX
POP AX
RET
SORTP ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -