Здравствуйте, apm-020.
Программа в приложении.
Что непонятно, спрашивайте в мини-форуме.
Приложение:
assume cs:CSEG,ds:CSEG,es:CSEG,ss:CSEG
CSEG segment
org 100h
Start:
mov ah,9
mov dx,offset String
int 21h
Next_key:
mov ah,8 ;ждем клавишу (лучше использовать ДОС-овскую функцию,
int 21h ; т.к. она дает расширенные коды)
cmp al,'f' ;f
jz F_pressed
cmp al,21h ;alt-f
jne Next_key
F_pressed: ;поехали :)
lea dx,DTA
mov ah,1ah
int 21h ;сначала поменяем DTA, необходимую для поиска
call open_file ;создадим и откроем файл с именем текущей даты
mov di,ax ;сохраним handle файла
mov si,1 ;начинаем обход всех дисков с A:
MLoop:
mov bx,si ;Флоппи и флеш-диски и другие removable не рассматриваем
mov ax,4408h
int 21h
jc MNext ;если ошибка (например, устройства нет вообще)
test ax,ax
jz MNext ;0-removable
mov ax,4409h;также обойдем CD, DVD, SUBST и сетевые диски
int 21h
jc MNext
test dh,10010000b ;бит 15 - subst-drive, бит 12 - remote-drive
jnz MNext
;Ура! Hard-drive: узнаем имя тома и выведем в файл
lea bx,buffer ;буфер для строки
xchg bx,di ;bx = handle файла, di = адрес буфера
mov ax,':@' ;заготовка для 'A:' для буковки диска
add ax,si ;1 - 'A',...
stosw ;в буфер
mov word ptr path,ax;одновременно формируем строку для поиска имени тома
mov al,' ' ;отделим пробелом
stosb
lea dx,path ;ищем
mov ah,4eh
mov cx,8 ;volume label !
int 21h
jc MNext ;ошибка...
push si ;в si у нас номер устройства, сохраним в стеке
lea si,DTA+1eh ;адрес имени тома в DTA (заканчивается 0)
CopyLoop:
lodsb ;скопируем в буфер
test al,al
jz endl
stosb
jmp CopyLoop
endl:
pop si
mov ax,0a0dh ;конец строки
stosw
lea dx,buffer ;адрес буфера
mov cx,di
sub cx,dx ;длина строки
mov ah,40h
int 21h ;пишем в файл
mov di,bx ;сохраним handle файла
MNext:
inc si ;на следующее устройство
cmp si,'Z'-'A'+1 ;до 'Z'
jbe MLoop
mov ah,3eh ;закроем файл
int 21h
lea dx,Finish ;выведем строку
mov ah,9
int 21h
mov ah,0 ;и ждем нажатия на клавишу
int 16h
mov ax,4c00h
int 21h
open_file proc ;формируем имя файла из текущего времени
mov ah,2ch ;запрос времени
int 21h
mov al,ch ;часы
aam ;хитрая команда
превращает число из al в неупакованный BCD
xchg al,ah ; надо поменять местами (пусть в al будет старшая цифра)
or ax,'00' ;превратим числа в символы
mov hours,ax ;сохраним
mov al,cl ;аналогично с минутами
aam
xchg al,ah
or ax,'00'
mov minutes,ax
lea dx,FName ;имя файла
mov cx,0 ;без атрибутов
mov ah,3ch ;создаем и открываем одновременно
int 21h
ret ;вернем в ax handle файла
open_file endp
String db 'Press f or alt+f:$'
Finish db 0dh,0ah,'MISSION COMPLETE. press any key$'
FName label byte
hours dw 0
db '_'
minutes dw 0
db '.txt',0
path db 'a:\*.*',0
DTA db 43 dup (0)
buffer db 17 dup (0)
CSEG ends
end Start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен