Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры) - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д