第二篇:逆向之选择排序

这次是直接在维基复制来的代码,就单分析排序的函数

// 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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值