Вывод названия второго файла в каталоге - 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 ;