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

    技术2023-04-07  93

    目录

     

    一、题目要求

    二、算法设计

    三、程序测试

    四、源代码


    一、题目要求

            在 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

     

    Processed: 0.012, SQL: 9