Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1418 | Дата выхода: | 20.01.2011, 17:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 217 / 67 | Вопросов / ответов: | 1 / 1 | Вопрос № 181890: Здравствуйте! У меня возникли сложности с написание следующей программе на Assembler (TASM): "Отсортировать по возрастанию элементы массива чисел, кратные 3". К программе желательно краткое пояснение. Заранее спасибо.... Вопрос № 181890: Здравствуйте! У меня возникли сложности с написание следующей программе на Assembler (TASM): "Отсортировать по возрастанию элементы массива чисел, кратные 3". К программе желательно краткое пояснение. Заранее спасибо. Отправлен: 15.01.2011, 16:57 Вопрос задал: Sanek (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Ситкин Александр Викторович! 1) данные вводятся, как числовая строка максимальной длины 128 байт с проверкой на код цифры. Конец ввода - клавиша Enter или ровно 128 байт. 2) данные представляют собой байты-числа 0-9
Код: ;Отсортировать по возрастанию элементы массива чисел, кратные 3.
model small ;модель памяти .stack 512 ;стек
.data array DB 128 dup (?) ;массив n equ $-array ;max длина массива len dw 0 ;реальная длина массива sArray db 'Array: $' sSorted db 0dh,0ah,'Sorted: $' press db 0dh,0ah,'Press any key$'
.code start: ;точка входа mov ax, @data ;зададим се нменты данных mov ds, ax mov es, ax
lea dx, sArray mov ah, 9 int 21h ;строка приглашения для ввода array
mov len, 0 ;будем считать длину введенной строки lea di, array ;адрес массива array mov cx, n ;максимальная длина массива array c1: mov ah, 8 ;функция ввода кода без отображения c2: int 21h cmp al, 0dh ;по Enter-у прекращаем ввод je sort ;на сортировку cmp al, '0' ;проверка на цифру jb c2 ;нецифру игнорируем cmp al, '9' ja c2 mov dl, al ;сохраним для вывода and al, 0fh ;превратим в число stosb ;сохраним mov ah, 2 ;функция вывода символа из dl int 21h inc len ;считаем длину массива loop c1 ;по всем ;попадаем сюда, если введем все 128 кодов ;отсортируем массив методом пузырька sort: xor si, si ;индекс элемента в массиве mov cx, len ;число сортируемых элементов cmp cx, 2 ;если не ввели ни одного или один jbe result ; то нечего и сортировать - на вывод результата dec cx ;число сравнений mov bl, 3 ;будем делить на 3 SortLoop: ;цикл по поиску очередного минимального mov al, array[si] ;текущий максимальный по адресу [si] call div3 ;проверим, делится ли на 3 jne ExternalNext ;нет - обходим - на увеличение индекса текущего элемента mov ah, al ;считаем минимальным, сохраним в ah lea di, [si+1] ;начинаем со следующего push cx ;сохраним счетчик SearchMinLoop: ;цикл по всем последующим ;сравниваем текущий со всеми последующими mov al, array[di] ;очередной последующий call div3 ;проверим, делится ли на 3 jne InternalNext ;нет - обходим - на увеличение индекса последующего элемента cmp ah, al ;если текущий минимальный <= последующего, jle InternalNext ; то обходим обмен ;меняем местами элементы xchg ah, array[di] ;ah=array[di], array[di]=ah=array[si] mov array[si], ah ;array[si]=ah=array[di] ;по адресу arr ay[si] и в ah новый минимальный InternalNext: inc di ;на следующий последующий loop SearchMinLoop ;по всем последющим элементам pop cx ;восстановим счетчик сравнений ExternalNext: inc si ;на следующий текущий loop SortLoop ;по всем текущим элементам
result: ;массив отсортирован lea dx, sSorted ;выводимая строка перед массивом call print ;выведем
lea dx, press mov ah, 9 int 21h ;press any key
mov ah, 8 int 21h ;подождем нажатия на клавишу, чтобы окно сразу не уходило :)
mov ax, 4c00h int 21h ;выход в ДОС
print proc ;вывод массива чисел 0-9 на экран mov ah, 9 int 21h ;выведем строку, адрес которой в dx lea si, array ;адрес массива mov cx, len ;число элементов jcxz PrintRet ;если ничего не было введено, то нечего и выводить mov ah, 2 ;функция вывода символа PrintLoop: mov dl, [si] ;очередной байт or dl, '0' ;делаем символ inc si ;на следущий байт int 21h ;выводим loop PrintLoop ;по всем байтам PrintRet: ret print endp
;проверка деления на 3, при этом должно быть bl=3 ;результат в флаге FZ: установлен - делится нацело div3 proc push ax ;сохраним и al и ah в стеке mov ah, 0 ;подготовимся к делению div bl ;ax:bl cmp ah, 0 ;ah - остаток от деления = 0 -> разделилось нацело pop ax ;восстановим al и ah ret div3 endp
end start ----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 16.01.2011, 02:18 Номер ответа: 265437 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 265437 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий