动态从键盘输入20个二位无符号数,从小到大排序并显示。
DATAS SEGMENT
;此处输入数据段代码
sentence1 DB 'INPUT 20 NUM :',0AH,0DH,'$'
BUF DB 30,?,30 DUP('$')
sentence2 DB 0DH,0AH,'SHUCHU :',0DH,0AH,'$'
TEN DB 10
COUNT DW 0
MIN DB 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;输出提示 :输入3个数
MOV AH,9
LEA DX,sentence1
INT 21H
MOV SI,0
MOV CX,20
;输入
AGAIN:
MOV AH,1
INT 21H
;CMP AL,0DH
;JZ EXIT;回车结束
SUB AL,30H
MUL TEN
MOV BL,AL
MOV AH,1
INT 21H
SUB AL,30H
ADD BL,AL
MOV BUF[SI],BL
INC SI
INC COUNT
;输出空格
MOV AH,2
MOV DL,20H
INT 21H
loop AGAIN
;外循环
EXIT:
DEC COUNT;;;;;;第一次循环应该是N-1次
MOV CX,COUNT;
MOV SI,-1
;LP2:
INC SI
MOV CX,COUNT
;内循环
LP1:
MOV AL,BUF[SI]
MOV BL,BUF[SI+1]
CMP AL,BL
JG CHANGE
INC SI
LOOP LP1
;DEC COUNT
CMP COUNT,1
JZ OVER
JMP EXIT;;;;JMP LP2
CHANGE:
XCHG AL,BL
MOV BUF[SI],AL
MOV BUF[SI+1],BL
INC SI
LOOP LP1
;DEC COUNT
CMP COUNT,1
JZ OVER
JMP EXIT;;;;JMP LP2
OVER:
MOV AH,9
LEA DX,sentence2
INT 21H
MOV SI,0
MOV CX,20
SHUCHU:
MOV AH,0
MOV AL,BUF[SI]
DIV TEN
MOV BX,AX
ADD BX,3030H
MOV AH,2
MOV DL,BL
INT 21H
MOV DL,BH
INT 21H
MOV DL,20H
INT 21H
INC SI
LOOP SHUCHU
MOV AH,4CH
INT 21H
CODES ENDS
END START
-------------------------注意---------------------------------
1.内循环:比如三个数 count=3
99 88 77
冒泡排序,第一次交换2次,所以 DEC COUNT,即count=2
88 77 99
每完成一次内循环,count减1
2.外循环:当count变成1时,冒泡排序结束,所以结束循环
3.输出:输出时还要记得用除法,分别输出商和余数
PS:这次的代码还不完美,比如
1.在输入时没有判断,当输入值非0-9时,应该重新输入
2.任意位输入
3.回车键/ESC键结束
以后有时间再完善代码吧,最近快期末考试了,要复习、做课设、答辩了