Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборочное удаление файла, Нужно просто удалить файл 
V
    Опции темы
PTimoxaI
Дата 25.6.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2007

Репутация: нет
Всего: нет



Всем привет !!! У меня такая проблема возникла, что я абсолютно в тупике. Думаю здесь есть какая то зацепка, но мне её не увидать, раз неделю не видел. Здесь нужен опытный чел.
Я начал писать прогу для выборочного удаления файла, но у меня получается это сделать если путь к удаляемому файлу я укажу заранее т.е. программно.  Я мне желательно сделать так чтобы я мог удалить любой файл при вводе его пути в мою запущенную прогу.

Вот это работающий исходник!
Если приглядется здесь уже почти всё готово. И подпрограмма для ввода с клавиатуры есть!
Помогите пожалуйста, очень вас прошу!

Код

TITLE kur
.model small
.Stack  32
DATA SEGMENT 
mes1 db '***show are way to the folder ***','$'
mes2 db '***Can not delete file ***','$'
mes3 db '***File delet successful***','$'
path db 'c:\Kursach.txt',0
HANDLE dw    ?
RECLEN  EQU     32
NAMEPAR LABEL   BYTE        ;Список параметров:
MAXLEN  DB      RECLEN        ; макс.длина имени
NAMELEN DB      ?            ; число введенных символов
NAMEDTA DB      RECLEN DUP(' ')    ; область передачи (DTA)
DATA ENDS
.286
CODE SEGMENT 
ASSUME DS:DATA,CS:CODE
my proc far
mov ax,data
mov ds,ax
mov ah,03h
int 10h
mov    cx,0000            ;От 00,00
call Q10CLR
mov dx,0000            ; Cтрока 1,столбец 1
call cursor
lea dx, mes1
call print
;---------------------------------------------
mov dx,0100h
call cursor
call vvod
mov bh,00h
mov bl,RECLEN
mov NAMEDTA[BX+1],00h
call del
mov ax,4c00h
int 21h
my endp
;-----------Очистка экрана-----------------
Q10CLR  PROC   NEAR
        MOV    AX,0600H        ;Функция прокрутки экрана
        MOV    BH,30            ;Цвет (30 для с/ж)
        MOV    DX,184FH        ;До 24,79
        INT    10H            ;Вызов BIOS
        RET
Q10CLR ENDP

;---------Установка курсора---------------
cursor proc near
mov ah,02h
mov bh,00h
int 10h
ret
cursor endp
;---------------Удаление файла-----------------
del proc near
mov ah,41h            Запрос на создание
mov  dx,offset path            ;ASCIIZ строка
int 21h            ;Вызов DOS
jc error
mov dx,0200h
call cursor
lea dx,mes3
call print
mov ah,01
int 21h
ret
del endp
;------------------Вывод-----------------------
print proc near
mov ah,09h
int 21h
ret
print endp
;------------------Ввод-----------------------
vvod proc near
mov    ah,0ah            ;Функция ввода
lea     dx,NAMEDTA
int    21h
ret
vvod endp
error:
mov cx,0000       ;От 00,00
call Q10CLR
mov dx,0000            ;Cтрока 1,столбец 1
call cursor
lea dx,mes2
call print
mov ah,08
int 21h
mov ax,4c00h
int 21h
CODE ends
end my


PM MAIL   Вверх
PTimoxaI
Дата 25.6.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2007

Репутация: нет
Всего: нет



Неужели никто не сможет подсказать мне почему программа и в частности функция 41h с прерывание м в DOS не понимает когда в регистр dx заносишь NAMEDTA т.е. это адресс куда вводится путь к файлу с помощью функции 0Ah ввода с клавиатуры. 

Кто подскажет огромный респект !!!
PM MAIL   Вверх
JAPH
Дата 25.6.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



Цитата
 т.е. это адресс куда вводится путь к файлу с помощью функции 0Ah ввода с клавиатуры. 

Честно? smile  Посмотрите в отладчике.

Код
TITLE kur    
.model small    
.Stack  32    
DATA SEGMENT    
mes1 db '***show are way to the folder ***','$'    ; english is awful
mes2 db '***Can not delete file ***','$'    
mes3 db '***File delet successful***','$'    
path db 'c:\Kursach.txt',0    
HANDLE dw    ?    
RECLEN  EQU     32    
NAMEPAR LABEL   BYTE        ;Список параметров:    
MAXLEN  DB      RECLEN        ; макс.длина имени    
NAMELEN DB      ?            ; число введенных символов    
NAMEDTA DB      RECLEN DUP(' ')    ; область передачи. Причём тут DTA?
; См. ф-ции 1Ah, 4Eh, 4Fh, сравниваем.
DATA ENDS    
.286    
CODE SEGMENT    
ASSUME DS:DATA,CS:CODE    
my proc far    
mov ax,data    
mov ds,ax    
mov ah,03h    
int 10h    
mov    cx,0000            ;От 00,00    
call Q10CLR    
mov dx,0000            ; Cтрока 1,столбец 1    
call cursor    
lea dx, mes1    
call print    
;---------------------------------------------    
mov dx,0100h    
call cursor    
call vvod    
mov  bl, NAMELEN ; Её длина
xor  bh, bh
mov  byte ptr [NAMEDTA + bx], 0 ; Удаляем символ 0Dh. +1-то откуда?
call del    
mov ax,4c00h    
int 21h    
my endp    
;-----------Очистка экрана-----------------    
Q10CLR  PROC   NEAR    
        MOV    AX,0600H        ;Функция прокрутки экрана    
        MOV    BH,30            ;Цвет (30 для с/ж)    
        MOV    DX,184FH        ;До 24,79    
        INT    10H            ;Вызов BIOS    
        RET    
Q10CLR ENDP    
;---------Установка курсора---------------    
cursor proc near    
mov ah,02h    
mov bh,00h    
int 10h    
ret    
cursor endp    
;---------------Удаление файла-----------------    
del proc near    
mov ah,41h            Запрос на СОЗДАНИЕ    - комментарий, да? :)
mov  dx,offset NAMEDTA            ;ASCIIZ строка    
int 21h            ;Вызов DOS    
jc error    
mov dx,0200h    
call cursor    
lea dx,mes3    
call print    
mov ah,01    
int 21h    
ret    
del endp    
;------------------Вывод-----------------------    
print proc near    
mov ah,09h    
int 21h    
ret    
print endp    
;------------------Ввод-----------------------    
vvod proc near    
mov    ah,0ah            ;Функция ввода    
lea     dx,MAXLEN  ;Ошибка здесь была
int    21h    
ret    
vvod endp    
error:    
mov cx,0000       ;От 00,00    
call Q10CLR    
mov dx,0000            ;Cтрока 1,столбец 1    
call cursor    
lea dx,mes2    
call print    
mov ah,08    
int 21h    
mov ax,4c00h    
int 21h    
CODE ends    
end my


Добавлено @ 07:12
В 9 утра все ещё спят, а вы требуете, чтобы проснулись и сразу за вашу задачку.
TD 4ever.

Это сообщение отредактировал(а) JAPH - 25.6.2007, 11:48


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
PTimoxaI
Дата 25.6.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2007

Репутация: нет
Всего: нет



Скомпилировал и всё работает только толком не понял пока в чём ошибка , ещё просмотрю ! Спасибо тебе огромное smile Я уже и не ожидал что кто то поможет!
PM MAIL   Вверх
JAPH
Дата 25.6.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



Я там пометил, где ошибка (строка 80 и, как следствие, строка 37).
Просто вы подали на вход функции чтения с клавы не адрес буфера (макс. допустимая длина, место для реальной длины и место для строки), а адрес самой будущей строки. Вот эта функция честно считала, что больше 32 символов читать не надо (вы ж заполнили её пробелами - символами с кодом 32), помещала число введённых символов и строку. Так что 41-ой функции скармливалось ' !d:\bp\bin\tasm\qwertyuiopasdf.tx'. Без t, ведь вы отсекли символ перед 0Dh (вот где -1 проявилась).
Понаблюдайте в отладчике.
PS. А imho удобнее читать функцией чтения файла, afair, 3Fh.
Код

mov  ah, 3Fh
mov  cx, 0040h ; - скока символов максимум
lea  dx, stroka ; - там будет строка
xor bx, bx ; - чтение с клавы
int  21h ; вернёт в AX число прочитанных символов, включая 0Dh 0Ah (CRLF)
mov  di, dx ; берём адрес строки
add  di, ax ; перемещаемся за её конец
mov  word ptr [di - 2], 0 ; и делаем вместо CRLF нули, т.е.
; получаем ASCIIZ-строку в DS:DX.


Добавлено через 23 секунды
Да, кстати, вопрос-то пометьте как решённый.


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
PTimoxaI
Дата 26.6.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.6.2007

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.