Сортировка строки символов в сборке - PullRequest
0 голосов
/ 26 октября 2010

Я пытаюсь написать на ассемблере функцию вида.Он отсортирует двумерный массив так, что теперь строки будут содержать данные в алфавитном порядке.Я перепробовал много вещей, но это, честно говоря, за пределами моих нынешних знаний.вот что я пробовал до сих пор ...

.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 Ответ

2 голосов
/ 26 октября 2010

Вы захотите построить свой ассемблерный код в функциях / процедурах, как если бы вы кодировали на каком-то другом языке. Как и в Си, в функциях необходимо выполнить сравнение строк, копирование и т. Д. Просто для примера:

; 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]

См. Также Почему memcmp намного быстрее, чем проверка цикла for? для некоторых ссылок на оптимизированные реализации (SSE2 / AVX2) для строк явной длины, которые могут быть намного быстрее для строк от средней до длинной , Общие ссылки по оптимизации см. вики-тега x86 .

.

Ваш sort будет зависеть от алгоритма сортировки, который вы решите реализовать. Очевидно, быстрая сортировка не будет выглядеть так же, как сортировка вставкой. Суть, однако, проста: не пытайтесь писать это как один монолитный кусок кода - разбивайте его на части, которые по отдельности легко написать и понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...