目錄
一、題目要求
在 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