В MSDOS попросите пользователя ввести имя существующего файла, а затем удалить его
Я написал программу ниже, но она не работает. Я ввожу имя файла как dur.txt
. Он возвращает AX=4C03. Почему это не работает и как я могу это исправить?
.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
1 ответ:
Как правильно сказал Майкл, [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" после сравнения, вы уничтожите его настройки флага. поэтому я переместил inc si перед сравнением, и SI должен был быть загружен на один байт раньше буфера. ps: поиск довольно прост (и опасен, он не останавливается, прежде чем найти любой 0x0D в памяти!), я почти уверен, что есть петля x86 инструкция somwhere: -)
Как (снова) правильно заявил Майкл, 2-й байт входного буфера скажет, как долго была введена строка (и где находится 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