【微机原理与接口技术】汇编 字节数据排序

目录

 

一、题目要求

二、算法设计

三、程序测试

四、源代码


一、题目要求

        在 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

 

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