Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1476 | Дата выхода: | 26.09.2011, 08:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 200 / 62 | Вопросов / ответов: | 1 / 1 | Консультация # 184063: Здравствуйте! Прошу помощи в следующем вопросе: Требуется написать программку на TASM для Win Xp для процессора Intel Core 2 Solo U3500, которая редактирует заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с чет-ными номерами. (Пример: How do you do -> od od) Огромное спасибо!... Консультация # 184063: Здравствуйте! Прошу помощи в следующем вопросе: Требуется написать программку на TASM для Win Xp для процессора Intel Core 2 Solo U3500, которая редактирует заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с чет-ными номерами. (Пример: How do you do -> od od)
Огромное спасибо! Дата отправки: 20.09.2011, 21:37 Вопрос задал: Юдин Евгений Сергеевич (8-й класс) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Юдин Евгений Сергеевич! Хочу предложить такой вариант решения задачи: 1) Для хранения символов четного переворачиваемого слова используется стек. 2) Учитываются разные разделители и разное их количество. Все разделители заменяются одним пробелом.
Код : ;Программа редактирует заданное предложение, ;удаляя из него все слова с нечетными номерами ;и переворачивая слова с четными номерами. ;(Пример: How do you do -> od od) ;tasm str.asm ;tlink str /t ;-------------- .model tiny .data prompt db 'Enter string: $' result db 0ah,'Result: $' anykey db 0dh,0ah,'Press any key$' Separators db 9,' ,.:;' ;Строка разделителей SeparatorsCount equ $-Separators ;длина строки разделителей buffer label byte ;буфер для ф-и 0ah max db 128 ;максим размер len db 0 ;реальная длина string db 128 dup (?) ;сам буфер .code .startup lea dx, prompt ;подсказка для ввода строки mov ah, 9 int 21h lea dx, buffer mov ah, 0ah ;вводим строку int 21h lea si, string ;адрес введенной строки call Make ;обрабатываем print: ;выводим результат lea dx, result ;Result: mov ah, 9 int 21h lea dx, string ;обработанная строка int 21h ;ah = 9 lea dx, anykey ;Press any key mov ah, 9 int 21h mov ah, 0 ;Ждем any key int 16h mov ax, 4c00h int 21h Make proc ;обработка строки mov di, si ;результат будет на том же месте xor cx, cx ;счетчик букв переворачиваемых слов sep1: ;цикл пропуска предворяющих разделителей lodsb ;очередной символ cmp al, 0dh ;конец строки? je finish call CmpSeparator ;разделитель? je sep1 ;да - ищем не разделитель skip: ;цикл пропуска нечетных слов lodsb ;очередной символ cmp al, 0dh ;конец строки? je finish call CmpSeparator ;разделитель? jne skip ;нет - ищем разделитель, конец слова sep2: ;цикл пропуска разделителей между нечетным и четным словом lodsb ;очередной символ cmp al, 0dh ;конец строки? je finish call CmpSeparator ;разделитель? je sep2 ;да - ищем не разделитель reversal: ;цикл сохранения в стеке символов четного слова push ax ;сохраним в стеке символ в al inc cx ;считаем lodsb ;очередной символ cmp al, 0dh ;конец строки? je reversal_finish ;подправим индекс для последнего четного слова call CmpSeparator ;разделитель? jne reversal ;нет - сохраняем символ reversal_save: ;цикл вывода четного слова в обратном порядке pop ax ;извлекаем из стека stosb ;сохраняем loop reversal_save ;по всем символам слова mov al, ' ' ;отделяем одним пробелом stosb jmp sep1 ;на пропуск разделителей перед нечетным словом reversal_finish: ;для четного слова подправим указатель, dec si ;чтобы потом опять прочитать 0dh и уйти на finish jmp reversal_save ;на вывод слова finish: ;закрываем строку знаком '$' cmp di, offset string ;но сначала уберем последний пробел je set_dollar ;при этом для пустой строки обходим! dec di ;перед последним пробелом set_dollar: mov byte ptr [di], '$' ;для ф-и 9 прерывания 21h ret Make endp CmpSeparator proc ;проверка на разделители push di ;сохраним используемые регистры push cx lea di, Separators ;строка разделителей mov cx, SeparatorsCount ;длина repne scasb ;ищем, результата во флаге FZ pop cx pop di ret CmpSeparator endp end
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий