Консультация № 184121
30.09.2011, 19:48
65.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:помогите написать программу "определения количества слов в строке введенной с клавиатуры и вывести сообщение о полученном результате в символьной форме".Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
Очень надеюсь, что Вы мне поможете.

Обсуждение

давно
Посетитель
7438
7205
30.09.2011, 20:17
общий
это ответ
Здравствуйте, Дмитрий!
Вот Вам программа, решающая Вашу задачу.
Программа считает словами последовательности из цифр, английских (больших и малых),
кириллицы (больших и малых, и с учетом дополнительных буковок украинского и белорусского алфавита)
Все остальное считается разделителями.

Будут вопросы - милости просим в мини-форум.

[code h=207] .model small

.stack 100h

.data

sEnter db 'Enter string: $'
sWCnt db 0ah,'Words count = '
sNum db 8 dup (0) ;сюда запишем число слов
sPress db 0ah,'Press any key$'

buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah)
max db 128 ; максимальная длина строки
len db 0 ; реальная длина введенной строки
string db 128 dup (?) ; сама строка

.code
main proc
mov ax, @DATA ;настроим сегментные регистры
mov ds, ax ;на сегмент данных
mov es, ax

lea dx, sEnter
mov ah, 9
int 21h ; приглашение ввести строку

lea dx, buf
mov ah, 0ah
int 21h ; вводим строку

xor bx, bx ; bh - флаг наличия слова, bl - число слов
lea si, string ; сама строка
main_loop: ; основной цикл
lodsb ; очередной символ
cmp al, 0dh ; конец строки ?
je print_result ; на конец обработки

cmp al, '0' ; цифры ?
jb separ_found ; меньше - разделитель
cmp al, '9'
jbe word_found ; часть слова

cmp al, 'A' ; большие латинские ?
jb separ_found ; меньше - разделитель
cmp al, 'Z'
jbe word_found ; часть слова

cmp al, 'a' ; малые латинские ?
jb separ_found ; меньше - разделитель
cmp al, 'z'
jbe word_found ; часть слова

cmp al, 80h ; кириллица А-п
jb separ_found ; меньше - разделитель
cmp al, 0afh
jbe word_found ; часть слова

cmp al, 0e0h ; кириллица р-я,Ё,ё,украинские,белорусские буковки
jb separ_found ; меньше - разделитель
cmp al, 0f7h
jbe word_found ; часть слова

separ_found: ; найден разделитель
cmp bh, 0 ; было ли перед этим слово
je main_loop ; повтор разделителей
mov bh, 0 ; сбросим флаг слова
inc bl ; увеличим счетчик слов
jmp main_loop ; на основной цикл

word_found: ; слово
mov bh, 1 ; установим флаг
jmp main_loop ; на чтение очередного символа

print_result: ; встретили конец строки
add bl, bh ; посчитаем самое последнее слово (если оно есть)

;преобразуем число слов в строку
mov al, bl ; число слов
lea di, sNum ; адрес строки
call itoa ; преобразуем

lea dx, sWCnt
mov ah, 9
int 21h ; выведем число слов

lea dx, sPress
mov ah, 9
int 21h

mov ah, 0
int 16h ; чтобы сразу не убегало с экрана

mov ax, 4c00h
int 21h
main endp

itoa proc ; преобразование числа из al в строку
xor cx, cx ; счетчик цифр
mov bl, 10 ; будем делить на 10
div_loop:
mov ah, 0 ; сбросим предыдущий остаток
div bl ; делим ax/bl
push ax ; сохраним остаток ah в стеке
inc cx ; посчитаем
cmp al, 0 ; делим, пока al не 0
jnz div_loop
pr_loop: ; цикл вывода
pop ax ; восстановим из стека очередную цифру
mov al, ah ; в al
or al, '0' ; сделаем из числа символ
stosb ; запишем по адресу [di++]
loop pr_loop
mov ax, 0a0dh ; перевод строки
stosw
mov al, '$' ; для 9 функции
stosb
ret
itoa endp
end main

[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа