1 DATA SEGMENT
2 BUF DB 0,0,0,0,0,0,0,0,0
3 BUFSIZE = $-BUF-1
4 FLAG DB 0 ;是否完成排序的标志
5 F_INSERT DB 0
6 CR DB 0AH,0DH,'$'
7 DATA ENDS
8 STACK SEGMENT
9 AA DB 100 DUP(0)
10 STACK ENDS
11 CODE SEGMENT
12 ASSUME CS:CODE,DS:DATA,SS:STACK
13 START:
14 MOV AX,DATA
15 MOV DS,AX
16 LEA SI,BUF
17 MOV CX,BUFSIZE
18 INPUT: ;键盘输入两位十六进制数,输错了没有报错功能,只能按给定规则输入
19 MOV AH,01H ;第一位数输入
20 INT 21H
21 CMP AL,'9' ;如果是A-F
22 JA HEHE
23 JMP HEHE1
24 HEHE: ;由ascii码得到本来的值
25 SUB AL,'A'
26 ADD AL,0AH
27 JMP HEHE_END0
28 HEHE1:
29 SUB AL,'0'
30 HEHE_END0: ;乘以16,充当第一位数(即“十”位)
31 MOV BL,10H
32 MUL BL
33 MOV [SI],AL
34
35 MOV AH,01H ;第二位数输入
36 INT 21H
37 CMP AL,'9'
38 JA HEHE2
39 JMP HEHE3
40 HEHE2:
41 SUB AL,'A'
42 ADD AL,0AH
43 JMP HEHE_END1
44 HEHE3:
45 SUB AL,'0'
46 HEHE_END1:
47 ADD [SI],AL ;充当个位
48 MOV AH,01H
49 INT 21H
50 INT 21H
51 INC SI
52 LOOP INPUT
53 SORT:
54 LEA DX,CR
55 MOV AH,09H
56 INT 21H
57
58 LEA BX,BUF
59 MOV DX,BUFSIZE
60 SUB DX,1 ;把内循环的循环次数存在DX,每次内循环初始时赋给CX,循环N-1次
61 CMP F_INSERT,1
62 JNZ INLOP
63 INC DX
64 INLOP: ;一次遍历
65 MOV SI,BX
66 MOV CX,DX
67 MOV FLAG,0
68 CM:
69 MOV AL,[SI] ;前面元素
70 INC SI
71 CMP AL,[SI] ;后面元素
72 JNA OUTLOP ;前小于后,不交换
73 ;IF([SI-1]>[SI]),SWAP--交换
74 MOV FLAG,1 ;表示未完成排序,FLAG置1
75 MOV AH,[SI] ;AH为中间变量
76 MOV [SI-1],AH
77 MOV [SI],AL
78 OUTLOP: ;外循环
79 LOOP CM
80 DEC DX
81 JZ ORIGIN
82 CMP FLAG,0 ;FLAG为0,表示完成排序,直接退出循环
83 JNZ INLOP ;否则,跳入下一层内循环进行比较
84 ORIGIN:
85 LEA SI,BUF
86 MOV CX,BUFSIZE ;初始化CX,SI,为打印做准备
87 CMP F_INSERT,1
88 JNZ PRINT
89 INC CX
90 PRINT:
91 MOV DL,[SI]
92 MOV AH,00H
93 MOV AL,DL
94 MOV BH,10H
95 DIV BH ;DL除以10H,得到高位上的数字
96 MOV DL,AL ;商,即十位上的数
97 MOV BL,AH ;余数,即个位上的数
98 BIT2:
99 CMP DL,9 ;是否是A-F
100 JA AF1
101 JMP ZN1
102 ;处理十位上的数
103 AF1: ;A-F
104 SUB DL,0AH
105 ADD DL,'A'
106 MOV AH,02H
107 INT 21H
108 JMP P1
109 ZN1: ;0-9
110 ADD DL,'0'
111 MOV AH,02H
112 INT 21H
113 P1:
114 MOV DL,BL
115 CMP DL,9
116 JA AF2
117 JMP ZN2
118 ;处理个位上的数
119 AF2:
120 SUB DL,0AH
121 ADD DL,'A'
122 MOV AH,02H
123 INT 21H
124 JMP P2
125 ZN2:
126 ADD DL,'0'
127 MOV AH,02H
128 INT 21H
129 ;打印H和空格
130 P2:
131 MOV DL,'H'
132 INT 21H
133 MOV DL,' '
134 INT 21H
135 INC SI
136 LOOP PRINT
137 CMP F_INSERT,1
138 JZ JMP EXIT
139 ;打印完,插入一个数,再排序并打印
140 INSERT:
141 CMP F_INSERT,1
142 JZ EXIT
143 MOV F_INSERT,1
144 LEA DX,CR
145 MOV AH,09H
146 INT 21H
147
148 LEA SI,BUF
149 MOV AH,01H ;第一位数输入
150 INT 21H
151 CMP AL,'9' ;如果是A-F
152 JA HEHE4
153 JMP HEHE5
154 HEHE4: ;由ascii码得到本来的值
155 SUB AL,'A'
156 ADD AL,0AH
157 JMP HEHE_END2
158 HEHE5:
159 SUB AL,'0'
160 HEHE_END2: ;乘以16,充当第一位数(即“十”位)
161 MOV BL,10H
162 MUL BL
163 MOV [SI+BUFSIZE],AL
164
165 MOV AH,01H ;第二位数输入
166 INT 21H
167 CMP AL,'9'
168 JA HEHE6
169 JMP HEHE7
170 HEHE6:
171 SUB AL,'A'
172 ADD AL,0AH
173 JMP HEHE_END3
174 HEHE7:
175 SUB AL,'0'
176 HEHE_END3:
177 ADD [SI+BUFSIZE],AL ;充当个位
178 MOV AH,01H
179 INT 21H
180 BUFSIZE = BUFSIZE-5
181 JMP SORT
182 EXIT:
183 MOV AH,4CH
184 INT 21H
185 CODE ENDS
186 END START