汇编也快要考试了,最后一次的实验内容是:
实验名称:子程序设计
学时: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