Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2594
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2164
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1328
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1396
Дата выхода:11.12.2010, 17:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:223 / 66
Вопросов / ответов:1 / 1

Вопрос № 181127: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в решении следующей задачи: Разработать подпрограмму, которая подсчитывает, сколько раз за- данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и чи...



Вопрос № 181127:

Здравствуйте, уважаемые эксперты! Прошу Вас помочь в решении следующей задачи:
Разработать подпрограмму, которая подсчитывает, сколько раз за-
данный символ встречается в строке. Разработать программу, которая
вводит с клавиатуры строку и число N и выдаёт список символов, которые
встречаются в строке не менее N раз.

Для решения использовать Tasm, операционная система ДОС, формат ЕХЕ. По возможности приложите к решению блок-схему. Задача взята из Программирование на Ассемблере для персональных компьютеров: учебно-методическое пособие (стр. 59, вар. 8).
Спасибо

Отправлен: 06.12.2010, 17:11
Вопрос задал: Ivan Afonin (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Ivan Afonin!
Вот и программа.
Единственный момент, на который хочу обратить внимание:
Подпрограмма analize, которая считает вхождения символа в строке,
портит строку - прописывает на всех последующих местах, где находит данный
символ, ноль. Это сделано с целью избежать повторного анализа данного символа.
181127-block-sch.doc (41.0 кб)
Код:
;Разработать подпрограмму, которая подсчитывает, сколько раз за-
;данный символ встречается в строке. Разработать программу, которая
;вводит с клавиатуры строку и число N и выдаёт список символов, которые
;встречаются в строке не менее N ра з.

data segment para public 'data'
sNum db 'Enter N: $'
sString db 0ah,'Enter string: $'
sResult db 0ah,'Symbols: $'

;буфер для ввода числовой строки (для функции 0ah)
bNum db ? ;максимальный размер буфера
bCount db ? ;реальный размер строки
sBuf db 80 dup (?) ;сама строка
N dw ? ;"водораздел" количества символов
data ends

assume cs:code, ds:data, es:data
code segment para public 'code'
start:
mov ax, data
mov ds, ax
mov es, ax ;пусть es=ds=data

lea dx, sNum
mov ah, 9
int 21h ;ждем число N

mov bNum, 80 ;задаем максимальное значение строки
lea dx, bNum
mov ah, 0ah
int 21h ;вводим числовую строку

lea si, sBuf ;строка
call stoi ;преобразовываем в число
mov N, ax ;сохраним

lea dx, sString
mov ah, 9
int 21h ;ждем строку

lea dx, bNum
mov ah, 0ah
int 21h ;вводим строку

l ea dx, sResult
mov ah, 9
int 21h ;выведем сообщение о результате

;формируем результат
lea si, sBuf ;адрес строки
xor cx, cx
mov cl, bCount ;длика строки
mov dx, cx ;сохраним для дальнейшего использования
AnalizeLoop: ;по всем символам строки
lodsb ;читаем al=ds:[si], si=si+1
cmp al, 0 ;0 помечается обработанный символ
je AnalizeNext ;обходим
call Analize ;считаем
cmp ax, N ;сравниваем с N
jc AnalizeNext ;если меньше, то обходим
mov al, [si-1] ;читаем заново символ
int 29h ;выводим
AnalizeNext:
loop AnalizeLoop ;по всем

mov ah, 0
int 16h ;ждем нажатия на клавишу

mov ax, 4c00h
int 21h ;выход в ДОС

Analize proc ;считаем вхожения символа в al в строку sBuf
push cx ;сохраним счетчик прохождения по строке
lea di, sBuf ;адрес строки
mov cx, dx ;длина
xor bx, bx ;счетчик
AnLoop:
scasb ;сравниваем al с es:[di], di=di+1
jne AnNext ;не р авно - на следующий
test bx, bx ;проверим - первый найденный?
jz IncCnt ;если первый, то на инкремент количества
mov byte ptr [di-1], 0 ;все последующие обнуляем, чтобы не повторяться
IncCnt:
inc bx ;считаем
AnNext:
loop AnLoop
mov ax, bx ;найденное количество
pop cx
ret
Analize endp

stoi proc ;преобразование строки [si] в число AX
xor bx, bx ;здесь будем стоить число
xor cx, cx ;счетчик разрядов
stoi_next:
lodsb ;очередной символ
cmp al, 0dh ;конец стоки?
je stoi_eol
cmp al, '0'
jb stoi_sep ;любая нецифра - разделитель
cmp al, '9'
ja stoi_sep
push ax ;сохраним новый разряд
mov ax, 10
mul bx ;умножим старшие на 10
pop dx ;новый
and dx, 0fh ;'0'-'9' -> 0-9
add ax, dx ;добавляем новый разряд
mov bx, ax ;сохраняем
inc cx ;считаем
jmp stoi_next ;продолжаем
stoi_sep: ;встретили разделитель
jcxz sto i_next ;были только разделители - на продолжение
; иначе - конец числа и выходим
stoi_eol: ; если числа нет и встретили 0dh - конец строки
mov ax, bx ;число возвращаем в ax
ret
stoi endp

code ends
end start

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 07.12.2010, 03:25
Номер ответа: 264558
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5
Комментарий к оценке:
Все замечательно! :)

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264558 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.24 от 30.11.2010

    В избранное