在程序集中对字符串进行排序

时间:2010-10-26 05:27:12

标签: sorting assembly

我正在尝试用汇编语言编写函数类。它将对二维数组进行排序,使得行现在将按字母顺序包含数据。 我尝试了很多东西,但它实际上超出了我目前的知识。 这是我到目前为止所尝试的......

.386
public _Sort
.model flat
.code
_Sort proc

    push ebp
    mov ebp, esp
    push esi
    push edi

    mov edi, [esp + 4]    ; address of destination array
    mov esi, [esp + 8]    ; address of source array
    mov ecx, [esp + 16]   ; # of elements to mov
    cld
    rep movsd
L1:
    mov eax, [esi]
    cmp [esi + 8], eax
    jg L2
    xchg eax, [esi + 8]
    mov [esi], eax
L2: 
    pop edi
    pop esi
    pop ebp

    ret     
_Sort endp
end

这是C ++代码......

#include <iostream>

using namespace std;

extern "C" int Sort (char [] [20], int, int);

void main ()
    {
    char Strings [10] [20]
                    = { "One",
                        "Two",
                        "Three",
                        "Four",
                        "Five",
                        "Six",
                        "Seven",
                        "Eight",
                        "Nine",
                        "Ten"   };
    int i;
    cout << "Unsorted Strings are" << endl;
    for (i = 0; i < 10; i++)
        cout << '\t' << Strings [i] << endl;
    Sort (Strings, 10, 20);
    cout << "Sorted Strings are" << endl;
    for (i = 0; i < 10; i++)
        cout << '\t' << Strings [i] << endl;
    }

我确实认识到我的集会没有意义,抱歉。

1 个答案:

答案 0 :(得分:2)

您需要在函数/过程中构建汇编代码,就像使用其他语言编写代码一样。与C类似,字符串比较,复制等需要在函数中完成。仅举例:

; compares [esi] to [edi], returns +, 0 or - to indicate order
; inputs: esi, edi: addresses of strings
; destroys: esi, edi, edx
;
strcmp_int proc
    jmp short start
loop_top:
    inc esi
    inc edi
start:
    movsx eax, byte ptr [esi]
    movsx edx, byte ptr [edi]
    test edx, edx
    jz @f
    sub eax, edx
    jz loop_top
    ret
@@:
    sub eax, edx
    ret
strcmp_int endp

[警告:此代码不一定是按原样使用 - 只是您通常需要编写的一种函数的示例,以便在汇编语言中执行此类工作。这已经足够长了,因为我编写了很多汇编语言,你无疑可以在现代处理器上做得更好 - 至少对于纯粹用汇编语言完成的事情,你通常希望将结果放在标志中,而不是 - / 0 / +在strcmp(和)这样的寄存器中产生。但请注意,此确实返回标记由最终sub]

设置的标志

有关显式长度字符串的优化实现(SSE2 / AVX2)的一些链接,请参见Why is memcmp so much faster than a for loop check?,对于中长字符串,这可能要快得多。有关优化链接,请参阅the x86 tag wiki

您的sort将取决于您决定实施的排序算法。显然,Quicksort看起来与插入排序看起来不一样。然而,要点很简单:不要试图把它写成一个单一的整块代码 - 将它分解成易于编写和理解的部分。