Консультация № 189436
18.05.2016, 20:34
0.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, помогите составить программу на на assembler'e:

Требуется: "Разработать подпрограмму, которая подсчитывает, сколько раз за-данный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку и число N и выдаёт список символов, которые встречаются в строке не менее N раз."

Использование в emu8086 - assembler and microprocessor emulator 0.03
Желательно, делать комментарии к строкам.

Обсуждение

давно
Посетитель
7438
7205
28.05.2016, 16:29
общий
это ответ
Здравствуйте, haustow_2012!
Вот Вам программа
[code lang=asm h=200]
;Разработать подпрограмму, которая подсчитывает,
;сколько раз заданный символ встречается в строке.
;Разработать программу, которая вводит с клавиатуры
;строку и число 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
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа