Удаление конкретных символов из строки, запись результатов в файл - Assembler

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

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

Добрый день, присутствует такая проблема, условие задачи стоит так: Ввести с клавиатуры название файла, затем ввести строку, из которой необходимо удалить конкретный символ (в данном случае пробел) и записать результаты в файл с именем из первого ввода и содержанием в виде двух строк: 1. Введенная строка, 2. Результирующая строка без символов (пробела). На данный момент имеется такой код, прошу помогите найти причину. Этот пример имеет фиксированный файл и путь, он выполняет все действия КРОМЕ УДАЛЕНИЯ СИМВОЛА, тут он просто заменяется тем же, только на регистр выше. Помогите изменить код так, чтобы он удовлетворял условию задачи.
Листинг программы
  1. data segment
  2. msg db 255, 0, 255 dup ('$'), '$'
  3. file_name db 'C:\output.txt',0
  4. error_msg db 'Error! Could not handle file $'
  5. msg_size db 0
  6. handler dw 0
  7. data ends
  8. code segment
  9. assume cs:code, ds:data
  10. read_from_keyboard proc
  11. mov ah, 0ah
  12. lea dx, msg
  13. int 21h
  14. ret
  15. read_from_keyboard endp
  16. replace_a proc
  17. mov si, offset msg + 2 ; move to register si offset of msg's
  18. ; data (we do not need first 2 bytes)
  19. mov al, [si] ; move current (first) symbol from pointer si
  20. ;to register al
  21. met:
  22. cmp al, 'a' ; compare current symbol with 'a'
  23. jne skip ; if current symbol is not equal to 'a' then
  24. ; go to skip label
  25. mov al, 'A'
  26. mov [si], al ; change current symbol to 'A'
  27. skip:
  28. inc si ; go to the next symbol
  29. mov al, [si] ; move current symbol from pointer si
  30. ;to register al
  31. cmp al, '$' ; compare current symbol with '$'
  32. jne met ;if current symbol is not equal to '$' then
  33. ;go to met label
  34. ret
  35. replace_a endp
  36. print_error proc
  37. ;write error
  38. mov ah, 09h
  39. lea dx, error_msg
  40. int 21h
  41. ret
  42. print_error endp
  43. handle_file proc
  44. ;create file
  45. mov ah, 3ch
  46. xor cx, cx ; cx = 0
  47. lea dx, file_name
  48. int 21h
  49. jc error_file ;check if error occured
  50. mov handler, ax
  51. ;write to file
  52. mov ah, 40h
  53. mov bx, handler
  54. xor cx, cx ; cx = 0
  55. mov cl, [msg_size] ; number of bytes to write
  56. lea dx, msg + 2
  57. int 21h
  58. jc error_file ;check if error occured
  59. mov msg + 1, 0ah; change second byte to new line symbol
  60. call replace_a
  61. ;write to file
  62. mov ah, 40h
  63. mov bx, handler
  64. xor cx, cx ; cx = 0
  65. mov cl, [msg_size] ; number of bytes to write
  66. inc cl
  67. lea dx, msg + 1
  68. int 21h
  69. jc error_file ;check if error occured
  70.  
  71. cmp ax, cx
  72. jne error_file ;check if string is completely written to file
  73. ;close file
  74. mov ah, 3Eh
  75. mov bx, handler
  76. int 21h
  77. jc error_file ;check if error occured
  78. ret
  79. error_file:
  80. call print_error
  81. ret
  82. handle_file endp
  83. start:
  84. mov ax, ax
  85. mov bx, data
  86. mov ds, bx
  87. ;read string from keybord
  88. call read_from_keyboard
  89. ;get msg size
  90. lea si, msg + 1
  91. mov al, [si]
  92. mov msg_size, al
  93. ; first 2 bytes of msg is max length and length,
  94. ; we do not need this data anymore
  95. ; change second byte to new line symbol and
  96. ; don't use first byte
  97.  
  98. ;write result to file
  99. call handle_file
  100. mov ah, 4ch
  101. int 21h
  102. code ends
  103. end start

Решение задачи: «Удаление конкретных символов из строки, запись результатов в файл»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.  
  9.         FileName        db      80, 0, 81 dup(?)
  10.         String          db      255, 0, 256 dup(?)
  11.         Handle          dw      ?
  12.  
  13.         msgGetFileName  db      'File name: ', '$'
  14.         msgGetString    db      'String: ', '$'
  15.         CrLf    db      0Dh, 0Ah, '$'
  16.         errFileOpen     db      'File open error', '$'
  17.  
  18. .code
  19.  
  20. main    proc
  21.         mov     ax,     @data
  22.         mov     ds,     ax
  23.  
  24.         ;ввод имени файла
  25.         mov     ah,     09h
  26.         lea     dx,     msgGetFileName
  27.         int     21h
  28.         mov     ah,     0Ah
  29.         lea     dx,     FileName
  30.         int     21h
  31.         mov     ah,     09h
  32.         lea     dx,     CrLf
  33.         int     21h
  34.  
  35.         ;добавление 0 в конец строки
  36.         lea     si,     FileName+2
  37.         mov     al,     FileName+1
  38.         mov     ah,     0
  39.         add     si,     ax
  40.         mov     [si],   byte ptr 0
  41.         ;ввод строки
  42.         mov     ah,     09h
  43.         lea     dx,     msgGetString
  44.         int     21h
  45.         mov     ah,     0Ah
  46.         lea     dx,     String
  47.         int     21h
  48.         mov     ah,     09h
  49.         lea     dx,     CrLf
  50.         int     21h
  51.  
  52.         ;открытие файла
  53.         mov     ah,     3Ch
  54.         mov     cx,     00h
  55.         lea     dx,     FileName+2
  56.         int     21h
  57.         jnc     @@FileOpenOk
  58.         mov     ah,     09h
  59.         lea     dx,     errFileOpen
  60.         jmp     @@Exit
  61. @@FileOpenOk:
  62.         mov     Handle, ax
  63.         ;вывод исходной строки в файл
  64.         mov     ah,     40h
  65.         lea     dx,     String+2
  66.         mov     cl,     String+1
  67.         mov     ch,     0
  68.         mov     bx,     Handle
  69.         int     21h
  70.         ;вывод перевода строки в файл
  71.         mov     ah,     40h
  72.         lea     dx,     CrLf
  73.         mov     cx,     2
  74.         mov     bx,     Handle
  75.         int     21h
  76.         ;преобразование строки
  77.         lea     si,     String+1
  78.         call    RemoveChar
  79.         ;вывод обработанной строки в файл
  80.         mov     ah,     40h
  81.         lea     dx,     String+2
  82.         mov     cl,     String+1
  83.         mov     ch,     0
  84.         mov     bx,     Handle
  85.         int     21h
  86.         ;вывод перевода строки в файл
  87.         mov     ah,     40h
  88.         lea     dx,     CrLf
  89.         mov     cx,     2
  90.         mov     bx,     Handle
  91.         int     21h
  92.         ;закрытие файла
  93.         mov     ah,     3Eh
  94.         mov     bx,     Handle
  95.         int     21h
  96.  
  97. @@Exit:
  98.         mov     ax,     4C00h
  99.         int     21h
  100. main    endp
  101.  
  102. RemoveChar      proc
  103.         push    ax
  104.         push    bx
  105.         push    cx
  106.         push    dx
  107.         push    si
  108.         push    di
  109.  
  110.         mov     cx,     0       ;текущая длина строки
  111.         mov     cl,     [si]
  112.         mov     bx,     si      ;адрес ячейки с длиной строки
  113.         mov     dx,     0       ;новая длина строки
  114.         inc     si
  115.         mov     di,     si
  116. @@For:
  117.         mov     al,     [si]
  118.         cmp     al,     ' '
  119.         je      @@Skip
  120.         mov     [di],   al
  121.         inc     di
  122.         inc     dx
  123. @@Skip:
  124.         inc     si
  125.         loop    @@For
  126.  
  127.         mov     [bx],   dl
  128.  
  129.         pop     di
  130.         pop     si
  131.         pop     dx
  132.         pop     cx
  133.         pop     bx
  134.         pop     ax
  135.         ret
  136. RemoveChar      endp
  137.  
  138. end     main

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

  1. Создаются локальные переменные
  2. Определение модели и размера стека
  3. Определение переменных данных:
    • FileName - хранит имя файла
    • String - хранит введенную строку
    • Handle - хранит обработанный файл
    • msgGetFileName - сообщение для ввода имени файла
    • msgGetString - сообщение для ввода строки
    • CrLf - символ перевода строки
    • errFileOpen - сообщение об ошибке открытия файла
  4. Начало процедуры main
  5. Ввод имени файла и строки
  6. Добавление символа завершения строки в FileName
  7. Открытие файла
  8. Вывод исходной строки в файл
  9. Вывод перевода строки в файл
  10. Преобразование строки с использованием процедуры RemoveChar
  11. Вывод обработанной строки в файл
  12. Вывод перевода строки в файл
  13. Закрытие файла
  14. Процедура завершения программы
  15. Процедура RemoveChar для удаления определенных символов из строки
  16. Конец программы

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


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

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

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

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

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

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