Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.185.147] |
|
Сообщ.
#1
,
|
|
|
Добрый день, присутствует такая проблема, условие задачи стоит так: Ввести с клавиатуры название файла, затем ввести строку, из которой необходимо удалить конкретный символ (в данном случае пробел) и записать результаты в файл с именем из первого ввода и содержанием в виде двух строк: 1. Введенная строка, 2. Результирующая строка без символов (пробела).
На данный момент имеется такой код, прошу помогите найти причину. Этот пример имеет фиксированный файл и путь, он выполняет все действия КРОМЕ УДАЛЕНИЯ СИМВОЛА, тут он просто заменяется тем же, только на регистр выше. Помогите изменить код так, чтобы он удовлетворял условию задачи. 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 |
Сообщ.
#2
,
|
|
|
Удаление заданного символа:
ds:si - исходная ASCIIZ-строка es:di - конечная ASCIIZ-строка ah - удаляемый символ cld repeat: lodsb or al,al jz done cmp al,ah je repeat stosb jmp short repeat done: |
Сообщ.
#3
,
|
|
|
Akina, могли бы вы изменить мой пример, согласно тому, что прислали? Я в Ассемблеере совсем ноль, задание с сессии, как дополнительное
|
Сообщ.
#4
,
|
|
|
Цитата Akina @ Всегда ж сработает на выход, ибо:Удаление заданного символа: xor al,al jz done Цитата XOR Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ Команда воздействует на флаги OF, SF, ZF, PF и CF, причём флаги OF и CF всегда сбрасываются, а остальные флаги устанавливаются в зависимости от результата. |
Сообщ.
#5
,
|
|
|
Славян Это полезно знать, буду сильнее благодарен если поможете))
|
Сообщ.
#6
,
|
|
|
Цитата Славян @ Всегда ж сработает на выход, ибо: О! Спасибо. Опечатка... не проверил. Счас исправлю. Добавлено Поправил. |
Сообщ.
#7
,
|
|
|
Странные эксперты, вы может для себя и понимаете, но по факту не помогли то
|
Сообщ.
#8
,
|
|
|
Между "помогите" и "сделайте за меня" есть некоторая разница. И отношение разное - первым помогут, а вторые могут идти ... скажем, во фриланс.
|
Сообщ.
#9
,
|
|
|
Akina, ничего не скажу, вы скинули участок кода, однако как его внедрить на деле, совсем не понятно.
|
Сообщ.
#10
,
|
|
|
Цитата sorokaup @ Если "ноль", то куда ни вставь этот код, ничего не получится, т.к. там есть ещё несколько нюансов. Ясно же, что даже приведённый в первом посте код чужой, только что толку?Я в Ассемблеере совсем ноль, задание с сессии, как дополнительное Уважаемый, понятно, что хочется сдать на халяву, ничего при этом не зная и не делая. Но мечтать не вредно, всё же нужно выбирать: либо бесплатно, но придётся разобраться самому, либо сам понимаешь... (причём, тут вопрос-то далеко не на миллион). Тебе же сантехник бесплатно не приходит кран чинить, даже если очень надо... советов на ютубе можно много найти, но всё равно придётся либо самому гайки крутить, либо нанимать... приучайся к этому, в будущем будет проще жить |