汇编实验4 数据排序

汇编实验4

实验目的

1、掌握用汇编语言编写排序程序的思路和方法。
2、掌握分支、循环、子程序调用等基本的程序结构。
3、学习综合程序的设计、编制及调试。

实验内容

要求设计一程序将这些数由小到大排序,排序后的数,仍放在该区域中。

给定数据版

CRLF    MACRO
        MOV    DL,0DH
        MOV    Ah,02H
        INT    21H
        MOV    DL,0AH
        MOV    AH,02H
        INT    21H
ENDM ;定义宏功能用于换行

STRSHOW MACRO buff;buff表示要显示字符串标号
        mov dx,offset buff
        mov ah,09H
        int 21H
ENDM;定义宏功能用于显示字符串
;定义数据段
datas segment
;输出提示信息
MESS1 db 'before sort:',0DH,0AH,'$'
MESS2 db 'after sort:',0DH,0AH,'$'
;排序数据
data db 56H,4EH,6AH,9CH,12H,0A4H,26H,38H ;排序数据
NUM EQU 8;排序数据个数
datas ends
;定义栈段
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends

code segment
ASSUME cs:code,ds:datas,ss:stack
START:;初始化相关寄存器
        mov ax,datas
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,TOP

        STRSHOW MESS1;调用宏功能输出MESS1
        call SHOWDATA;调用宏功能输出数据
        mov cx,NUM
        dec cx;外循环次数
outer:  
        mov dx,cx;内循环次数
        lea bx,data;取data的偏移量
iner:   
        mov al,[bx]
        cmp al,[bx+1];比较相邻数据大小
        jna next;前小于后,继续排序过程
        ;前大于后,进行交换
        xchg al,[bx+1]
        mov [bx],al
next:
        inc bx
        dec dx
        jnz iner
        LOOP outer

        STRSHOW MESS2;调用宏功能输出MESS2
        call SHOWDATA;调用宏功能输出数据
        mov ax,4c00h
        int 21h

;将al中的数据以十六进制输出
DISP PROC
        push ax
        push cx
        mov cl,4
        ror al,cl;循环右移4位,取高4位
        CALL TOASC;调用子程序输出字符
        ror al,cl;循环右移4位,取低4位
        CALL TOASC;调用子程序输出字符
        pop cx
        pop ax
        RET
DISP ENDP
;辅助输出子程序
TOASC PROC
        push ax
        push bx
        push dx
        lea bx,ASCII;bx指向转化表
        and al,0FH
        xlat cs:ASCII;al<--cs:[bx+al]
        ;输出
        mov dl,al
        mov ah,2
        int 21H
        pop dx
        pop bx
        pop ax
        RET
;子程序的数据区
ASCII   db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
        db 41h,42h,43h,44h,45h,46h
TOASC ENDP
;输出data数据区的数据
SHOWDATA PROC
        mov cx,NUM;数据个数
        lea si,data;si指向data的首地址
L1:
        mov al,[si]
        CALL DISP
        mov dl,',';以逗号分割数据
        mov ah,2
        int 21H
        inc si
        LOOP L1
        CRLF
        RET
SHOWDATA ENDP
code ends
end START

运行结果:
在这里插入图片描述

随机生成数据版

CRLF    MACRO
        MOV    DL,0DH
        MOV    Ah,02H
        INT    21H
        MOV    DL,0AH
        MOV    AH,02H
        INT    21H
ENDM ;定义宏功能用于换行

STRSHOW MACRO buff;buff表示要显示字符串标号
        mov dx,offset buff
        mov ah,09H
        int 21H
ENDM;定义宏功能用于显示字符串
;定义数据段
datas segment
;输出提示信息
MESS1 db 'before sort:',0DH,0AH,'$'
MESS2 db 'after sort:',0DH,0AH,'$'
;排序数据
data db 128 dup(?)
NUM EQU 50;排序数据个数
datas ends
;定义栈段
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends

code segment
ASSUME cs:code,ds:datas,ss:stack
START:;初始化相关寄存器
        mov ax,datas
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,TOP

        call Rand;调用Rand模块生成NUM个数据

        STRSHOW MESS1;调用宏功能输出MESS1
        call SHOWDATA;调用宏功能输出数据
        mov cx,NUM
        dec cx;外循环次数
outer:  
        mov dx,cx;内循环次数
        lea bx,data;取data的偏移量
iner:   
        mov al,[bx]
        cmp al,[bx+1];比较相邻数据大小
        jna next;前小于后,继续排序过程
        ;前大于后,进行交换
        xchg al,[bx+1]
        mov [bx],al
next:
        inc bx
        dec dx
        jnz iner
        LOOP outer

        STRSHOW MESS2;调用宏功能输出MESS2
        call SHOWDATA;调用宏功能输出数据
        mov ax,4c00h
        int 21h

;将al中的数据以十六进制输出
DISP PROC
        push ax
        push cx
        mov cl,4
        ror al,cl;循环右移4位,取高4位
        CALL TOASC;调用子程序输出字符
        ror al,cl;循环右移4位,取低4位
        CALL TOASC;调用子程序输出字符
        pop cx
        pop ax
        RET
DISP ENDP
;辅助输出子程序
TOASC PROC
        push ax
        push bx
        push dx
        lea bx,ASCII;bx指向转化表
        and al,0FH
        xlat cs:ASCII;al<--cs:[bx+al]
        ;输出
        mov dl,al
        mov ah,2
        int 21H
        pop dx
        pop bx
        pop ax
        RET
;子程序的数据区
ASCII   db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
        db 41h,42h,43h,44h,45h,46h
TOASC ENDP
;输出data数据区的数据
SHOWDATA PROC
        mov cx,NUM;数据个数
        lea si,data;si指向data的首地址
L1:
        mov al,[si]
        CALL DISP
        mov dl,',';以逗号分割数据
        mov ah,2
        int 21H
        inc si
        LOOP L1
        CRLF
        RET
SHOWDATA ENDP
;随机数生成子程序
Rand PROC
    mov cx,NUM
    lea si,data
L2:
    mov ax,0ffh
    mov dx,41h
    out dx,ax ;产生从1到AX之间的随机数
    in al,dx;产生的随机数AL
    mov [si],al
    inc si
    loop L2
    RET
Rand ENDP
code ends
end START

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy-wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值