Вывод названия второго файла в каталоге - Assembler

Узнай цену своей работы

Формулировка задачи:

Программа выводит названия всех файлов, которые находятся в указанном каталоге(вводится с клавиатуры). Как можно сделать чтобы выводило только название ВТОРОГО файла в каталоге. Подскажите пожалуйста!
        .model     tiny
        .code
        org        100h         ; СОМ-файл
start:
    push cs         ;на всякий случай, приравняем cs и ds
    pop ds          ;хотя в COM-файле они и так равны
 
    mov ah, 9       ;выводим на экран сообщение
    lea dx, msgpathrequest  ;в сообщении - просьба ввести имя каталога
    int 21h
 
    mov ah, 0Ah     ;вводим с клавиатуры строку
    lea dx, path        ;указываем на буфер ввода
    int 21h         ;буфер ввода имеет хитрую структуру
                ;первый байт - макс длина буфера
                ;во второй байт система положит количество считанных символов
                ;а с третьего байта начинается собственно буфер
 
    lea dx, pathstring  ;возьмём адрес начала введённой строки
    push dx         ;сохраним - этот адрес ещё понадобится
    add dl, byte ptr[pathactual]    ;к началу строки прибавим её длину, которую вернула предыдущая функция
    xor al, al      ;поправим старший регистр
    adc dh,al       ;типа а вдруг перенос? :)
    mov di, dx      ;поскольку имя каталога должно кончаться нулём,
    mov byte ptr[di], al    ;дадим ему в конце этот нуль
 
    mov ah, 3Bh     ;сменим каталог
    pop dx          ;на тот, что вводили
    int 21h
    jc no_such_directory    ;а если его нету - пойдём ругаться  

    mov ah,1ah
        mov dx,offset dta
        int 21h
        
    ;Ищем первый файл
    mov ah,4Eh          ; поиск первого файла
        mov cx,2h           ; указываем, что хотим найти скрытые файлы
    lea dx,searchPath
        int 21h
        jc  no_more_files   ; если CF = 1 - файлы кончились
 
print:
        mov ah,9h       ; вывод
        mov dx,offset dta + 1eh ; имени файла
        int 21h
 
    ; перевод на новую строку
        mov ah,9h
        mov dx,offset crlf
    int 21h
 
        mov ah,4Fh              ; найти следующий файл
    mov dx,offset dta
        int 21h
    jc  no_more_files
    jmp print       ;закрываем цикл
 
no_such_directory:
    mov ah, 9       ;вывод сообщения
    lea dx, msgnosuchdir    ;указываем адрес сообщения
    int 21h
    jmp no_more_files
 
no_more_files:                         ; если файлы кончились,
        mov ah,9h
        mov dx,offset message
        int 21h
    
        ; задержка
        xor ax,ax
        int 16h
   
        mov ah,4ch
        int 21h

msgpathrequest    db 0Ah, 0Dh, "Enter the full directory name: $"
msgnomorefiles  db 0Ah, 0Dh, "No files found in current directory$"
msgnosuchdir    db 0Ah, 0Dh, "No such directory$"
crlf db 0Dh,0Ah,'$' ;аналогично, новая строка
searchPath  db "*.*",0
dta     db 2ch dup (?)
        db "$"
message db 'Press any key...','$'
path        label byte  ;указатель на буфер ввода строки
pathlen     db 66
pathactual  db ?
pathstring  db 66 dup (?)
 
end  start

Решение задачи: «Вывод названия второго файла в каталоге»

textual
Листинг программы
ORG 100h
JMP start
 
newDTA  DB  45 DUP('$')       ; область "DISK TRANSFER AREA"
fName   DB  '*.COM',0         ; ищем COM-файлы
noFile  DB  '<--- ERROR!$'    ;
 
start:
   MOV   AH,1Ah               ; создать DTA
   MOV   DX,newDTA            ;
   INT   21h                  ;
 
   MOV   AH,4Eh               ; искать файл!
   MOV   CX,02h               ;
   MOV   DX,fName             ; маска для поиска
   INT   21h                  ;
   JC    error                ; ошибка?
 
;   MOV   AH,9                ; раскомментируй,
;   MOV   DX,newDTA+30        ;    если хочешь вывести,
;   INT   21h                 ;        имя первого файла
 
   MOV   AH,4Fh               ; искать сл.файл
   MOV   DX,newDTA            ;
   INT   21h                  ;
   JC    error                ;
 
   MOV   AH,9                 ; выводим его имя на экран
   MOV   DX,newDTA+30         ;
   INT   21h                  ;
   JMP   exit                 ;
 
error:                        ; ошибка!
   MOV   AH,9                 ;
   MOV   DX,noFile            ;
   INT   21h                  ;
 
exit:
   XOR   AX,AX                ;
   INT   16h                  ;
   INT   20h                  ;

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы