Ввод и вывод в программе символа конца строки (доллара), tasm - Assembler

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

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

Помогите пожалуйста отредактировать программу, чтобы она корректно работала при вводе и выводе символа доллара. Условие программы следующее: Вводится строка, вводится символ. Необходимо вывести все слова, содержащие этот символ. Код:
Листинг программы
  1. .model small
  2. .286
  3. .stack 100h
  4. .386
  5. .data
  6. size_buf db 255
  7. size_real db 255
  8. string db 254 dup ('$')
  9. newstr db 254 dup ('$')
  10. src_pos dw 0
  11. dst_pos dw 0
  12. char db ?
  13. ent db 10, 13, '$'
  14. tmp dw ?
  15. message1 db "Input: $"
  16. message2 db "Output: $"
  17. .code
  18. ENTER_PR proc
  19. push dx
  20. push ax
  21. lea dx, ent;
  22. mov ah, 09h
  23. int 21h
  24. pop ax
  25. pop dx
  26. ret
  27. endp ENTER_PR
  28.  
  29. start:
  30. mov ax, @data
  31. mov ds, ax
  32. mov es, ax
  33. ;Вывод приглашения сделать вывод
  34. ; xor dx,dx
  35. mov DX,offset message1
  36. mov ah, 09h
  37. int 21h
  38. call ENTER_PR
  39.  
  40. ;настроиться на str и считать строку
  41. lea dx, size_buf
  42. mov ah, 0Ah; считать строчку
  43. int 21h
  44. call ENTER_PR
  45. ;символ
  46. mov ah,01h
  47. int 21h
  48. mov char,al
  49. call ENTER_PR
  50. lea bx,[string]
  51. push offset newstr
  52. pop [dst_pos]
  53. pass_space:
  54. cmp [bx], byte ptr '$' ;сравниваем на конец строки
  55. je final
  56. cmp [bx], byte ptr ' '
  57. jne save_start_addrs
  58. inc bx
  59. jmp pass_space
  60. save_start_addrs:
  61. mov [src_pos], bx позицию загоняем начальный адрес строки
  62. seek_char:
  63. cmp [bx], byte ptr '$' ;сравниваем на конец строки
  64. je final
  65. cmp [bx], byte ptr ' '
  66. je pass_space
  67. mov al, [char]
  68. cmp [bx], al ;сравниваем с символом
  69. je count_chars
  70. inc bx
  71. jmp seek_char
  72. count_chars:
  73. mov bx, [src_pos]
  74. xor cx, cx
  75. cc_cycle:
  76. cmp [bx], byte ptr '$' ;сравниваем на конец строки
  77. je copy_chars
  78. cmp [bx], ' '
  79. je copy_chars
  80. inc cl
  81. inc bx
  82. jmp cc_cycle
  83. copy_chars:
  84. mov si, [src_pos]
  85. mov di, [dst_pos]
  86. inc cl
  87. rep movsb
  88. dec si
  89. mov bx, si
  90. ; mov [src_pos], si
  91. mov [dst_pos], di
  92. jmp pass_space
  93.  
  94. final:
  95. mov [di-1], byte ptr '$'
  96. call ENTER_PR
  97. mov DX,offset message2
  98. mov ah, 09h
  99. int 21h
  100. call ENTER_PR
  101. mov DX,offset newstr
  102. mov ah, 09h
  103. int 21h
  104. call ENTER_PR
  105. mov ah,01h
  106. int 21h
  107. mov ah, 4Ch
  108. int 21h
  109. end start

Решение задачи: «Ввод и вывод в программе символа конца строки (доллара), tasm»

textual
Листинг программы
  1. cld
  2. mov si,offset string
  3. cmp ax,?
  4. org $-2
  5. @@next:
  6. int 29h
  7. lodsb
  8. or al,al
  9. jnz @@next

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

  1. Команда cld устанавливает направление переходов в следующую строку.
  2. Команда mov si,offset string задает начальный адрес строки в регистре SI.
  3. Команда cmp ax,? сравнивает AX с неопределенным значением.
  4. Команда org $-2 выравнивает сегментный регистр на -2 байта.
  5. Команда int 29h выполняет переход на следующий сегмент.
  6. Команда lodsb загружает байт из памяти в AL.
  7. Команда or al,al устанавливает значение AL равным 0.
  8. Команда jnz @@next повторяет цикл, пока значение AL не станет равным 0.
  9. Переменная string содержит строку символов.
  10. Переменная ax содержит значение 0.
  11. Переменная si содержит смещение строки.
  12. Переменная al содержит байт, который будет проверен на равенство 0.
  13. Переменная offset не используется в коде.
  14. Переменная next не используется в коде.
  15. Команда int 29h выполняет переход на следующий сегмент.
  16. Команда lodsb загружает байт из памяти в AL.
  17. Команда or al,al устанавливает значение AL равным 0.
  18. Команда jnz @@next повторяет цикл, пока значение AL не станет равным 0.
  19. Переменная string содержит строку символов.
  20. Переменная ax содержит значение 0.
  21. Переменная si содержит смещение строки.
  22. Переменная al содержит байт, который будет проверен на равенство 0.

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


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

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

11   голосов , оценка 4.091 из 5

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

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

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