Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler]Кол-во слов с заданным символом, надо переделать задачу 
:(
    Опции темы
Chien
Дата 9.4.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1068 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.