Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) - Assembler

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

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

Помогите решить задачу Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) i8086

Решение задачи: «Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой)»

textual
Листинг программы
  1. .model small           
  2.  
  3. .data
  4. arr db 16,0,17 dup('$')
  5.  
  6. .stack 100h            
  7.  
  8. .code                  
  9. start:                 
  10. mov ax,@data   
  11. mov ds,ax
  12.  
  13. mov ah,0Ah
  14. lea dx,arr
  15. int 21h
  16.  
  17. lea si,arr+2
  18. xor bx,bx
  19. xor ch,ch
  20. mov cl,byte ptr [arr+1]
  21. search:
  22. lodsb
  23.  
  24. inc bx
  25.  
  26. cmp al,' '
  27. je found
  28.  
  29. cmp al,','
  30. je found
  31.  
  32. cmp al,'.'
  33. je found
  34. loop search
  35.  
  36. found:
  37. lea si,arr+2+bx
  38. xor ch,ch
  39. mov cl,byte ptr [arr+1]
  40. sub cx,bx
  41. del:
  42. push si
  43.  
  44. mov al,byte ptr [si]
  45. sub si,bx
  46. mov byte ptr [si],al
  47.  
  48. pop si
  49.  
  50. inc si
  51. loop del
  52.  
  53. sub si,bx
  54. mov byte ptr [si],'$'
  55.  
  56. mov ah,02h
  57. mov dl,0Ah
  58. int 21h
  59.  
  60. mov ah,02h
  61. mov dl,0Dh
  62. int 21h
  63.  
  64. mov ah,09h
  65. lea dx,arr+2
  66. int 21h
  67.  
  68. mov ah,4Ch
  69. mov al,00h
  70. int 21h
  71. end start

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

  1. Объявление модели программы: .model small
  2. Объявление переменной arr и инициализация: arr db 16,0,17 dup('$')
  3. Объявление стека: .stack 100h
  4. Начало кода: start:
  5. Перенос указателя данных в регистр ax: mov ax,@data
  6. Установка сегмента данных равным ax: mov ds,ax
  7. Ввод строки с клавиатуры, сохранение в arr:
    • mov ah,0Ah
    • lea dx,arr
    • int 21h
  8. Установка указателя si равным arr + 2: lea si,arr+2
  9. Установка регистров bx и ch в 0: xor bx,bx и xor ch,ch
  10. Загрузка длины строки в регистр cl: mov cl,byte ptr [arr+1]
  11. Поиск разделителя слова (пробела, запятой, точки) в строке:
    • Загрузка байта из si в al: lodsb
    • Увеличение bx на 1: inc bx
    • Сравнение al с пробелом, запятой и точкой, и переход к метке found, если найден разделитель:
      • cmp al,' ', cmp al,',', cmp al,'.', je found
    • Повторение поиска разделителя: loop search
  12. Метка found: нахождение разделителя, подготовка к удалению первого слова
    • Установка si равным arr + 2 + bx: lea si,arr+2+bx
    • Сброс ch, загрузка длины строки в cl и вычитание bx из cx: xor ch,ch, mov cl,byte ptr [arr+1], sub cx,bx
  13. Удаление первого слова:
    • Сохранение адреса si в стеке: push si
    • Загрузка байта из [si] в al, смещение указателя, замещение символа в строке с относительным адресом [si - bx]: mov al,byte ptr [si], sub si,bx, mov byte ptr [si],al
    • Восстановление адреса si из стека, инкремент si, повторение до завершения строки: pop si, inc si, loop del
  14. Вычитание bx из si, замещение последнего символа строки $ и вывод результата:
    • sub si,bx
    • mov byte ptr [si],'$'
    • mov ah,09h, lea dx,arr+2, int 21h
  15. Выход из программы:
    • mov ah,4Ch, mov al,00h, int 21h
  16. Конец программы: end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 4.5 из 5

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

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

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