【微機原理與接口技術】彙編 字節數據排序

目錄

 

一、題目要求

二、算法設計

三、程序測試

四、源代碼


一、題目要求

        在 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章