Консультация № 175099
10.12.2009, 05:31
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты!
помогите написать программу::

при нажатии клавиши F или ALT+F осуществить поиск меток тома на всех логических дисках и вывести их в текстовый файл, который будет назван по текущему системному времени

если можно, прошу листинг с комментами)
Операционная система : MS-DOS, запущенная в Microsoft Virtual PC на Win XP SP 1
предпочтительней среда MASM

в приложении прилагаю код обработки нажатия клавиш F или ALT+F
(возможно эта информация будет полезной
текущее системное время
mov ah,2Ch  в AH всегда указывается номер функции
int 21h  вызываем прерывание 21h – сервис
получения сист. информации)



Приложение:
CSEG segment
org 100h

Start:

mov ah,9
mov dx,offset String
int 21h


Next_key:

mov ah,10h

int 16h

cmp ah,'f'

jz F_pressed

cmp ah,21h

jz F_pressed

jmp Next_key

F_pressed:

int 20h

String db 'najmite f ili alt+f:$'

CSEG ends
end Start

Обсуждение

Неизвестный
10.12.2009, 08:06
общий
а чем отличается нажатие alt-f и просто f в контексте данной программы?
Неизвестный
10.12.2009, 10:48
общий
очевидно, что при нажатии клавиш F и ALT+F в регистр записываются различные ASCII-коды - в этом и отличие)))
а почему именно F и ALT+F ? - Такое ТЗ в лабораторной работе)
Неизвестный
10.12.2009, 17:15
общий
Уж не резидентная ли программа нужна?
Неизвестный
11.12.2009, 01:00
общий
Boriss:
нет, на мой взгляд, это не требуется

я считаю, что программа должна работать следующим образом (приблизительный грубый алгоритм):

по нажатию клавиш F или ALT+F программа начинает поиск меток томов (т.е. меток локальных дисков)
[то есть выполнять что-то вроде ДОСовской команды vol "название локального диска":
например, VOL C: VOL D: VOL E:]
и проверять так наличие меток томов на всех локальных дисках (насколько я понимаю локальных дисков в ДОСе может быть столько - сколько букв в английском алфавите, начиная с "С" то есть 24)
создается текстовый файл "hh/mm".txt, где "hh/mm" - системное время компьютера
зна4ения меток томов отличные от "0" (то есть существующих логических дисков на компьютере) записываются в файл, после чего файл сохраняется
программа выдает строку "MISSION COMPLETE. press any key"
и по нажатию любой кнопки закрывается )

Уважаемые эксперты, помогите!
давно
Посетитель
7438
7205
14.12.2009, 11:38
общий
это ответ
Здравствуйте, 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
5
ОТЛИЧНАЯ РАБОТА!<br>Великолепный эксперт и золотой души человек!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
14.12.2009, 22:37
общий
Лысков Игорь Витальевич,

спасибо за ответ!
сейчас разбираюсь в коде)

а можно эту же программку переделать, чтобы она резидентно работала?
если можно, пожалуйста!
Форма ответа