Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры) - Assembler
Формулировка задачи:
Помогите пожалуйста, не работал еще с вводом с клавиатуры, нужно организовать ввод str1 с клавиатуры, а не задавать в коде
Листинг программы
- .model small
- .stack 100h
- .data
- cseg segment
- assume cs:cseg, ds:cseg
- org 100h
- start:
- mov ah, 0ah
- lea dx, buffer
- int 21h
- xor ah, ah
- int 16h
- ret
- buffer db 100
- blength db ?
- _str:
- cseg ends
- str1 db ' slova s 4cyframi udalit 3dsq ww ',0ah,0dh; исх. строка
- n=$-str1
- str2 db n dup('$') ; рез. строка
- m dw 0 ; длина слова
- poz dw 0 ; указатель позиции первого символа в слове
- ;n dw 12 ; длина строки
- flag db 0;содержание цифры в слове
- .code
- mov ax,@data
- mov ds,ax
- mov es,ax
- cld;считываем слева направо
- mov si,offset blength
- mov di,offset str2
- mov poz,si
- mov cx,n
- cycle1:
- lodsb;загружаем si-символ
- cmp flag,1;содержится ли цифра в слове ?
- je no_figure ; если да, то пропускаем блок проверки слова на цифры
- cmp al,'0' ; иначе сравниваем с "0"
- jb no_figure ; если меньше "0", то переход
- cmp al,'9'; иначе сравниваем с "9"
- ja no_figure ; если больше, то переход
- mov flag,1 ; иначе символ принадлежит промежетку от 0 до 9
- no_figure:
- cmp al,' ';сравниваем с пробелом
- jne finish_cycle1 ; если не равно, то переход
- mov bx,n ; в bx помещаем длину строки
- sub bx,cx; вычисляем позицию пробела
- cmp flag,1;содержится ли цифра в слове ?
- je m2 ; если да, то не копируем слово
- mov ax,bx ; вычисляем
- sub ax,poz ; длину
- mov m,ax ; копируемого
- inc m ; слова
- push cx ; сохраняем в стек позицию, на которой остановились
- mov cx,m ; помещаем число копируемых знаков
- mov si,poz; помещаем позицию первого символа слова
- rep movsb ; копируем
- pop cx ; восстанавливаем состояние до копирования
- m2:
- mov flag,0 ;
- mov poz,bx ; присваиваем позицию пробела
- inc poz ; теперь указывает на первый символ слова
- finish_cycle1:
- loop cycle1 ; цикл
- lea dx,blength
- mov ah,9
- int 21h
- exit:
- mov ax,4c00h
- int 21h
- end start
Решение задачи: «Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры)»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- cseg segment
- assume cs:cseg, ds:cseg
- org 100h
- start:
- mov ah, 0ah
- lea dx, buffer
- int 21h
- xor ah, ah
- int 16h
- ret
- buffer db 100
- blength db ?
- _str:
- cseg ends
- str1 db ' slova s 4cyframi udalit 3dsq ww ',0ah,0dh; исх. строка
- n=$-str1
- str2 db n dup('$') ; рез. строка
- m dw 0 ; длина слова
- poz dw 0 ; указатель позиции первого символа в слове
- ;n dw 12 ; длина строки
- flag db 0;содержание цифры в слове
- .code
- mov ax,@data
- mov ds,ax
- mov es,ax
- cld;считываем слева направо
- mov si,offset blength
- mov di,offset str2
- mov poz,si
- mov cx,n
- cycle1:
- lodsb;загружаем si-символ
- cmp flag,1;содержится ли цифра в слове ?
- je no_figure ; если да, то пропускаем блок проверки слова на цифры
- cmp al,'0' ; иначе сравниваем с "0"
- jb no_figure ; если меньше "0", то переход
- cmp al,'9'; иначе сравниваем с "9"
- ja no_figure ; если больше, то переход
- mov flag,1 ; иначе символ принадлежит промежетку от 0 до 9
- no_figure:
- cmp al,' ';сравниваем с пробелом
- jne finish_cycle1 ; если не равно, то переход
- mov bx,n ; в bx помещаем длину строки
- sub bx,cx; вычисляем позицию пробела
- cmp flag,1;содержится ли цифра в слове ?
- je m2 ; если да, то не копируем слово
- mov ax,bx ; вычисляем
- sub ax,poz ; длину
- mov m,ax ; копируемого
- inc m ; слова
- push cx ; сохраняем в стек позицию, на которой остановились
- mov cx,m ; помещаем число копируемых знаков
- mov si,poz; помещаем позицию первого символа слова
- rep movsb ; копируем
- pop cx ; восстанавливаем состояние до копирования
- m2:
- mov flag,0 ;
- mov poz,bx ; присваиваем позицию пробела
- inc poz ; теперь указывает на первый символ слова
- finish_cycle1:
- loop cycle1 ; цикл
- lea dx,blength
- mov ah,9
- int 21h
- exit:
- mov ax,4c00h
- int 21h
- end start
Объяснение кода листинга программы
- Создается сегмент данных и кода с размером стека 100h и объявляются переменные
- Инициализируется строка
str1
и создается переменнаяn
с ее длиной - Создается массив
str2
с размеромn
и инициализируется переменныеm
,poz
иflag
- Выполняется копирование данных из буфера ввода в переменную
buffer
- Цикл проходит через каждый символ строки
str1
и проверяет наличие цифры - Если цифра найдена, программа пропускает проверку наличия цифры в слове и переходит к следующему символу
- Если символ - пробел, программа определяет длину слова и копирует его в переменную
str2
если в слове не было цифры - Программа завершается выводом результата на экран и выходом со статусом 4c00h.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д