汇编语言——快速排序

// 快排.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
using namespace std;
int a[100],n;
void swap(int i, int j)
{
	int t = a[j];
	a[j] = a[i];
	a[i] = t;
}
void quicksort(int l,int r)
{
	if (l > r)
		return;
	int i, j;
	i = l, j = r;
	while (i < j)
	{
		
		while (i < j && a[j]  >= a[l])
		{
			j--;
		}
		while (i < j && a[i] <= a[l])
		{
			i++;
		}
		if (i >= j)
			break;
		swap(i, j);
	}
	swap(i, l);
	quicksort(l,i - 1);
	quicksort(i + 1, r);
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	quicksort(0, n - 1);
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	system("pause");
	return 0;
}

这是C++代码。


汇编代码:

1.封装了四个函数:swap() (交换函数)、qiucksort() (快排函数)、scanf() (读入数组)、print (输出数组)。

2.利用call quicksort 来递归函数。

3.利用栈的push、pop操作来解决函数之间传参的问题。

INCLUDE irvine32.inc
.data
	dat dd 4,8,6,9,2,3,4,7,2,10
	cnt dd ?
	l dd ?
	r dd ?
.code
start:
	mov eax,10
	mov cnt,eax
	call scanf
	;初始化l,r
	mov eax,0
	mov l,eax;
	mov eax,9
	mov r,eax
	;调用快排
	call quicksort
	call print
	exit
;封装交换函数
swap proc 
	;利用xchg 可以少用一个寄存器来充当临时变量
	mov edx,dat[esi*4];
	xchg edx,dat[ebx*4];
	xchg edx,dat[esi*4];
	ret
swap endp

quicksort proc
	mov eax,l
	cmp eax,r
	jg over
	xor esi,esi;
	xor ebx,ebx;
	mov esi,l;i
	mov ebx,r;j
	mov eax,dat[esi*4] 
	sort_again:
	cmp ebx,esi;				while (i!=j)
	je over_loop;
		loop_j_again:
			cmp esi,ebx; 			while(i<j)
			jge over_loop
			cmp eax,dat[ebx*4]; 	while (a[j]>=a[l])
			jg loop_i_again
			add ebx ,-1			;		j--
			jmp loop_j_again;	
		loop_i_again:
			cmp esi,ebx; 			while (i<j)
			jge over_loop
			cmp eax,dat[esi*4]; 	while (a[l]>=a[i])
			jl compare;
			add esi,1;					i++
			jmp loop_i_again;
		compare:
			cmp esi,ebx;			if (i>=j)
			jge over_loop;				break
			call swap;				swap(i,j)
	jmp sort_again
	over_loop:
		mov ebx,l;
		call swap;				swap(i,l)
		push esi; push i
		push r  ;push r
		mov r,esi
		add r ,-1
		call quicksort;			quicksort(l,i-1);
		pop r
		pop ebx
		mov l,ebx;
		inc l
		call quicksort;			quicksort(i+1,r);
	over:
		ret
quicksort endp

;封装一个输出函数
print proc
	mov ecx,cnt
	xor esi,esi
print_again:
			mov eax,dat[esi*4]
			call writeint
			call crlf
			inc esi;
			loop print_again
	ret
print endp
;封装输入函数
scanf proc
	mov ecx,cnt
	xor esi,esi
scanf_again:	
			call readint
			mov dat[esi*4],eax
			inc esi;
			loop scanf_again
	ret
scanf endp
end start

 

实验九是汇编语言中常用的排序算法——快速排序。可以将其编写成一个子程序,以便在实验十中调用。 下面是将王爽编的汇编语言的实验九编写成子程序的示例代码: ``` ;------------------------------------------------------- ; 快速排序子程序 ; 输入: ; 1. 数组首地址(通过si传入) ; 2. 数组长度(通过cx传入) ; 输出: ; 数组排序后的结果 ;------------------------------------------------------- quick_sort PROC push bp mov bp, sp push si push di push cx push dx ; 获取数组首地址 mov si, [bp + 4] ; 获取数组长度 mov cx, [bp + 6] ; 如果数组长度为1,直接返回 cmp cx, 1 je qs_end ; 将数组分为两部分 mov di, si add di, cx shr cx, 1 add si, cx dec si qs_loop: ; 从左往右找到第一个大于等于基准值的元素 qs_l: inc si mov al, [si] cmp al, [di] jbe qs_l ; 从右往左找到第一个小于等于基准值的元素 qs_r: dec di mov al, [di] cmp al, [bp + 8] jbe qs_r ; 如果左右指针相遇,则退出循环 cmp si, di jae qs_done ; 交换左右指针所指向的元素 mov dl, [si] mov dh, [di] mov [si], dh mov [di], dl ; 继续寻找下一对需要交换的元素 jmp qs_loop qs_done: ; 交换基准值和右指针所指向的元素 mov al, [bp + 8] mov dl, [di] mov [bp + 8], dl mov [di], al ; 递归处理左右两部分 mov dx, di sub dx, [bp + 4] call quick_sort mov dx, [bp + 6] sub dx, cx dec dx call quick_sort qs_end: pop dx pop cx pop di pop si pop bp ret 4 quick_sort ENDP ``` 在主程序中,可以通过以下代码调用该子程序进行排序: ``` ; 定义数组 arr DB 9, 4, 2, 7, 8, 6, 5, 1, 3 ; 获取数组长度 mov cx, LENGTHOF arr ; 调用快速排序子程序 mov si, OFFSET arr call quick_sort ``` 注意,在调用子程序前,需要将数组的首地址和长度传入子程序中。同时,在实验十中,可以将快速排序算法作为一个子程序,用于对数据进行排序,提高程序的可读性和复用性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值