快速排序 8086汇编

汇编也快要考试了,最后一次的实验内容是:

实验名称:子程序设计

学时:4

实验内容:

设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用快速排序算法(Quick Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。然后在显示器输出排好序的数据,中间用’,’隔开。

单趟排序使用子程序方式。

输出数据使用子程序方式。

实验目的及要求:

掌握子程序设计相关指令和伪指令的使用方法

掌握子程序设计方法,特别是参数传递方法

掌握主程序和子程序之间的调用关系和调用方法

熟悉循环和子程序结合应用解答问题的思路

 

--------------------------------------------------------------

这个程序花了很多时间 不是算法上的问题,快排的算法数据结构里就有了。主要要注意的问题是,调用程序之前一定要注意压栈,程序运行之后一定要出栈,这样才能保证初始条件不会变化,只会要输出的寄存器有影响。一个忘了压栈的寄存器,花了那么多的时间才调出来。不过感谢老天,最后还是通过了~~~~~~~~~~~~

下面是代码:

DATAS SEGMENT

COUNT DW 6

DATA DB 6,5,4,3,2,1

DATAS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATAS

START:

       MOV AX,DATAS

    MOV DS,AX

       MOV      SI,OFFSET DATA

       MOV      DI,OFFSET DATA

       MOV BX,OFFSET DATA

       ADD BX,COUNT

       DEC BX

       CALL QSORT

       MOV CX,COUNT

       CALL SHOW

    MOV AH,4CH

    INT 21H

;函数名:QSORT

;子程序功能:递归快速排序

;入口:DI,BX分别为起始和结束地址

;出口:内存中的数据已排序

QSORT   PROC     NEAR

       PUSH DI

       PUSH BX

       CMP       DI,BX

       JNB NEXT

       PUSH    DI

       PUSH    BX        

       CALL     PARTITION

       POP        BX

       POP        DI

       PUSH BX ;这个push是必要的,一开就忘了 因为在下次调用qsort时,需要BX的值不变

       MOV      BX,AX

       DEC BX

       PUSH     DI

       PUSH     BX

       CALL     QSORT

       POP        BX

       POP        DI

       POP BX   ;对应上面的

       MOV      DI,AX

       INC DI

       PUSH     DI

       PUSH     BX

       CALL     QSORT

       POP        BX

       POP        DI

NEXT:

       POP BX

       POP DI

       RET

       QSORT   ENDP

;子程序名:partition

;功能:进行一趟排序,将数据按枢轴分为两段

;入口:DI= &r[low], BX=&r[high]

;出口:返回枢轴位置在AX

PARTITION   PROC     NEAR

       MOV      CL,[DI]

AG: CMP       DI,BX

       JNB NEXT    

A:    CMP       DI,BX

       JNB ONE

       CMP       [BX],CL

       JB   ONE

       DEC       BX

       JMP A

ONE:MOV     CH,[BX]

       MOV AH,[DI]

       MOV      [DI],CH

       MOV      [BX],AH

B:    CMP       DI,BX

       JNB TWO

       CMP       [DI],CL

       JA   TWO

       INC DI

       JMP B

TWO:MOV    CH,[BX]

       MOV AH,[DI]

       MOV      [DI],CH

       MOV      [BX],AH

       JMP AG

NEXT:

       MOV      AX,DI  ;枢轴地址给Ax

       RET

PARTITION   ENDP

;子程序名:SHOW

;功能:在屏幕上显示排好序的数据

;入口:SI为起始地址,cx为输出个数

;出口:输出

 

SHOW    PROC     NEAR

AG:

       XOR AL,AL

       ADD       AL,[SI]

       ADD AL,'0'

       MOV DL,AL

       INC SI

       MOV      AH,02

       INT 21H

       MOV DL,' '

       MOV AH,02

       INT 21H

       LOOP AG

       RET

SHOW    ENDP 

CODES ENDS

    END START

posted on 2012-11-21 10:02  ocr  阅读(2273)  评论(0编辑  收藏  举报