目录
一、题目要求
二、算法设计
三、程序测试
四、源代码
在 buf 缓冲区中存放有 50 个字节数据(无符号数),编写程序将这些数据由小到大排序,排序后的数据仍放在该区域中。原始数据在源程序中由定义给出。输出如下:
1、在屏幕上先显示排序前的数据(十六进制),数据以每行 10 个的格式显示在屏幕上,数据与数据间用空格分开;
2、在屏幕上显示排序后的数据(十六进制),数据以每行 10 个的格式显示在屏幕上,数据与数据间用空格分开;
3、当存储的字节数据个数变化,则不需要更改源代码。
根据题目要求,将程序分为排序部分与输出部分。排序部分使用冒泡排序的方式,输出部分将存储在buf中的数据以十六进制的形式输出在屏幕上显示。可以通过子程序调用的形式来实现。
所使用的环境为DOSBox
1、程序中存储的字节数据:
2、编译与链接:
3、运行结果
DATAS SEGMENT
BUF DB 0AH,0BH,0CH,0DH,0EH,0ABH,0BCH,0CDH,0DEH,0AAH
DB 01H,23H,34H,45H,98H,87H,76H,65H,54H,43H
DB 03H,14H,25H,36H,96H,85H,74H,63H,52H,41H
DB 0A1H,0B2H,0E6H,0D4H,0C3H,1AH,2BH,6EH,4DH,3CH
DB 14H,25H,62H,63H,73H,37H,47H,37H,74H,42H
DB 6AH,5BH,4CH,3DH,2EH,1FH,0A5H,0B3H,0E1H,0C4H
DB 43H,66H,74H,0AEH,0CAH
COUNT_BUF DW $-BUF
COUNT_TMP1 DW 0
COUNT_TMP2 DW 0
COUNT_TO10 DB 0
BEFORE DB 'BEFORE:$'
AFTER DB 'AFTER:$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS
START:
MOV AX, DATAS
MOV DS, AX
MOV CX, COUNT_BUF
;输出字符串Before:
LEA DX, BEFORE
MOV AH, 9
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
;输出排序前的数据
MOV AX, DATAS
MOV DS, AX
MOV CX, COUNT_BUF
MOV COUNT_TMP1, CX
CALL SHOW_HEX
;输出字符串After:
LEA DX, AFTER
MOV AH, 9
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
;排序
MOV AX, DATAS
MOV DS, AX
MOV CX, COUNT_BUF
CALL TOSORT
MOV DL, 0DH
MOV AH, 2
INT 21H
;显示排序后的数据
MOV AX, DATAS
MOV DS, AX
MOV CX, COUNT_BUF
MOV COUNT_TMP1, CX
CALL SHOW_HEX
MOV AH, 4CH
INT 21H
;排序
TOSORT PROC NEAR
LOOP1:
MOV DI, CX
MOV AL, BUF[DI - 1]
MOV SI, DI
LOOP2:
CMP AL, BUF[SI - 2]
JAE NEXT1
XCHG BUF[SI - 2], AL
MOV BUF[DI - 1], AL
NEXT1:
DEC SI
CMP SI, 2
JB NEXT2
JMP LOOP2
NEXT2:
DEC DI
CMP DI, 2
JB FINISHSORT
DEC CX
JMP LOOP1
FINISHSORT:
MOV DL, 0DH
MOV AH, 2
INT 21H
RET
TOSORT ENDP
;按照格式显示十六进制数据
SHOW_HEX PROC NEAR
SHOW:
MOV COUNT_TMP1, CX
MOV BX, COUNT_TMP2
MOV DL, BUF[BX]
INC BX
MOV COUNT_TMP2, BX
CALL CHANGE_HEX
MOV CX, COUNT_TMP1
CMP CX, 1
JE FINISH
MOV DL, ' '
MOV AH, 2
MOV AL, COUNT_TO10
CMP AL, 9
JE OUTPUT_N
INC COUNT_TO10
INT 21H
LOOP SHOW
;每10个字符换行
OUTPUT_N:
MOV AL, 0
MOV COUNT_TO10, AL
SUB CX, 1
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
JMP SHOW
FINISH:
MOV COUNT_TMP1, 0
MOV COUNT_TMP2, 0
MOV COUNT_TO10, 0
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
RET
SHOW_HEX ENDP
;转换为16进制形式输出
CHANGE_HEX PROC NEAR
MOV BL, DL
MOV CL, 4
SHR DL, CL
OR DL, 30H
CMP DL, 39H
JBE AD1
ADD DL, 7
AD1:
MOV AH, 2
INT 21H
MOV DL, BL
AND DL, 0FH
OR DL, 30H
CMP DL, 39H
JBE AD2
ADD DL, 7
AD2:
MOV AH, 2
INT 21H
MOV DL, 'H'
MOV AH, 2
INT 21H
RET
CHANGE_HEX ENDP
CODES ENDS
END START