В 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 2

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