今天反汇编了下冒泡排序法,程序代码: #include "stdafx.h" void test() { int s[]={0,9,5,1,2,4,3,8,7,6}; int l=(sizeof(s)/sizeof(s[0])); for(int i=0;i<l;i++) { for(int j=0;j<l-1-i;j++) { int a=s[j]; int b=s[j+1]; if(a>b) { s[j]=s[j+1]; s[j+1]=a; } } } for(i=0;i<l;i++) { printf("%d/n",s[i]); } } int main(int argc, char* argv[]) { test(); return 0; } Release反汇编代码 00401000 /$ 83EC 28 SUB ESP,28 //开辟了10个堆栈空间 00401003 |. 56 PUSH ESI 00401004 |. 57 PUSH EDI 00401005 |. BF 09000000 MOV EDI,9 //edi为9 0040100A |. C74424 08 000>MOV DWORD PTR SS:[ESP+8],0 00401012 |. 897C24 0C MOV DWORD PTR SS:[ESP+C],EDI 00401016 |. C74424 10 050>MOV DWORD PTR SS:[ESP+10],5 0040101E |. C74424 14 010>MOV DWORD PTR SS:[ESP+14],1 00401026 |. C74424 18 020>MOV DWORD PTR SS:[ESP+18],2 0040102E |. C74424 1C 040>MOV DWORD PTR SS:[ESP+1C],4 00401036 |. C74424 20 030>MOV DWORD PTR SS:[ESP+20],3 0040103E |. C74424 24 080>MOV DWORD PTR SS:[ESP+24],8 00401046 |. C74424 28 070>MOV DWORD PTR SS:[ESP+28],7 0040104E |. C74424 2C 060>MOV DWORD PTR SS:[ESP+2C],6 //10个堆栈赋值,数组初始化 00401056 |> 85FF /TEST EDI,EDI //edi与edi 00401058 |. 7E 1A |JLE SHORT maopao.00401074 //如果小于等于0,则跳转 0040105A |. 8D4424 0C |LEA EAX,DWORD PTR SS:[ESP+C] //将esp+c的值给eax(也就是数组索引为1处的地址) 0040105E |. 8BF7 |MOV ESI,EDI //edx给esi 00401060 |> 8B08 |/MOV ECX,DWORD PTR DS:[EAX] //将数组索引为eax处的值给ecx 00401062 |. 8B50 FC ||MOV EDX,DWORD PTR DS:[EAX-4] //数组索引为eax-4处的值给edx 00401065 |. 3BD1 ||CMP EDX,ECX //比较2个值 00401067 |. 7E 05 ||JLE SHORT maopao.0040106E //小于等于则跳转 00401069 |. 8948 FC ||MOV DWORD PTR DS:[EAX-4],ECX //将ECX值给数组[eax-4] 0040106C |. 8910 ||MOV DWORD PTR DS:[EAX],EDX //将数组edx的值给数组[eax],可以看出这2句实现了数据交换,升序排序 0040106E |> 83C0 04 ||ADD EAX,4 //eax+4,数组索引加了1 00401071 |. 4E ||DEC ESI //循环变量esi-1 00401072 |.^ 75 EC |/JNZ SHORT maopao.00401060 //不为0则跳转 00401074 |> 4F |DEC EDI //edi-- 00401075 |. 83FF FF |CMP EDI,-1 //edi与-1比较 00401078 |.^ 7F DC /JG SHORT maopao.00401056 //如果大于则跳转 0040107A |. 5F POP EDI 0040107B |. 5E POP ESI 0040107C |. 83C4 28 ADD ESP,28 //回收堆栈 0040107F /. C3 RETN