Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2014, 04:06   #1
Eamirus
 
Регистрация: 29.12.2013
Сообщений: 4
Восклицание Посчитать количество слов в строке

Получается, я написал программу для подсчета количества пробелов, но препод не захотел принимать, и сказал что её нужно немного доделать для того чтобы она не считала лишние пробелы.
Код:
data          SEGMENT  
 str1   db      30 dup (?)                              
 cout   db      13,"Vvedite stroku: ",'$'
 cout1  db      13,10,"Reg: ",'$'
 cout2  db      13,10,"Stack: ",'$'
 rez    dw      0
 len    dw      0
         
data          ENDS
 
code          SEGMENT
              ASSUME   cs:code,ds:data
               
begin:
        mov     ax,data
        mov     ds,ax
        mov     es,ax
        ;приглашение на ввод строки
        mov     dx,offset cout
        call    WrStr
 
        ;ввод строки
        mov     ah,3fh
        lea     dx,str1
        mov     cx,30
        mov     bx,0    
        int  21h
        ;введенная строка находится в ах
 
        sub     ax,2 ;считаем длину нашей строки без символа возврата каретки и перевода строки
        mov     len,ax
 
        call Count
 
        mov     dx,offset cout1
        call    WrStr
        mov ax,rez
        call OutInt
        mov     dx,offset cout2
        call    WrStr       
        pop ax
        call OutInt
 
        ;ожидание нажатия любой клавиши и выход 
        mov ah, 01h
        int 21h
        mov ah, 4ch
        int 21h
 
Count proc near ; процедура подсчета слов в строке
        mov     cx,len ;записываем сколько раз повторить команду rep
        xor     ax,ax
        cld
        mov     al,' ' ;символ для сравнивания        
        lea     di,str1 ;указатель на строку для обработки
m1:     repne   scasb   ; повторяем для каждого символа
        jne     return
        inc     rez      ; увеличиваем счетчик слов
        jmp m1
return: inc rez  ; подразумевается что после последнего слова нет пробела
        pop ax
        push rez
        push ax
        ret 
Count endp
WrStr  proc near  ;процедура вывода строки на экран  
    mov   ah,09h                
    int   21h 
    ret                            
WrStr  endp
OutInt proc near ; процедура вывода результат на экран
    aam 
    add ax,3030h 
    mov dl,ah 
    mov dh,al 
    mov ah,02 
    int 21h 
    mov dl,dh 
    int 21h 
    ret
OutInt endp
code          ENDS
              end      begin
Подскажите, пожалуйста!
Eamirus вне форума Ответить с цитированием
Старый 16.01.2014, 09:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так устроит?!
Код:
Count proc near ; процедура подсчета слов в строке
        mov     cx,len ;записываем сколько раз повторить команду rep
        cmp     cx,0
        je  exproc
        xor     ax,ax
        cld
        mov     al,' ' ;символ для сравнивания        
        lea     di,str1 ;указатель на строку для обработки
m1:     repne   scasb   ; повторяем для каждого символа
        jne     return
        cmp byte ptr es:[di],' '
        je  m1
        inc     rez      ; увеличиваем счетчик слов
        jmp m1
return: inc rez  ; подразумевается что после последнего слова нет пробела
exproc: pop ax
        push rez
        push ax
        ret 
Count endp
p.s. пара замечаний.
1) начальные и концевые пробелы по прежнему не обрабатываются!
можно дописать, если это надо

2) зачем такие хитрые манипуляции с передачей значения rez через стек?!!
Строго говоря, это некрасиво и не принято. Ваша процедура count оставляет значение в стеке... Зачем?!!! :-]]
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.01.2014, 15:15   #3
Eamirus
 
Регистрация: 29.12.2013
Сообщений: 4
По умолчанию

Такое мне дали задание в универе, написать вывод через регистры и стек.
А начальные и концевые пробелы было бы неплохо написать, пожалуйста.
Eamirus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
посчитать количество всех слов,слов-маркеров и процент слов-маркеров ksenya91 Помощь студентам 9 09.01.2013 07:00
С++ 2)Посчитать количество слов, не содержащих цифр. mmf_Valya Помощь студентам 4 07.12.2012 21:24
cb посчитать в строке количество непарных слов gylayko Помощь студентам 5 10.04.2012 02:36
Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести рез-ть на экра Газимов Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.03.2012 15:58
Посчитать количество слов OPEJI Паскаль, Turbo Pascal, PascalABC.NET 5 19.05.2011 17:58