В общем, читаю хайда. В Programming projects нужно написать простую программу, которая сортирует слова в памяти с 1000h до 10ffh в возрастающем порядке. Написано также, что "вы можете использовать простой алгоритм сортировки вставками". Дальше приведен этот алгоритм на паскале. Вроде разобрался, перевел на асм(асм специфический, надо сказать: можно использовать набор регистров и способы адресации 8086). Но есть одна проблемка. Для начала кусок кода, который собственно сортирует: Код (Text): mov bx,1000h mov bp,1002h a: mov dx,ds:[bx] cmp dx,ds:[bp] ja m add bp,2 cmp bp,10ffh jae l jmp a l: cmp bx,10fdh jae e add bx,2 mov bp,bx add bp,2 jmp a m: mov ax,ds:[bx] mov dx,ds:[bp] mov ds:[bx],dx mov ds:[bp],ax add bp,2 cmp bp,10ffh jae l jmp a e: ;дальше типа вывод рез-та и выход Чувствуется, что код не великолепный , но все таки он работает. С одной ошибкой. А именно: последнее слово(самое большое) из уже отсортированной последовательности встает почему то не на 10feh, как положено, а на 1100h. А на 10feh - нули. Если кому непонятно - аттач. Before.lst - содержимое памяти до сортировки, after.lst - после. Подскажите, что не так. Ну и, если можете, покажите плз как этот код должен выглядеть в нормальном виде =)), потому что чувстую, что с джампами переборщил, да и вообще.. В общем оптимизированный по скорости хотелось бы. Знаю, что этот алгоритм мягко говоря не самый лучший из сортировок, но пока его хотелось бы так скажем добить. Ладно, чо то заболтался . Напоследок модерам: я подумал, что теме место все таки в Beginners. Хотите - кидайте в A&O.
ладно, задачу ставлю по другому: приведите плз рабочую реализацию этого алгоритма. Без разницы - масм, фасм, самое главное чтобы правильно сортировал ворды в памяти. А я уж там разберусь где у меня ошибка.
Потому, что нужно cmp bx,10feh И вообще все делается проще и нагляднее Код (Text): mov bx,1000h a: mov ax,ds:[bx] lea bp,[bx+2] b: mov dx,ds:[bp] cmp dx,ax jae c mov ds:[bp],ax mov ds:[bx],dx mov ax,dx c: add bp,2 cmp bp,1100h jb b add bx,2 cmp bx,1100h-2 jb a
asd Ага. Вот я, например, не знаю как в CodeView можно было перейти на место перед началом сортировки элемента по адресу 10feh(или хотя бы 10fdh). Т.е. перед моментом сортировки элемента, с которым и была проблема. Может ты подскажешь?
Не хочу здесь никого огорчать, но два выше приведенные алгоритма на сортировку вставкой ну не как не тянут, на сортировку выбором - да. Я на полчаса в транс вошел пытаясь понять как тут же вставки происходят .
CodeTao ) Хмм, тогда интересно как insertion sort algorithm переводится? Дословное задание из книги: Write a simple program that sorts the words in memory locations 1000..10FF in ascending order. You can use a simple insertion sort algorithm. The Pascal code for such a sort is Код (Text): for i:=0 to n-1 do for j:=i+1 to n do if (memory[i] > memory[j]) then begin temp:=memory[i]; memory[i]:=memory[j]; memory[j]:=temp; end;
lcrowl Не могу сказать, как переводится, но этот алгоритм принято называть selection (а не insertion) sort.
lcrowl Есть и тот и другой: selection sort - сортировка методом выбора insertion sort - сортировка методом вставок
Да, видно Хайд погнал. Сейчас на вики нашел страницы с реализациями insertion sort и selection sort. Код Хайда больше похож на сортировку выбором(http://ru.wikipedia.org/wiki/Сортировка_методом_выбора#Pascal). ЗЫ. А как название темы поменять? Модераторы, исправьте плз название темы, а то как то нехорошо получается. Название одно, говорим про другое.