Добрый день. Если не сложно, поделитесь кто-нибудь кодом сортировки (tasm, 16 реальный режим) заданного количества строк, одинаковой длины, по определённой букве. К примеру, дано: ФАЫФВА ФВФВАУ ПВЫЫБС БЖЭЭГМ Сортируем по предпоследней букве: ФВФВАУ ПВЫЫБС ФАЫФВА БЖЭЭГМ
Loginanton Поиск на сайте рулит. Здесь реализация на MASM (на TASM, 16 переписать не сложно) сортировок: пузырьковой, шейкером, пирамидальной, прямым включением, прямым выбором, Шелла, Хоара (быстрая сортировка) на примере одного и того же массива двойных слов
Собственно сам уже написал Если кому то пригодится то вот код: Код (Text): DOSSEG .model TINY .data array db "LOGINOV A.A.",10,13 db "OPARIN P.V.",10,13 db "ALEKSEEV T.U.",10,13 db "OSIPOV P.Y.",10,13 db "KULKOV A.X.",10,13 db "BALASHOV O.U.",10,13 db "LOGINOV A.L.",10,13 db "EMNONOV S.Y.",10,13 db "RAKOVICH O.I.",10,13 db "GON4AROV A.P.",10,13 db "$" .code ; swap funtion swap: pop dx pop bx ; bx = &array push dx mov cx, 15d ; cx = num of loop for: push bx add bx, cx dec bx mov al, [bx] ; ax = first word mov dl, [bx+15d] ; dx = second word mov [bx], dl mov [bx+15d], al pop bx loop for ret ; end of swap function start: mov ax, @code mov ds, ax mov cx, 9 loop2: push cx mov bx, offset array mov cx, 9 loop1: mov ax, [bx+24] cmp ax, [bx+9] ; ñðàâíèâàåì ïåðâûå áóêâû â ñòðîêàõ ja inc_str push bx push cx push bx call swap pop cx pop bx inc_str: add bx, 15 loop loop1 pop cx loop loop2 mov dx, offset array mov ah, 9h int 21h mov ah, 4ch int 21h end start
1) В CX должно быть число слов, судя по коментарию. Но их вовсе не 15, это вообще-то должен быть параметр. А $ вообще наводит на мысль, что вы ( или автор у которого вы скопипастили) собирался останавливаться по нему, а не по числу. 2) Непонятная конструкция. Если бы CX не менялся, то BX прыгал бы по начал слов. А так вы будете "косить" влево. И 3) Как я сразу не понял. Вы просто "скоммуниздили" программу перестановки слов, да еще и с двумя ошибками. Она переставляет "по косой" и всего один символ. Для сортировка она нужна, но нужно еще и саму сортировку делать. Батенька, чтобы не позорится в следующий раз, используйте translate.ru, раз уж английский не сечете :-Р
Loginanton минимальный код на асме потребует добавить еще один вектор структур, элементами которых будут ссылка на строку и ссылка на некое пожатое представление строки записанное в двордах. сортировка будет проходить в 2 этапа 1) подготовка этих самых "пожатых представление строки записанных в двордах" 2) сортировка с изменением порядка ссылок. даст лог зависимость времени от длины списка
valterg, моя программа работает более чем корректно, да и написал её полностью сам, готовым кодом не пользовался. Что бы не позориться, изобразите в следущий раз, что ассемблер знаете
Приношу извинения, но я не увидел продолжения программы. Перестановка делается правильно, но запрограммировано очень "вычурно" - вот я и запутался. У вас нет единого стиля - при сортировке вы запихали все в оффсет, зачем же делать dec bx в перестановке - зашейте это оффсет. В цикле сортировки ошибка. В задании было по определённой букве, а у вас сортируестя по 4-м буквам: Код (Text): mov ax, [bx+24] cmp ax, [bx+9] ; ñðàâíèâàåì ïåðâûå áóêâû â ñòðîêàõ Нужно заменить на al.