Вы захотите построить свой ассемблерный код в функциях / процедурах, как если бы вы кодировали на каком-то другом языке. Как и в Си, в функциях необходимо выполнить сравнение строк, копирование и т. Д. Просто для примера:
; 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
будет зависеть от алгоритма сортировки, который вы решите реализовать. Очевидно, быстрая сортировка не будет выглядеть так же, как сортировка вставкой. Суть, однако, проста: не пытайтесь писать это как один монолитный кусок кода - разбивайте его на части, которые по отдельности легко написать и понять.