Почему этот ассемблерный код не удаляет файл с расширением .lnk?

Я пытаюсь удалить файл с расширением «.lnk», используя архитектуру сборки 8086. Когда я пишу «jmp DELETE» после «mov si, dx» и пропускаю внутреннюю часть, back1, back2, back3, мой код удаляет весь файл, но когда он проверяет, имеет ли он расширение .lnk посимвольно, он не Не удаляйте ни один из них, даже файл с расширением .lnk. Почему это происходит?

.MODEL SMALL
.STACK 100H
.DATA
FILE DB "*", 0
DTA DB 128H DUP(?)   
FILENAME DB 50 DUP(?)
.CODE

MAIN PROC  

    MOV AX,@DATA
    MOV DS,AX

    ;SET DTA
    MOV DX,OFFSET DTA
    MOV AH,1AH
    INT 21H

    ;FIRST SEARCH
    MOV DX,OFFSET FILE 
    MOV CX,0
    MOV AH,4EH
    INT 21H
    JC QUIT

OUTER_LOOP:


    ;DELETE
    LEA DX,DTA+30 
    mov si, dx 

    inner:
    cmp [si], 0
    je back1
    inc si
    jmp inner

    back1:
    dec si
    cmp [si],'K'
    je back2
    jmp NEXT

    back2:
    dec si
    cmp [si],'N'
    je back3
    jmp NEXT

    back3:

    dec si
    cmp [si], 'L'


    delete:
    LEA DX,DTA+30 
    MOV AH,41H
    INT 21H


    ;INITIATE NEXT SEARCH
    NEXT:
    MOV DX,OFFSET FILE 
    MOV CX,0
    MOV AH,4FH
    INT 21H
    JC QUIT

    JMP OUTER_LOOP



QUIT:
    MOV AX,4C00H
    INT 21H

MAIN ENDP
    END MAIN

person harmione    schedule 22.11.2015    source источник
comment
Какой ассемблер вы используете, и из любопытства он выдавал какие-либо предупреждения (masm или tasm?)? Я ожидаю, что большинство ассемблеров будут жаловаться на все строки, похожие на эту cmp [si], 'L' . Некоторые ассемблеры считают это сравнением 16-битного WORD в [si], а не байта.   -  person Michael Petch    schedule 22.11.2015
comment
Все строки типа cmp [si], 'L' (из них 4) должны иметь вид cmp byte ptr [si], 'L'   -  person Michael Petch    schedule 22.11.2015
comment
Я использую ассемблер tasm.   -  person harmione    schedule 22.11.2015
comment
и прямо сейчас я просто запускаю свой код в эмуляторе с именем emu8086.   -  person harmione    schedule 22.11.2015
comment
Ах, EMU8086, это другой зверь. Я даже не уверен, как удалить файл или как на этом работает эмулируемая ОС. Так вы говорите, что не можете удалять файлы во время работы под EMU8086? Я спрашиваю, чтобы я мог переименовать ваш вопрос, если это необходимо.   -  person Michael Petch    schedule 22.11.2015
comment
да, этот код работает с каталогом MyBuild в EMU8086. Но ничего не удаляется.   -  person harmione    schedule 22.11.2015
comment
Почему бы не выполнить код с помощью отладчика?   -  person Raymond Chen    schedule 22.11.2015
comment
Я сделал. И там это работает. Я имел в виду, что все регистры и переменные содержат значение, которое они должны хранить, но в каталоге ничего не происходит.   -  person harmione    schedule 22.11.2015
comment
В подстановочных знаках файлов типа DOS * соответствует только файлам без расширения. Чтобы сопоставить все файлы, вам нужно *.*, или чтобы сопоставить .lnk файлов, используйте *.lnk.   -  person lurker    schedule 22.11.2015


Ответы (1)


Эти пункты могут вас заинтересовать:

  • Измените маску файла на

    *.*
    
  • Почему вы создали такое большое DTA?.

    DTA 44 dup(?)
    
  • Всегда пишите cmp byte ptr [si], ...

  • Не прекращайте сравнивать после трех символов. Добавьте четвертое сравнение, чтобы увидеть, присутствует ли точка. Тогда вы узнаете, что LNK действительно является расширением файла.

  • Вашему DOS-вызову 4Fh не нужны параметры CX и DX.

  • Вы не интерпретируете результат

    cmp [si], 'L'
    
person Sep Roland    schedule 22.11.2015
comment
Я сделал все, что ты сказал. Но все еще не работает. :/ - person harmione; 22.11.2015
comment
Попробуйте удалить файл другого типа (*.MY) с помощью вашей программы. Возможно, файлы с расширением .LNK используются программой emu8086 и поэтому защищены. - person Sep Roland; 22.11.2015
comment
@user3144770 user3144770: Вы думали, что имена файлов могут быть в верхнем и нижнем регистре в EMU8086? Возможно ли, что файлы, которые вы ищете, lnk, а не LNK? - person Michael Petch; 22.11.2015
comment
@MichaelPetch DOS всегда пишет имена файлов с заглавной буквы. Так что emu8086 не должен относиться к этому иначе. - person Sep Roland; 22.11.2015
comment
@user3144770 user3144770, если это было так, то, когда я пропустил всю часть проверки и сделал прыжок после mov si, dx, почему все файлы, включая файл с расширением .LNK, были удалены? - person harmione; 22.11.2015
comment
Затем вы фактически попросили очистить весь каталог из-за подстановочного знака *, который представляет каждый файл. - person Sep Roland; 22.11.2015
comment
EMU8086 имеет много различных причуд, основанных на базовой файловой системе, и хотя настоящая DOS может возвращать их в верхнем регистре, EMU8086 не может (если базовая файловая система также не возвращает их в верхнем регистре). Большинство современных файловых систем Windows записывают имена файлов с учетом регистра, но не учитывают регистр. Могу поспорить на что угодно, что если у вас есть файл в c:\emu8086\mybuild\test.lnk, он будет отображаться как test.lnk в EMU8086, а не TEST.LNK - person Michael Petch; 22.11.2015
comment
@MichaelPetch и пользователь Harmione Почему бы вам не использовать файловую маску *.lnk, чтобы решить эту проблему и упростить вашу программу? Каждый найденный файл, если таковой имеется, будет соответствовать требованиям. - person Sep Roland; 22.11.2015
comment
Я не согласен с вами. На самом деле "*.lnk" в качестве шаблона поиска на EMU8086 должен возвращать все файлы с .LNK независимо от регистра. Таким образом, "*.lnk" вернет обратно весь файл с расширением lnk, LNK, LnK и т. д. Вам вообще не нужно сравнивать расширения файлов. - person Michael Petch; 22.11.2015
comment
@harmione наконец-то решила затянуть EMU8086. На самом деле он чувствителен к регистру при возврате имен файлов, а поиск файлов не чувствителен к регистру. Я использовал шаблон поиска "*.lnk" вместо "*", удалил код проверки расширения и просто перешел к удалению файла по мере его обнаружения. Файлы исчезли здесь. - person Michael Petch; 22.11.2015