汇编语言——快速排序

// 快排.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

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值