这次是直接在维基复制来的代码,就单分析排序的函数
// selection sort function module in C
void selectionSort(int data[], int count)
{
int i, j, min, temp;
for (i = 0; i < count - 1; i++) {
/* find the minimum */
min = i;
for (j = i+1; j < count; j++)
if (data[j] < data[min])
min = j;
/* swap data[i] and data[min] */
if(min != i) {
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}
}
下面是本函数的汇编版本,无优化哦~~个人感觉这里的循环比较难还原...也不知道是因为受源码是2个for的影响还是......
总之如果用IDA反编译下的话就会变成判断比较复杂的do while + for的双循环......还是得多加练习啊
011E1000 >/$ 83EC 08 sub esp, 8 ; 之前esp+8是要排序数据,而edx=esp+8
011E1003 |. 53 push ebx
011E1004 |. 55 push ebp
011E1005 |. 56 push esi
011E1006 |. 57 push edi
011E1007 |. 33DB xor ebx, ebx
011E1009 |. 8DA424 000000>lea esp, dword ptr [esp]
011E1010 |> 8D43 01 /lea eax, dword ptr [ebx+1] ; eax从1开始增长
011E1013 |. 83F8 06 |cmp eax, 6
011E1016 |. 8BFB |mov edi, ebx
011E1018 |. 894424 10 |mov dword ptr [esp+10], eax ; esp+10就是分配的临时变量空间
011E101C |. 7D 43 |jge short 011E1061
011E101E |. 8D349D 000000>|lea esi, dword ptr [ebx*4]
011E1025 |. 897424 14 |mov dword ptr [esp+14], esi ; 记住了,esp+14存的是要排序数组的偏移
011E1029 |. 8DA424 000000>|lea esp, dword ptr [esp]
011E1030 |> 8D0C85 000000>|/lea ecx, dword ptr [eax*4] ; 根据各个跳转和前面那些准备工作的情况,猜测这里应该是进入了循环内部
011E1037 |. 8B2C11 ||mov ebp, dword ptr [ecx+edx]
011E103A |. 3B2C16 ||cmp ebp, dword ptr [esi+edx] ; 当前数据和后一个数据比较,小于的话继续比较下一个
011E103D |. 7D 04 ||jge short 011E1043
011E103F |. 8BF8 ||mov edi, eax ; 找到的数的下标
011E1041 |. 8BF1 ||mov esi, ecx ; 找到的数的偏移
011E1043 |> 40 ||inc eax
011E1044 |. 83F8 06 ||cmp eax, 6
011E1047 |.^ 7C E7 |\jl short 011E1030
011E1049 |. 3BFB |cmp edi, ebx
011E104B |. 74 10 |je short 011E105D ; 找到的数等于当前数
011E104D |. 8B4424 14 |mov eax, dword ptr [esp+14] ; 当前偏移存储到eax
011E1051 |. 8B34BA |mov esi, dword ptr [edx+edi*4] ; 找到的数存到esi
011E1054 |. 8B0C10 |mov ecx, dword ptr [eax+edx] ; 下面3指令将2数交换位置
011E1057 |. 893410 |mov dword ptr [eax+edx], esi
011E105A |. 890CBA |mov dword ptr [edx+edi*4], ecx
011E105D |> 8B4424 10 |mov eax, dword ptr [esp+10]
011E1061 |> 8BD8 |mov ebx, eax
011E1063 |. 83FB 05 |cmp ebx, 5
011E1066 |.^ 7C A8 \jl short 011E1010
011E1068 |. 5F pop edi
011E1069 |. 5E pop esi
011E106A |. 5D pop ebp
011E106B |. 5B pop ebx
011E106C |. 83C4 08 add esp, 8
011E106F \. C3 retn