汇编16进制排序
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