微机原理与接口技术--上机实验二--字节数据排序

实验要求
在 buf 缓冲区中存放有 50 个字节数据(无符号数),编写程序将这些数据由小到大排序,排序后的数据仍放在该区域中。
具体要求
1.具体功能
(1)原始数据在源程序中由定义给出;
(2)在屏幕上先显示排序前的数据(十六进制),数据以每行 10 个的格式显示在屏幕上,数据与数据间用空格分开;
(3)完成排序;
(4)在屏幕上显示排序后的数据(十六进制),数据以每行 10 个的格式显示在屏幕上,数据与数据间用空格分开。
2. 要求:
(1)如果数据个数变为 60 或 78 等的取值时,程序代码部分无需修改;
(2)编写完整程序,并能上机运行;
(3)完成实验报告(格式不限),写出算法思想、调试过程及心得体会,2-3 页以内。
代码实现

data segment           
    hint1 db  "data before sorting: ",'$'      ;屏幕显示提示:排序前的数据
    hint2 db  "sorted data: ",'$'              ;屏幕显示提示:排序后的数据 
    buf db "21 32 15 56 67 78 24 35 2A 89 " 
        db "1D 3A 45 77 AA 91 83 7E 1E 55 "
        db "56 43 2D 5E 69 6A 3C 2B 93 84 "
        db "19 1F D2 4B 66 AC 82 6F 55 3F "
        db "AA 39 50 3E E2 22 79 5F F3 DD "
        db "92 9F 83 8A 6C 17 05 0B 88 19 " 
        db "99 77 8E 18 03 02 29 C2 2C 52 "  
        db "49 E3 FF 8F 3E 5F 69 23 01 1F "
        db "77 BB ",'$';设置缓冲区数据
    length dw 0              ;存放缓冲区的字符个数 
    number dw 0              ;存放缓冲区有定义的字节数据个数
data ends
code segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
;----------------主程序-----------------       
    call count               ;调用缓冲区计数子程序
    lea dx, hint1            ;打印"data before sorting: "的提示     
    mov ah, 09h							 
    int 21h  
    call crlf                ;调用回车换行子程序
    call print               ;调用缓冲区数据输出子程序(排序前) 
    call crlf                ;调用回车换行子程序
    lea dx, hint2            ;打印"sorted data: "的提示     
    mov ah, 09h							 
    int 21h  
    call crlf                ;调用回车换行子程序  
    call sorting             ;调用缓冲区数据排序子程序   
    call print               ;调用缓冲区数据输出子程序(排序后)
    mov ah,4ch
    int 21h        
;-------------缓冲区计数子程序--------------
count proc     
    lea si,buf               ;传送缓冲区首地址
    mov ax,0                 ;设置计数器初值 
cpr:cmp byte ptr[si],'$'     ;判断是否字符串结束标志 
    jz  end                  ;字符串结束,跳到end
    inc si                   
    inc ax                   ;还未结束,字符计数加一
    jmp cpr                  ;循环判断计数
end:mov length,ax            ;length存放缓冲区的字符个数  
    mov cx,3
    div cx                   ;(ax)/3,即字符串长度除以3,得到字节数据的个数
    mov number,ax            ;number存放缓冲区有定义的字节数据个数    
    ret
count endp
;--------------回车换行子程序---------------     
crlf proc
    mov dl,0dh               ;显示回车符
    mov ah,2
    int 21h
    mov dl,0ah               ;显示换行符
    mov ah,2
    int 21h      
    ret
crlf endp
;------------缓冲区数据输出子程序------------
print proc  
    xor ax,ax                ;ax清零
    xor bx,bx                ;bx清零
    lea si,buf               ;传送缓冲区首地址
    mov cx,length            ;传送缓冲区字符个数    
output:mov dl,[si]           ;传送si指向的数据至dl以输出在屏幕上
    mov ah,02h
    int 21h 
    inc si                   
    inc bl                   ;si、bl递加
    cmp bl,30                ;比较bl与30
    jnz next                 ;不相等则继续输出下一个字符
    call crlf                ;相等即达到30个字节/10个数据,需要换行           
    xor bl,bl                ;开始新一行数据输出,bl清零
next:loop output
    ret
print endp    
;------------缓冲区数据排序子程序----------- 
sorting proc   
    xor ax,ax                   ;ax清零
    mov cx, number              ;传送缓冲区数据个数
    dec cx                      ;数据个数减一,为外循环总次数
wai:mov dx, cx                  ;存入dx,记录外层循环次数
    lea si, buf                 ;传送缓冲区首地址
    mov di, si                  ;传到di,可以动态调整指针,而不修改si
nei:mov ah, byte ptr[di]        ;传送第一个数据中的高位到ah
    mov al, byte ptr[di+01h]    ;传送第一个数据中的低位到al
    cmp ah, byte ptr[di+03h]    ;先比较第一个数据和第二个数据的高位
    jb nochange                 ;小于,不用交换
    ja change                   ;大于,需要交换
    cmp al, byte ptr[di+04h]    ;高位相等,接着比较地位 
    jbe nochange                ;小于等于,不用交换
change:xchg ah, byte ptr[di+03h]
    xchg al, byte ptr[di+04h]   ;分别交换两个数的高、低位
nochange:mov byte ptr[di], ah        
    mov byte ptr[di+01h], al    ;将ax寄存器中的数据放回缓冲区
    add di,3                    ;指向下一组需要比较的数据
    loop nei                    ;使用loop跳转控制内循环 
    mov cx, dx                  ;当内循环结束,传送原外循环次数
    loop wai                    ;跳转到外循环,外循环次数减一
    ret 
sorting endp
code ends 
    end start

注意
实验具体算法思想与调试过程可参考资源《微机实验二排序完整报告》,若有错误,欢迎指出~

你可能感兴趣的:(排序算法)