如何在装配中快速排序停止条件

时间:2015-12-25 19:41:35

标签: assembly x86 quicksort masm irvine32

我正在尝试在汇编中实现快速排序。 当停止条件为真时我无法实现return语句,因为我可以用C#或任何其他高级语言来实现。 帮助将不胜感激!

这是我的代码:

INCLUDE Irvine32.inc
    Len EQU 8
.data
    Numbers byte 5,6,4,7,11,2,9,1
    Sorted byte Len dup(?)
    Index_Pivot dword ?
    Element_Pivot byte ?
    Greater byte Len dup(-1)
    Less byte Len dup(-1)
    Temp dword ?
    Temp2 dword ?
.code
Generate_Random PROC
    Mov eax,ebx
    CALL randomrange
    ret
Generate_Random ENDP
;-----------------------------

Quick_Sort PROC
    CMP ebx,1
        JLE Next
    CALL Generate_Random
    MOV Index_Pivot,eax
    ADD esi,eax
    MOV Temp2,eax
    MOV al,[esi]
    MOV Element_Pivot,al
    MOV byte ptr[esi],' '
    SUB esi,Temp2
    ;-------------------------
    MOV ecx,ebx
    JMP Do_calc
    Continue::

    MOV Temp,edx

    MOV esi,OFFSET Less
    MOV ebx,Temp
    CALL Quick_Sort

    Next:
    ret
Quick_Sort ENDP
;-------------------------------------
Do_calc:
        MOV ebx,0
        MOV edx,0
        ;MOV ecx,Len
        L:
            MOV al,Element_Pivot
            CMP byte ptr[esi],' '
                JE Next
            CMP [esi],al
                JG Move_Greater
                MOV al,[esi]
                MOV Less[edx],al
                INC edx  ; for less array
                JMP Next
                Move_Greater:
                    MOV al,[esi]
                    MOV Greater[ebx],al
                    INC ebx   ; for greater array
            Next:
            INC esi
        LOOP L
    jmp Continue


;-----------------
main PROC
    MOV esi,OFFSET Numbers
    MOV ebx,Len
    CALL Quick_Sort

    MOV edi,OFFSET Sorted

    MOV edi,OFFSET Sorted
    MOV ecx,LENGTHOF Sorted
    lo:
        mov eax,0
        mov al,[edi]
        call writeint
        INC edi
    LOOP lo
    CALL crlf



    exit
main ENDP

END main

1 个答案:

答案 0 :(得分:0)

您的代码已经停止了。要返回值或指向列表的指针,通常只需将值或指针放在eax中的列表中并返回。

为了响应OP对c#快速排序的异常实现,这里是单个函数Hoare分区方案快速排序的c#示例:

        static public void Quicksort(int [] a, int lo, int hi)
        {
            if (lo >= hi)
                return;
            int p = a[(lo + hi) / 2];
            int i = lo, j = hi;
            i--;                        // partition
            j++;
            while (true)
            {
                while (a[++i] < p) ;
                while (a[--j] > p) ;
                if (i >= j)
                    break;
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
            Quicksort(a, lo, j);        // recurse
            Quicksort(a, j + 1, hi);
        }