Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры) - 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

Объяснение кода листинга программы

  1. Создается сегмент данных и кода с размером стека 100h и объявляются переменные
  2. Инициализируется строка str1 и создается переменная n с ее длиной
  3. Создается массив str2 с размером n и инициализируется переменные m, poz и flag
  4. Выполняется копирование данных из буфера ввода в переменную buffer
  5. Цикл проходит через каждый символ строки str1 и проверяет наличие цифры
  6. Если цифра найдена, программа пропускает проверку наличия цифры в слове и переходит к следующему символу
  7. Если символ - пробел, программа определяет длину слова и копирует его в переменную str2 если в слове не было цифры
  8. Программа завершается выводом результата на экран и выходом со статусом 4c00h.

Оцени полезность:

10   голосов , оценка 3.5 из 5
Похожие ответы