powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите c программой на ассемблере
2 сообщений из 2, страница 1 из 1
Помогите c программой на ассемблере
    #37755021
Timur111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
принцип работы программы, приглашает ввести текст мы вводим и потом программа считает сколько слов у нас было введено. Надо сделать что б это программа считала сколько букв (символ) мы ввели прошу помогите!!!

model tiny
.data

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

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


string db 128 dup (?) ; сама строка (сегмент data? идет следом за data)
sSepar db 64 dup (?) ; здесь сохраним разделители

.code
.startup

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

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


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

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

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

separ_found: ; найден разделитель
cmp bh, 0 ; было ли перед этим слово
je cmp_separ ; если не было, то на обработку разделителя
mov bh, 0 ; сбросим флаг слова
inc bl ; увеличим счетчик слов
cmp_separ: ; проверим, был ли такой раньше
mov cx, dx ; счетчик найденных разделителей
lea di, sSepar ; строка найденных разделителей
jcxz set_separ ; если еще не было, то сразу запоминем
repne scasb ; ищем
je next ; если нашли, то на чтение следующего символа
; иначе, di указывает на конец строки
set_separ:
stosb ; запоминаем в конце строки
inc dx ; и увеличиваем счетчик
next:
jmp main_loop ; на основной цикл

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

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


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


push dx ; сохраним счетчик разделителей
lea dx, sWCnt
mov ah, 9
int 21h ; выведем число слов

lea dx, sSep
mov ah, 9
int 21h ; разделители

mov al,'"'
int 29h ; в кавычках (чтобы было видно пробел)
lea si, sSepar ; адрес стоки
pop cx ; число разделителей (бывший dx)
pr_separ_loop:
lodsb
int 29h
loop pr_separ_loop

mov al,'"'
int 29h

lea dx, sPress
mov ah, 9
int 21h

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

mov ax, 4c00h
int 21h

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
...
Рейтинг: 0 / 0
Помогите c программой на ассемблере
    #37762726
Odin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуглим функцию 0аh 21 прерывания и видим, что...Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. последний символ в буфере - всегда CR (который не засчитан в байте длины)...
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите c программой на ассемблере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]