Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1512 | Дата выхода: | 18.04.2012, 17:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 99 / 40 | Вопросов / ответов: | 1 / 1 | Консультация # 185830: Здравствуйте, уважаемые эксперты! Прошу вас написать программу вот с таким заданием: Программа просит ввести строку. Подсчитать количество слов в строке (слова разделены пробелом). При обработке использовать только команды работы со строками. Обработку оформить в виде процедуры. Результат вывести на экран и записать в файл. Сделать на... Консультация # 185830: Здравствуйте, уважаемые эксперты! Прошу вас написать программу вот с таким заданием:
Программа просит ввести строку. Подсчитать количество слов в строке (слова разделены пробелом). При обработке использовать только команды работы со строками. Обработку оформить в виде процедуры. Результат вывести на экран и записать в файл.
Сделать надо как можно проще
п.с. Ассемблер : TASM Написать к каждой строчке комментарии
Заранее спасибо. Дата отправки: 15.04.2012, 17:01 Вопрос задал: Yankov Dmitry (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Yankov Dmitry! Надеюсь, комментариев будет достаточно... Если что, спрашивайте...
Код : ;Программа просит ввести строку. ;Подсчитать количество слов в строке (слова разделены пробелом). ;При обработке использовать только команды работы со строками. ;Обработку оформить в виде процедуры. ;Результат вывести на экран и записать в файл. .model small .data sEnter db 'Enter string: ',0 ;строка приглашения для ввода строки sAny db 13,10,'Press any key',0 ;строка приглашения нажать в конце на клавишу sName db 'count.txt',0 ;имя файла ;ошибки sOpenError db 13,10,'Open error',0 sWriteError db 13,10,'Write error',0 sWords db 13,10,'Words count = ' ;сообщение о числе слов sCount db 8 dup (0) ;здесь будет число - количество слов ;буфер для ввода строки для функции 0ah buf db 80 ;максимальный размер len db 0 ;здесь будет реальная длина введенной строки string db 80 dup (0) ;сама строка .code start: mov ax, @data mov ds, ax mov es, ax lea si, sEnter call PrintString ;выведем строку приглашения ввода lea dx, buf mov ah, 0ah int 21h ;вводим строку lea si, string call CalcWords ;считаем слова в AX lea di, sCount call IntToString ;преобразуем число AX в строку es:[di] lea si, sWords call PrintString ;выводим сообщение о числе слов lea si, sWords+2 ;+2, чтобы обойти 0d0a call WriteToFile ;и в файл lea si, sAny call PrintString ;press any key mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h PrintString proc ;вывод строки ds:[si], заканчивающейся нулем mov ah, 2 ;ф-я вывода символа из dl PrintStringLoop: lodsb ;очередной cmp al, 0 ;0? je PrintStringRet ;да - на выход mov dl, al ;нет - выводим на экран int 21h jmp PrintStringLoop PrintStringRet: ret PrintString endp CalcWords proc ;считаем слова в строке ds:[si], заканчивающейся 0dh xor dx, dx ;число слов CalcWordsStartWord: xor cx, cx ;признак наличия слова CalcWordsLoop: lodsb ;очередной cmp al, 0dh ;по 0dh je CalcWordsLast ;на проверку последнего слова cmp al, ' ' ;если не пробел jne CalcWordsNotSpace ;то на очередной символ слова jcxz CalcWordsLoop ;повторные пробелы игнорируем inc dx ;считаем слова по первому пробелу после каждого слова! jmp CalcWordsStartWord ;на сброс признака наличия слова CalcWordsNotSpace: inc cx ;не пробел - делаем признак слова ненулем! jmp CalcWordsLoop CalcWordsLast: ;проверим на последнее слово jcxz CalcWordsRet ;=0, когда после пробела, т.е. слов нет inc dx ;!=0, значит было слово, учтем его CalcWordsRet: mov ax, dx ;результат в ax ret CalcWords endp IntToString proc ;преобразование числа AX в строку es:[di] xor cx, cx ;счетчик цифр mov bx, 10 ;будем делить на 10 IntToStringLoop: xor dx, dx ;готовимся к делению div bx ;dx:ax / bx push dx ;остаток - очередную цифру сохраняем в стеке inc cx ;считаем test ax, ax ;циклим, пока частное не нуль jne IntToStringLoop ConvertLoop: ;выведем в обратном порядке pop ax ;очередной разряд or al, 30h ;0-9 -> '0'-'9' stosb ;сохраняем loop ConvertLoop ;по всем цифрам xor ax, ax ;закроем строку нулем stosb ret IntToString endp WriteToFile proc ;вывод в файл строки ds:[si] lea dx, sName ;имя файла xor cx, cx ;атрибут (без атрибутов) mov ah, 3ch ;ф-я создания файла int 21h ;создаем файл jc CreateError ;если ошибка mov bx, ax ;handle файла mov di, si ;найдем длину строки mov al, 0 ;будем искать 0 mov cx, 32 ;длина, большая строки repne scasb ;ищем mov word ptr [di-1], 0a0dh ;добавим конец строки lea cx, [di+1] ;адрес за строкой sub cx, si ;длина строки mov dx, si ;адрес строки ds:[dx] mov ah, 40h ;ф-я вывода в файл int 21h ;пишем jc WriteError ;если ошибка mov ah, 3eh ;закрываем файл int 21h ret CreateError: lea si, sOpenError call PrintString ret WriteError: mov ah, 3eh ;закрываем файл int 21h lea si, sWriteError call PrintString ret WriteToFile endp end start  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 16.04.2012, 02:32 5 нет комментария ----- Дата оценки: 16.04.2012, 12:37 | Рейтинг ответа: 0 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий