Новичок
Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.3.2010
Репутация: нет Всего: нет
|
Надо найти число слов в строке, в которых встречается зажанный символ. Строка и символ вводятся с клавиатуры. Обязательно использовать стандартные функции для работы со строками. Вот эта задача, только без стандартных функций. Код | .MODEL small .STACK 100h .DATA mInfo DB 'Count words with letter.',10,13,\ 'Enter string:',10,13,'$' mCh DB 10,13,'Enter letter:$' Sym DB ? ;буква для поиска mRes DB 10,13,'Number of words:',10,13,'$' Buf DB 255, 0, 256 DUP (0) ;буфер для ввода строки flag db 0 ;для отслеживания слов 0 не нашли слово, 1 нашли слово outbuf db 5 dup(0),"$" ;буфер для вывода для числа
.CODE main PROC mov ax,@data ;копируем адрес mov ds,ax ;сегмента данных
mov ah,09h ;функция вывода строки DOS mov dx,offset mInfo ;заголоввок программы int 21h
mov dx,offset Buf ;считываем строку с клавиатуры mov ah,0Ah ;функция ввода строки DOS int 21h mov ah,09h ; функция вывода строки DOS mov dx,offset mCh int 21h
mov ax,0c01h ;ввод с очисткой ;al=01h-ввод с клавиатуры int 21h mov Sym,al ;сохранить введенный символ
mov ah,09h mov dx,offset mRes ;строка для вывода, заголовок ввода для буквы int 21h
xor ax,ax ;счетчик слов с буквой xor cx,cx mov cl,[Buf+1] ;количество введеных символов test cl,cl ;если считано 0 байт, то выход из программы jz Result mov si,offset Buf+1 ;адрес строки со словами-1 mov di,1 ;для изменения количества слов Cycle: inc si ;перейти к символу строки mov dl,[si] ;считать символ cmp dl,' ' ;сравнить с пробелом jne NoSpace ;если не пробел, то проветь находимся в начале слова или внутри слова mov di,1 ;усановить инкремент, для подсчета количества слов loop Cycle ;если в строке еще есть символы, то продолжить цикл jmp Result ;вывести результат NoSpace: cmp dl,Sym ;проверить буква в слове = введенной букве jnz NotEqu ;нет add ax,di ;увеличить количество слов с буквой mov di,0 ;обнулить инкремент NotEqu: loop Cycle ;продолжить цикл
;если строка закончилась вывести результат Result: call WriteWord ;вывести кол-во слов на экран
mov ax,0700h ; консольный ввод без эха int 21h
mov ax,4C00h ;выход int 21h ;Вывод числа, размер числа слово, параметр в ax WriteWord proc push ax bx dx si ; поместить используемые регистры в стек mov si, offset outbuf[5]; адрес буфера для вывода mov bx, 10 ; коэффициент для деления make_str: xor dx,dx div bx ; dx:ax/bx or dx,0030h ; преобразовать цифру в символ dec si ; перейти к следующему символу mov [si],dl ; сохранить в строке test ax, ax ; проверить ax=0 jnz make_str ; если не равен, то далее mov ax, 0900h ; вывести число mov dx, si ; адрес строки вывода int 21h pop si dx bx ax ; извлечь используемые регистры из стека ret ;возврат из процедуры WriteWord endp
main ENDP END main ;точка входа
|
Помогите, плиз. Это сообщение отредактировал(а) Chien - 9.4.2010, 18:46
|