РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты в разделе Номер выпуска: | 1614 | Дата выхода: | 28.05.2016, 20:51 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 23 / 8 | Вопросов / ответов: | 1 / 1 | Консультация # 189436: Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e: Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в ... Консультация # 189436: Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e:
Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в строке не менее N раз."
Использование в emu8086 - assembler and microprocessor emulator 0.03 Желательно, делать комментарии к строкам.
Дата отправки: 18.05.2016, 20:34 Вопрос задал: haustow_2012 (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, haustow_2012! Вот Вам программа
;Разработать подпрограмму, которая подсчитывает, ;сколько раз заданный символ встречается в строке. ;Разработать программу, которая вводит с клавиатуры ;строку и число N и выдаёт список символов, ;которые встречаются в строке не менее N раз data segment sEnterString db 0ah,"Enter string: $" sEnterSymbol db 0ah,"Enter symbol: $" sEnterNumber db 0ah,"Enter number: $" sResult db 0ah,"Result: $" ;для ввода строки max db 128 ;максимальный размер len db 0 ;реальная длина строки string db 128 dup(0) ;сама строка, в конце 0dh N db 0 ;вводимое число data ends _stack segment stack 'stack' dw 128 dup(?) ;стек _stack ends assume cs:code, ds:data, ss:_stack code segment start: mov ax, data mov ds, ax ;настроим сегмент данных call GetNumber ;вводим число < 256 mov N, al ;сохраним call GetString ;вводим строку call PrintCounts ;считаем символы и выводим mov al, 0dh ;перевод строки int 29h mov al, 0ah int 29h mov ah, 0 ;ждем нажатие на клавишу int 16h mov ax, 4c00h ;выход int 21h GetNumber: ;вводим число < 256 lea dx, sEnterNumber mov ah, 9 int 21h ;приглашение lea dx, max mov ah, 0ah int 21h ;вводим строку mov bx, 10 ;bl = 10 - основание с.с., ;bh = 0 - наше число lea si, string ;введенная числовая строка GetNumber_loop: lodsb ;очередной символ cmp al, 0dh ;в конце 0dh je GetNumber_ret sub al, '0' ;превратим символ в число cmp al, 9 ja GetNumber ;если не цифр, то на повтор ввода! xchg al, bh ;al = старшие разряды, bh = новый разряд mul bl ;ax = al * 10 cmp ah, 0 ;больше 255? jne GetNumber ;на повтор ввода add bh, al ;bh - новое значение числа jc GetNumber ;> 255 - на повтор ввода jmp GetNumber_loop ;продолжаем GetNumber_ret: mov al, bh ;вернем число в al ret GetString: ;ввод строки lea dx, sEnterString mov ah, 9 int 21h lea dx, max mov ah, 0ah int 21h ret SearchSymbol: ;поиск вхождения в строке string символа al lea di, string ;адрес строки mov ah, 0 ;счетчик SearchSymbol_loop: cmp byte ptr [di], 0dh ;конец строки? je SearchSymbol_ret cmp al, [di] ;сравниваем jne SearchSymbol_next inc ah ;считаем одинаковые mov byte ptr [di], 0 ;обнулим встреченные! ;чтобы не искать еще раз! SearchSymbol_next: inc di ;на следующий адрес jmp SearchSymbol_loop SearchSymbol_ret: ret PrintCounts: ;поиск и вывод найденных символов lea dx, sResult ;выведем сообщение mov ah, 9 int 21h lea si, string ;адрес строки PrintCounts_loop: lodsb ;очередной символ cmp al, 0dh ;конец строки? je PrintCounts_ret cmp al, 0 ;0 пропускаем je PrintCounts_loop call SearchSymbol ;считаем cmp ah, N ;сравним с числом N jb PrintCounts_loop int 29h ;выведем, если >= N jmp PrintCounts_loop PrintCounts_ret: ret code ends end start
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий