2016-03-15 2 views
2

Я написал программу ниже, но она не работает. Я вводил имя файла как dur.txt. Он возвращает AX = 4C03. Почему он не работает и как я могу его исправить?В MSDOS попросите пользователя ввести существующее имя файла, а затем удалить его

.model tiny 
.data 
    max1 db 32 
    act1 db ? 
    inp1 db 30 dup(0) 
    hande dw ? 

.code 
.startup 
    ;enter the name of the file 
    lea dx,max1 
    mov ah,0ah 
    int 21h 

    ;delete the file 
    mov ah,41h 
    lea dx, inp1 
    int 21h 
.exit 
end 
+2

Символы, которые вы получите в 'inp1' включает окончательное возвращение cariiage. Предположительно, имя файла, который вы пытаетесь вернуть, не содержит возврата каретки. – Michael

+0

использовать старый добрый «debug.com», проследить в программе до первого int21h и посмотреть, что вводится ... это не совсем то, что int 21/41h ожидает ;-) – Tommylee2k

+0

Это удаление, а не удаление (название, код комментарий) –

ответ

5

Как правильно сказал Майкл, нажатие [ENTER] также сохраняется во входном буфере. Вы должны заменить его на 0 перед вызовом INT 21/41

start: 
     ;enter the name of the file 
     lea dx,max1 
     mov ah,0ah 
     int 21h 

     mov si,offset act1 ; inc si is coming before cmp, so start ahead 
    lookup: 
     inc si 
     cmp byte ptr [si],0Dh 
     jnz lookup 
     mov byte ptr[si],0 

     ;delete the file 
     mov ah,41h 
     lea dx, inp1 
     int 21h 

подсказка: если вы «вкл си» после сравнения, вы будете уничтожить его установки флагов. поэтому я переместил inc si перед сравнением, и SI пришлось загрузить один байт перед буфером. ps: поиск довольно прост (и опасен, он не останавливается, прежде чем он найдет ЛЮБОЙ 0x0D в памяти!), Я уверен, что есть инструкция x86 loopup somwhere :-)

как (снова) Майкл заявил (снова) правильно, второй байт входного буфера будет указывать, как долго была введенная строка (и где находится 0x0d, поскольку это последняя введенная буква). Таким образом, нет никакой необходимости искать его, то на [INP1 + [ACT1]]

start: 
    lea dx,max1    ;enter the name of the file 
    mov ah,0ah 
    int 21h 

pick: 
    mov si,offset inp1  ; get offset of entered string 
    xor bh,bh 
    mov bl,[act1]   ; and it's len (the CR should be there) 
    mov byte ptr [bx+si],0 ; replace it with a 0 

    mov ah,41h    ;delete the file 
    lea dx, inp1 
    int 21h 
+0

Спасибо, я получил вашу мысль, и это сработало. –

+1

'act1' будет содержать количество прочитанных символов, исключая возврат каретки. Поэтому нет необходимости искать символ CR, так как вы знаете, где он находится. – Michael

+0

ах, хорошая точка; не заметил: P – Tommylee2k

Смежные вопросы