用汇编与C实现冒泡排序以及一点思考

原创 2011年01月09日 14:08:00

汇编实现(AT&T语法):

.section .data
values:
	.int 33, 25, 67, 10, 1
.section .text
.global _start
_start:
	nop
	movl $values, %esi
	movl $4, %ecx
	movl $4, %ebx
loop:
	movl (%esi), %eax
	cmp %eax, 4(%esi)
	jge skip
	xchg %eax, 4(%esi)
	movl %eax, (%esi)
skip:
	add $4, %esi
	dec %ebx
	jnz loop
	dec %ecx
	jz end
	movl $values, %esi
	movl %ecx, %ebx
	jmp loop
end:
	movl $1, %eax
	movl $0, %ebx
	int $0x80
	

C 实现:

#include 
#include 

void PrintValues(int *values, int count)
{
	if (NULL == values || 0 >= count)
		return;

	for (int i = 0; i < count; ++i)
	{
		printf("%d,", *(values+i));
	}

	printf("/n");
}

int main(int argc, char** argv)
{
	int values[] = {33, 25, 67, 10, 1};

	int count = sizeof(values) / sizeof(*values);

	PrintValues(values, count);

	for (int outer = 0; outer < count-1; ++outer)
	{
		for (int inner = 0; inner < count-1-outer; ++inner)
		{
			if (*(values+inner) > *(values+inner+1))
			{
				int temp = *(values+inner);
				*(values+inner) = *(values+inner+1);
				*(values+inner+1) = temp; 
			}
			else 
			{
				continue;
			}
		}
	}

	PrintValues(values, count);

	getchar();

	return 0;
}
C 实现的反汇编:
int main(int argc, char** argv)
{
 push        ebp  
 mov         ebp,esp  
 sub         esp,110h  
 push        ebx  
 push        esi  
 push        edi  
 lea         edi,[ebp-110h]  
 mov         ecx,44h  
 mov         eax,0CCCCCCCCh  
 rep stos    dword ptr es:[edi]  
 mov         eax,dword ptr [___security_cookie (257000h)]  
 xor         eax,ebp  
 mov         dword ptr [ebp-4],eax  
	int values[] = {33, 25, 67, 10, 1};
 mov         dword ptr [ebp-1Ch],21h  
 mov         dword ptr [ebp-18h],19h  
 mov         dword ptr [ebp-14h],43h  
 mov         dword ptr [ebp-10h],0Ah  
 mov         dword ptr [ebp-0Ch],1  

	int count = sizeof(values) / sizeof(*values);
 mov         dword ptr [ebp-28h],5  

	PrintValues(values, count);
 mov         eax,dword ptr [ebp-28h]  
 push        eax  
 lea         ecx,[ebp-1Ch]  
 push        ecx  
 call        PrintValues (2511BDh)  
 add         esp,8  

	for (int outer = 0; outer < count-1; ++outer)
 mov         dword ptr [outer],0  
 jmp         main+74h (253604h)  
 mov         eax,dword ptr [outer]  
 add         eax,1  
 mov         dword ptr [outer],eax  
 mov         eax,dword ptr [ebp-28h]  
 sub         eax,1  
 cmp         dword ptr [outer],eax  
 jge         main+0D9h (253669h)  
	{
		for (int inner = 0; inner < count-1-outer; ++inner)
 mov         dword ptr [inner],0  
 jmp         main+91h (253621h)  
 mov         eax,dword ptr [inner]  
 add         eax,1  
 mov         dword ptr [inner],eax  
 mov         eax,dword ptr [ebp-28h]  
 sub         eax,1  
 sub         eax,dword ptr [outer]  
 cmp         dword ptr [inner],eax  
 jge         main+0D7h (253667h)  
		{
			if (*(values+inner) > *(values+inner+1))
 mov         eax,dword ptr [inner]  
 mov         ecx,dword ptr [inner]  
 mov         edx,dword ptr [ebp+eax*4-1Ch]  
 cmp         edx,dword ptr [ebp+ecx*4-18h]  
 jle         main+0D3h (253663h)  
			{
				int temp = *(values+inner);
 mov         eax,dword ptr [inner]  
 mov         ecx,dword ptr [ebp+eax*4-1Ch]  
 mov         dword ptr [temp],ecx  
				*(values+inner) = *(values+inner+1);
 mov         eax,dword ptr [inner]  
 mov         ecx,dword ptr [inner]  
 mov         edx,dword ptr [ebp+ecx*4-18h]  
 mov         dword ptr [ebp+eax*4-1Ch],edx  
				*(values+inner+1) = temp; 
 mov         eax,dword ptr [inner]  
 mov         ecx,dword ptr [temp]  
 mov         dword ptr [ebp+eax*4-18h],ecx  
			}
			else 
 jmp         main+0D5h (253665h)  
			{
				continue;
 jmp         main+88h (253618h)  
			}
		}
 jmp         main+88h (253618h)  
	}
 jmp         main+6Bh (2535FBh)  

	PrintValues(values, count);
 mov         eax,dword ptr [ebp-28h]  
 push        eax  
 lea         ecx,[ebp-1Ch]  
 push        ecx  
 call        PrintValues (2511BDh)  
 add         esp,8  

	getchar();
 mov         esi,esp  
 call        dword ptr [__imp__getchar (2582B0h)]  
 cmp         esi,esp  
 call        @ILT+295(__RTC_CheckEsp) (25112Ch)  

	return 0;
 xor         eax,eax  
}

在用 C 实现时,思考的核心是:如何控制循环,并在正确的时候交换数据。

在用汇编实现时,思考的核心是:如何分配寄存器,如何具体控制循环(loop 与 skip)。

在用汇编时,我先是思考好程序的流程:loop 与 skip,然后建立好对应的结构,再往结构中填写代码,然后控制好程序的执行流程。

汇编比 C 需要思考更多的问题,对程序员的要求也相对高点,C 不需要思考的问题,汇编都需要思考。在用 C# 与 Java 实现冒泡排序时,相对于C,不再需要思考指针操作相关的问题了。当用 Python 等动态语言实现这个算法时,相对于 Java 与 C#,不再需要交换数据时的临时变量,代码又节省了。

内嵌汇编与C/C++实现的冒泡排序,快速排序算法排序500W个数据对比

内嵌汇编是微软为了提高程序的优化能力而嵌入在VC中的,这意味着你如果在C/C++程序中使用了 inline  asm进行 汇编 那么 就注定无法跨平台的,对于没有汇编基础的同学是需要去学习下 的,因为...

汇编实现键盘输入冒泡排序

  • 2009年11月24日 14:42
  • 1KB
  • 下载

S3C2440冒泡排序(汇编)

AREA TEST2,CODE,READONLY ENTRY CODE32 ;把随机的十个数安从小到大的顺序排序,并存放在目标内存单元中 ;R0,R1用于循环计数 ;R2,存放Src首...

汇编 实现正负数的冒泡排序

OUTtishi MACRO HAHA PUSH DX PUSH AX LEA DX,HAHA MOV AH,9 INT 21H ENDM    .386 DATA SEGMENT ...

51单片机汇编实现冒泡排序

今天为了复习课本上面的程序,就实地检验了下这个程序,当年可是学过微机原理里的冒泡排序的,结果移植平台后又是如此麻烦,呵呵,网上贴吧,论坛,知道,文库上面拜托你们的程序能不能靠谱点!!! 第一种常见的...

冒泡排序和插入排序的一点思考

冒泡排序和插入排序都是时间复杂度为O(n2)的排序算法,实现简单但是效率低下。这两个排序算法长相类似,初学者很容易弄混淆,今天我来简要分析二者区别。 冒泡排序大体思路:把一串元素排成一列,每次从最下面...
  • lzdidiv
  • lzdidiv
  • 2017年02月15日 10:00
  • 124

arm汇编冒泡排序

  • 2016年01月14日 15:21
  • 812B
  • 下载

汇编源代码-冒泡排序

  • 2008年01月25日 13:58
  • 1KB
  • 下载

单链表实现冒泡排序算法(C实现)

本实现主要采用交换指针的方法,其中附加有单链表及其相关的实现 #include struct Node; typedef struct Node *PtrToNode; typedef Ptr...

汇编冒泡排序

  • 2011年12月26日 18:59
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用汇编与C实现冒泡排序以及一点思考
举报原因:
原因补充:

(最多只允许输入30个字)