从基础做起,一步一步来逆向!
我的第一个C++程序第一种方法,主要是函数不同,以及调用方式的不同//C++版冒泡排序程序
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tem = a;
a = b;
b = tem;
}
void main()
{
int i,j,arr;
for(i=0;i<10;i++)
{
cout<<"请输入10个整数:";
cin>>arr;
}
for(i=0;i<10;i++) //数组数据的循环比较
{ for(j=0;j<10-i-1;j++) //每一轮的比较
{ if(arr<arr) //比较相邻两个数大小
{swap(arr,arr); //互换函数的调用
}
}
}
for(i=0;i<10;i++)
{ cout<<"正确的从大到小的排序:"<<arr<<endl;
}
}SWAP函数第二种实现及调用方法:void swap(int *a, int *b)
{int tem = *a;
*a = *b
*b = tem;
}
调用时是:swap(&arr,&arr)下面是对我这个程序的反汇编代码0041E450push ebp ;从这里开始就是main()函数的开始
0041E451mov ebp, esp
0041E453sub esp, 108
0041E459push ebx
0041E45Apush esi
0041E45Bpush edi
0041E45Clea edi, dword ptr
0041E462mov ecx, 42
0041E467mov eax, CCCCCCCC
0041E46Crep stos dword ptr es:
0041E46Emov dword ptr , 0
0041E475jmp short 0041E480
0041E477mov eax, dword ptr ;eax就相当与i ,从这里开始循环
0041E47Aadd eax, 1 ;i++
0041E47Dmov dword ptr , eax ;把i保存了
0041E480cmp dword ptr , 0A ;i与10比较
0041E484jge short 0041E4AC ;i大于10就跳
0041E486push 004570E4 ;请输入10个整数:
0041E48Bpush 004607D0
0041E490call 0041CB6D ;显示“请输入10个整数:”
0041E495add esp, 8
0041E498mov eax, dword ptr
0041E49Blea ecx, dword ptr
0041E49Fpush ecx
0041E4A0mov ecx, 00460710
0041E4A5call 0041CAAA ;执行输入命令,相当与C++中的 cin<<arr
0041E4AAjmp short 0041E477 ;跳回去循环
0041E4ACmov dword ptr , 0 ;对i进行初始化
0041E4B3jmp short 0041E4BE
0041E4B5mov eax, dword ptr
0041E4B8add eax, 1 ;i++
0041E4BBmov dword ptr , eax
0041E4BEcmp dword ptr , 0A ;i与10比较
0041E4C2jge short 0041E512 ;大于就跳
0041E4C4mov dword ptr , 0 ;相当与对j初始化,j=0
0041E4CBjmp short 0041E4D6
0041E4CDmov eax, dword ptr
0041E4D0add eax, 1 ;j++
0041E4D3mov dword ptr , eax
0041E4D6mov eax, 0A ;从这里开始的三条指令其实就是10-i-1
0041E4DBsub eax, dword ptr
0041E4DEsub eax, 1
0041E4E1cmp dword ptr , eax ;这里就是j<10-i-1
0041E4E4jge short 0041E510 ;大于就跳
0041E4E6mov eax, dword ptr
0041E4E9mov ecx, dword ptr
0041E4ECmov edx, dword ptr
0041E4F0cmp edx, dword ptr ;这里其实就是 if(arr<arr)
0041E4F4jge short 0041E50E ;如果大于那么就不执行SWAP函数
0041E4F6mov eax, dword ptr
0041E4F9lea ecx, dword ptr
0041E4FDpush ecx ;压入参数a
0041E4FEmov edx, dword ptr
0041E501lea eax, dword ptr
0041E505push eax ;压入参数b
0041E506call 0041D20C ;这里就是SWAP互换函数
0041E50Badd esp, 8
0041E50Ejmp short 0041E4CD ;返回进行for(j=0;j<10-i-1;j++) 循环
0041E510jmp short 0041E4B5 ;返回进行for(i=0;i<10;i++) 循环
0041E512mov dword ptr , 0 ;好了这里就是对最后一个循环的 i 初始化
0041E519jmp short 0041E524
0041E51Bmov eax, dword ptr
0041E51Eadd eax, 1
0041E521mov dword ptr , eax
0041E524cmp dword ptr , 0A ;比较 i<10
0041E528jge short 0041E559 ;大于就跳
0041E52Apush 0041C505 ;这个参数就是endl
0041E52Fmov eax, dword ptr
0041E532mov ecx, dword ptr
0041E536push ecx
0041E537push 004570C8 ;字符传“正确的从大到小的排序:”
0041E53Cpush 004607D0
0041E541call 0041CB6D ;这里还是显示字符串
0041E546add esp, 8
0041E549mov ecx, eax
0041E54Bcall 0041C631 ;显示数据arr
0041E550mov ecx, eax
0041E552call 0041CB9A ;将光标换行
0041E557jmp short 0041E51B ;返回继续循环
0041E559xor eax, eax
0041E55Bpush edx
0041E55Cmov ecx, ebp
0041E55Epush eax
0041E55Flea edx, dword ptr
0041E565call 0041C5AF
0041E56Apop eax
0041E56Bpop edx
0041E56Cpop edi
0041E56Dpop esi
0041E56Epop ebx
0041E56Fadd esp, 108
0041E575cmp ebp, esp
0041E577call 0041CD7A
0041E57Cmov esp, ebp
0041E57Epop ebp
0041E57Fretn
*********************************************************
注:在bbs.chinadbg.cn上正在举行基础算法学习活动,欢迎大家来玩
by kill203
[ 本帖最后由 kill203 于 2007-8-9 19:53 编辑 ] 辛苦了,支持楼主分享。 高手,膜拜/:good 辛苦了,学习中.... 偶曾经也有这样的想法,但生性愚钝,玩不来——崇拜ing
[ 本帖最后由 lianglc 于 2007-9-19 17:46 编辑 ]
页:
[1]