На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Не поленитесь, загляните в эти разделы перед созданием темы. Возможно, так уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).

Не забывайте также про главные Правила форума!

Так что добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Удаление конкретных символов из строки, запись результатов в файл, Удаление конкретных символов из строки, запись результатов в файл
    Добрый день, присутствует такая проблема, условие задачи стоит так: Ввести с клавиатуры название файла, затем ввести строку, из которой необходимо удалить конкретный символ (в данном случае пробел) и записать результаты в файл с именем из первого ввода и содержанием в виде двух строк: 1. Введенная строка, 2. Результирующая строка без символов (пробела).

    На данный момент имеется такой код, прошу помогите найти причину. Этот пример имеет фиксированный файл и путь, он выполняет все действия КРОМЕ УДАЛЕНИЯ СИМВОЛА, тут он просто заменяется тем же, только на регистр выше. Помогите изменить код так, чтобы он удовлетворял условию задачи.
    ExpandedWrap disabled
      data segment
          msg db 255, 0, 255 dup ('$'), '$'
          file_name db 'C:\output.txt',0
          error_msg db 'Error! Could not handle file $'
          msg_size db 0
          handler dw 0
      data ends
       
      code segment
      assume cs:code, ds:data
       
      ; ---------------------------------------------
      ; Процедура чтения данных с клавиатуры
       
      read_from_keyboard proc
          mov ah, 0ah
          lea dx, msg
          int 21h
          ret
      read_from_keyboard endp
                                  
      ; ------------------------------------------------------------------------------------
      ; ------------------------------------------------------------------------------------                                                        
      ; Процедура замены символа 'a' на 'A'
       
      replace_a proc
          mov si, offset msg + 2  ; Перемещаем регистор в si содержимое msg (первые 2 бита не трогаем) (move to register si offset of msg's data (we do not need first 2 bytes))
          mov al, [si]            ; Перемещаем текущий (первый) символ из точки si в регистр al (move current (first) symbol from pointer si to register al)                                                          
       
      met:
          cmp al, 'a'             ; Сравниваем текущий символ с символом "а"
          jne skip                ; Если текущий символ не равен "а", то пропускаем метку
          mov al, 'A'             ; Если текущий символ равен "а", то производим замену символа на "А"
          mov [si], al            ; Изменяем точку si на новый символ
        
      skip:    
          inc si                  ; Переходим к следующему символу
          mov al, [si]            ; Перемещаем текущий символ из точки si в регистр al
          cmp al, '$'             ; Сравниваем текущий символ с символом "$"
          jne met                 ; Если текущий символ не равен "$", то пропускаем метку и возвращаемся к циклу met
          ret                     ; Если текущий символ равен "$", то заканчиваем процедуру
      replace_a endp    
       
      ; ------------------------------------------------------------------------------------
      ; ------------------------------------------------------------------------------------
       
      ; ---------------------------------------------
      ; Процедура вывода на экран сообщения с ошибкой          
       
      print_error proc
          mov ah, 09h
          lea dx, error_msg
          int 21h
          ret
      print_error endp
       
          
      ; ---------------------------------------------
      ; Процедура создания и записи в файл
       
      handle_file proc  
          mov ah, 3ch                ; Создание файла
          xor cx, cx                 ; cx = 0
          lea dx, file_name          ; Создаем файл с названием в переменной file_name
          int 21h                    ; Прерывание
          jc error_file              ; Проверка файла на ошибки
       
          mov handler, ax
       
          mov ah, 40h                ; Запись в файл
          mov bx, handler            ;
          xor cx, cx                 ; cx = 0
          mov cl, [msg_size]         ; Номер бита для записи (number of bytes to write)
          lea dx, msg + 2            ;
          int 21h                    ; Прерывание
        
          jc error_file              ; Проверка файла на ошибки
          mov msg + 1, 0ah           ; Изменяем второй байт на символ новой строки (change second byte to new line symbol)
          call replace_a             ; Вызываем процедуру замены символа "а" на "А"
        
          mov ah, 40h                ; Запись в файл
          mov bx, handler            ;
          xor cx, cx                 ; cx = 0    
          mov cl, [msg_size]         ; Номер бита для записи (number of bytes to write)
          inc cl                     ;
          lea dx, msg + 1            ;
          int 21h                    ; Прерывание
        
          jc error_file              ; Проверка файла на ошибки
        
          cmp ax, cx
          jne error_file             ; Проверка записи строки в файл (check if string is completely written to file)
          
          mov ah, 3Eh                ; Закрытие файла
          mov bx, handler
          int 21h
       
          jc error_file              ; Проверка файла на ошибки
          ret                        ; Завершаем работу программы
       
          ; ---------------------------------------------
          ; Функция вывода сообщения об ошибке работы с файлом
       
          error_file:    
              call print_error
              ret          
              
      handle_file endp
       
       
      ; ------------------------------------------------------------------------------------
      ; ------------------------------------------------------------------------------------
      ; ------------------------------------------------------------------------------------
      ; ЗАПУСК ПРОГРАММЫ
       
      start:
          mov ax, ax
          mov bx, data
          mov ds, bx
          
          call read_from_keyboard  ; Читаем строку с клавиатуры
          lea si, msg + 1          ; Получаем размер сообщения (msg size)
          mov al, [si]
          mov msg_size, al
       
          ; Первые 2 bytes сообщения msg это максимальная длина (max length) и длина (length),
          ; Мы не нуждаемся в этих данных (we do not need this data anymore)
          ; Изменение второго байта с символа новой строки (change second byte to new line symbol and)
          ; и не используйте первый байт
       
          call handle_file         ; запись результатов в файл
          
          mov ah, 4ch
          int 21h
      code ends
      end start
      Удаление заданного символа:

      ds:si - исходная ASCIIZ-строка
      es:di - конечная ASCIIZ-строка
      ah - удаляемый символ

      ExpandedWrap disabled
            cld
        repeat:
            lodsb
            or al,al
            jz done
            cmp al,ah
            je repeat
            stosb
            jmp short repeat
        done:
      Сообщение отредактировано: Akina -
      Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
      Есть претензии ко мне как к участнику? да ради бога.
      Не нравятся мои ответы? не читайте их.
      В общем, берегите себя. Нервные клетки не восстанавливаются.
        Akina, могли бы вы изменить мой пример, согласно тому, что прислали? Я в Ассемблеере совсем ноль, задание с сессии, как дополнительное
          Цитата Akina @
          Удаление заданного символа:
          ExpandedWrap disabled
                xor al,al
                jz done
          Всегда ж сработает на выход, ибо:
          Цитата XOR Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
          Команда воздействует на флаги OF, SF, ZF, PF и CF, причём флаги OF и CF всегда сбрасываются, а остальные флаги устанавливаются в зависимости от результата.
          :whistle:
            Славян Это полезно знать, буду сильнее благодарен если поможете))
              Цитата Славян @
              Всегда ж сработает на выход, ибо:

              О! Спасибо. Опечатка... не проверил. Счас исправлю.

              Добавлено
              Поправил.
              Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
              Есть претензии ко мне как к участнику? да ради бога.
              Не нравятся мои ответы? не читайте их.
              В общем, берегите себя. Нервные клетки не восстанавливаются.
                Странные эксперты, вы может для себя и понимаете, но по факту не помогли то :)
                  Между "помогите" и "сделайте за меня" есть некоторая разница. И отношение разное - первым помогут, а вторые могут идти ... скажем, во фриланс.
                  Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                  Есть претензии ко мне как к участнику? да ради бога.
                  Не нравятся мои ответы? не читайте их.
                  В общем, берегите себя. Нервные клетки не восстанавливаются.
                    Akina, ничего не скажу, вы скинули участок кода, однако как его внедрить на деле, совсем не понятно.
                      Цитата sorokaup @
                      Я в Ассемблеере совсем ноль, задание с сессии, как дополнительное
                      Если "ноль", то куда ни вставь этот код, ничего не получится, т.к. там есть ещё несколько нюансов. Ясно же, что даже приведённый в первом посте код чужой, только что толку?
                      Уважаемый, понятно, что хочется сдать на халяву, ничего при этом не зная и не делая. Но мечтать не вредно, всё же нужно выбирать: либо бесплатно, но придётся разобраться самому, либо сам понимаешь... (причём, тут вопрос-то далеко не на миллион).
                      Тебе же сантехник бесплатно не приходит кран чинить, даже если очень надо... советов на ютубе можно много найти, но всё равно придётся либо самому гайки крутить, либо нанимать... приучайся к этому, в будущем будет проще жить ;)
                      vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script Execution time: 0,1207 ]   [ 17 queries used ]   [ Generated: 17.07.18, 11:44 GMT ]