插入排序不交换

时间:2016-04-25 07:11:38

标签: visual-c++ assembly x86 masm insertion-sort

我必须在x86中实现插入排序算法,而我的代码根本不会改变数组的输出。我认为问题出在我试图交换内循环的地方,但每当我改变数组元素的分配方式时,都没有任何反应。程序输出的任何内容都没有变化。为什么会发生这种情况,我该如何解决?

我的代码是:

void asmSort(int *list, int arrayLen, int halfpoint) {

/*
 * list = address of the list of integer array
 * arraylen = the number of element in the list  just like list.length in java
 * halfpoint  use as a flag
 * halpfpoint = 1 when the sort routine reach half point just return, otherwise finished the sort and return
 */

/*
 *
 *
 insertion_sort(list,arrayLen,halfpoint);
 return;
 selection_sort(list,arrayLen,halfpoint);
 return;
 *
 *
 */


// any variable can be declare here before _asm
/*
int tmp = 0;
int  i = 0;
int  j = 0;
*/


    _asm 
{
    mov ecx, arrayLen
    mov esi, list
    mov ebx, halfpoint
    mov eax, 99
    push eax
    push ebp

    mov ebp, 4 //this is i
    shl ecx, 2

outerLoop:
    cmp ebp, ecx
    jg exitOuter
    add esi,ebp
    mov edi,[esi]// temp = a[i]
    mov eax, ebp //j = i
    sub eax, 4  // j = j-1
innerLoop :
    cmp eax, 0    //j>0
    jle exitInner
    add esi, eax // offset array to a[j]
    mov edx, [esi] // move a[j] to edx
    cmp edi, edx // temp < a[j]
    jle exitInner
    push eax



    mov eax,[esi]
    add esi,4
    mov esi,edi



    pop eax
    sub eax,4 // j--
    jmp innerLoop



exitInner:
    shr ecx, 1
    cmp ebp, ecx
    je exitOuter
    sub esi,ebp
    add ebp, 4//i++
    jmp outerLoop

exitOuter :
    sub esi, ebp
    pop ebp
    pop eax


    ; .......
more:   cmp ecx,0
    jle done
    ;.........
    mov edx,arrayLen
    sar edx,1
    cmp ecx,edx
    jg  cont1
    cmp halfpoint,1
    je done
cont1:  ;.....
    ;......
    ;.......
    ;.....
    mov [esi],eax
    add esi,4
    dec ecx
    jmp more
done:
}

return;

}

1 个答案:

答案 0 :(得分:1)

You never write to memory. The problem is here:

mov eax,[esi]
add esi,4
mov esi,edi

You want to write to memory at ESI, not to register ESI.

mov eax,[esi]
add esi,4
mov [esi],edi