基于8086CPU的汇编课程设计,题目:1、快速排序,2、折半查找

本文介绍了使用8086汇编语言实现快速排序和折半查找的过程。在快速排序中,通过栈和缓冲区处理数据,利用INT 21H中断和JMP指令进行输入输出。折半查找则关注于数值的查找和ASCII码的转换。文章提供了代码和运行解释,并分享了在汇编语言中处理数据结构和算法的挑战与收获。
摘要由CSDN通过智能技术生成

最近课设在写汇编课程设计,题目也算是不经意间选了两个,并且两个题目之间也有相似部分,实现的方法也是类似的。

2019夏之汇编课程设计,保证代码,注释都开源。若有错误,欢迎指教。

课本:From 王爽老师

题目:快速排序+折半查找


一、快速排序

快速排序大家对算法都很熟悉,用汇编语言来实现主要是解决字符的输入输出,与有限的寄存器的矛盾。采用栈,缓冲区等方法来保存数据,增大保存信息的容量,不失为一种好方法。对于数据区的定义,存入,取出都是对CPU运作原理的理解与应用。

关于快速排序实现的思想,这篇博客给了我很多启发,Thanks,贴:大佬链接,对快拍的理解很深啊。 

https://blog.csdn.net/man_sion/article/details/70138747

不只是标准思路,选第一个作为标准,一个方向:从前往后找一个 大于标准值的,找到先暂停,另一个方向,从后往前找一个小于标准值的,将这两个数字交换,如此继续,两个坐标相向而行,直到相遇,相遇后讲标准值和相遇点的值交换,从相遇点将数组看成两段,继续做快拍,所以快拍的时间复杂度为 Nlog2(N),每次都是二分的思想,所以是很快的。

但是假如用汇编实现,所需要的寄存器数量比较多,写起来肯定复杂,寄存器交作。所以采用下面这种两头交换法,二分分段的思想,实现,(两头交换法与标准算法思想的差异是,先从左边开始找到大于基准值的那个数,再从右边找到小于基准值的那个数,将两个数交换(这样比基准值小的都在左边,比基准值大的都在右边)。直到数列分成大于基准值和小于基准值的两个区间,以这两个区间进行同样的排序操作。)

汇编Code如下:

assume cs:code,ds:data
data segment
    count dw 10
    buffer db 20H dup(?)    ;  例: 88,9,00,5,7,3,44,2,44,8
                            ; (字节型能保存的最大数值是 0 -- 2^8-1,
                            ;  但是为了简化输入和输出,只考虑了0-99,想做三位数后面的注释有提示 )
    str0 db 0DH,0AH,24H     ;回车,换行,结束
    string db '--please input 10 numbers--',0DH,0AH,'$' ;,0DH,0AH,表示回车换行,'$'表示结束符
    str1   db '--The 10 numbers Out as  --',0DH,0AH,'$' ;,0DH,0AH,表示回车换行,'$'表示结束符
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    call show
    call input
    mov si,offset buffer
    mov di,offset buffer
    mov bx,offset buffer
    add bx,count        ;count 代表数据个个数
    dec bx
    call QSORT
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值