Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры) - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста, не работал еще с вводом с клавиатуры, нужно организовать ввод str1 с клавиатуры, а не задавать в коде
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. cseg segment
  5. assume cs:cseg, ds:cseg
  6. org 100h
  7. start:
  8. mov ah, 0ah
  9. lea dx, buffer
  10. int 21h
  11. xor ah, ah
  12. int 16h
  13. ret
  14. buffer db 100
  15. blength db ?
  16. _str:
  17. cseg ends
  18. str1 db ' slova s 4cyframi udalit 3dsq ww ',0ah,0dh; исх. строка
  19. n=$-str1
  20. str2 db n dup('$') ; рез. строка
  21. m dw 0 ; длина слова
  22. poz dw 0 ; указатель позиции первого символа в слове
  23. ;n dw 12 ; длина строки
  24. flag db 0;содержание цифры в слове
  25. .code
  26. mov ax,@data
  27. mov ds,ax
  28. mov es,ax
  29. cld;считываем слева направо
  30. mov si,offset blength
  31. mov di,offset str2
  32. mov poz,si
  33. mov cx,n
  34. cycle1:
  35. lodsb;загружаем si-символ
  36. cmp flag,1;содержится ли цифра в слове ?
  37. je no_figure ; если да, то пропускаем блок проверки слова на цифры
  38. cmp al,'0' ; иначе сравниваем с "0"
  39. jb no_figure ; если меньше "0", то переход
  40. cmp al,'9'; иначе сравниваем с "9"
  41. ja no_figure ; если больше, то переход
  42. mov flag,1 ; иначе символ принадлежит промежетку от 0 до 9
  43. no_figure:
  44. cmp al,' ';сравниваем с пробелом
  45. jne finish_cycle1 ; если не равно, то переход
  46. mov bx,n ; в bx помещаем длину строки
  47. sub bx,cx; вычисляем позицию пробела
  48. cmp flag,1;содержится ли цифра в слове ?
  49. je m2 ; если да, то не копируем слово
  50. mov ax,bx ; вычисляем
  51. sub ax,poz ; длину
  52. mov m,ax ; копируемого
  53. inc m ; слова
  54. push cx ; сохраняем в стек позицию, на которой остановились
  55. mov cx,m ; помещаем число копируемых знаков
  56. mov si,poz; помещаем позицию первого символа слова
  57. rep movsb ; копируем
  58. pop cx ; восстанавливаем состояние до копирования
  59. m2:
  60. mov flag,0 ;
  61. mov poz,bx ; присваиваем позицию пробела
  62. inc poz ; теперь указывает на первый символ слова
  63. finish_cycle1:
  64. loop cycle1 ; цикл
  65. lea dx,blength
  66. mov ah,9
  67. int 21h
  68. exit:
  69. mov ax,4c00h
  70. int 21h
  71. end start

Решение задачи: «Удалить из заданной строки слова, содержащие хотя бы одну цифру (организовать ввод данных с клавиатуры)»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. cseg segment
  5. assume cs:cseg, ds:cseg
  6. org 100h
  7. start:
  8. mov ah, 0ah
  9. lea dx, buffer
  10. int 21h
  11. xor ah, ah
  12. int 16h
  13. ret
  14. buffer   db       100
  15. blength  db       ?
  16. _str:
  17. cseg ends
  18.  
  19. str1 db ' slova s 4cyframi udalit 3dsq ww ',0ah,0dh; исх. строка
  20. n=$-str1
  21. str2 db n dup('$') ; рез. строка
  22. m dw 0 ; длина слова
  23. poz dw 0 ; указатель позиции первого символа в слове
  24. ;n dw 12 ; длина строки
  25. flag db 0;содержание цифры в слове
  26. .code
  27.  
  28. mov ax,@data
  29. mov ds,ax
  30. mov es,ax
  31. cld;считываем слева направо
  32. mov si,offset blength
  33. mov di,offset str2
  34. mov poz,si
  35. mov cx,n
  36. cycle1:
  37. lodsb;загружаем si-символ
  38. cmp flag,1;содержится ли цифра в слове ?
  39. je no_figure ; если да, то пропускаем блок проверки слова на цифры
  40. cmp al,'0' ; иначе сравниваем с "0"
  41. jb no_figure ; если меньше "0", то переход
  42. cmp al,'9'; иначе сравниваем с "9"
  43. ja no_figure ; если больше, то переход
  44. mov flag,1 ; иначе символ принадлежит промежетку от 0 до 9
  45. no_figure:
  46. cmp al,' ';сравниваем с пробелом
  47. jne finish_cycle1 ; если не равно, то переход
  48. mov bx,n ; в bx  помещаем длину строки
  49. sub bx,cx; вычисляем позицию пробела
  50. cmp flag,1;содержится ли цифра в слове ?
  51. je m2 ; если да, то не копируем слово
  52. mov ax,bx ;  вычисляем
  53. sub ax,poz ; длину
  54. mov m,ax ;   копируемого
  55. inc m ;      слова
  56. push cx ; сохраняем в стек позицию, на которой остановились
  57. mov cx,m ; помещаем число копируемых знаков
  58. mov si,poz; помещаем позицию первого символа слова
  59. rep movsb ; копируем
  60. pop cx ; восстанавливаем состояние до копирования
  61. m2:
  62. mov flag,0 ;
  63. mov poz,bx ; присваиваем позицию пробела
  64. inc poz ; теперь указывает на первый символ слова
  65. finish_cycle1:
  66. loop cycle1 ; цикл
  67. lea dx,blength
  68. mov ah,9
  69. int 21h
  70. exit:
  71. mov ax,4c00h
  72. int 21h
  73. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы