Консультация № 184652
02.12.2011, 16:56
84.99 руб.
0 1 1
Здравствуйте! У меня возникли сложности с таким вопросом:Создать на диске «А» файл. Изменить дату его создания на 31 декабря 2000 года. Обработать варианты, когда дискета отсутствует при помощи INT24h.
Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
очень надеюсь на вас=)

Обсуждение

давно
Посетитель
7438
7205
03.12.2011, 01:04
общий
это ответ
Здравствуйте, Дмитрий!
Программа создает в корне дискеты файл нулевой длины test.txt
Которому тут же меняет дату создания на заданную.

[code h=207]
.186 ;для команд shl ax,5
code segment 'code' ;начало сегмента кода
assume cs:code,ds:data,ss:stk

main proc
;установим обработчик int24h, старый можно не сохранять
push cs
pop ds ;ds=cs
lea dx, int_24 ;ds:dx - адрес обработчика
mov ax, 2524h
int 21h

mov ax, data ;адрес сегмента данных
mov ds, ax ;в ds
mov es, ax ;в es

lea dx, fName ;имя файла
mov cx, 0 ;без атрибутов
mov ah, 3ch ;создаем
int 21h
jc CreateError ;если ошибка

mov bx, ax ;handle файла
mov ax, 5700h ;читаем дату(dx) и время файла(cx)
int 21h
jc GetTimeError ;если ошибка
;время оставляемтем же, меняем дату
mov ax, 2000 ;год
mov dh, 12 ;месяц
mov dl, 31 ;день
call SetDate ;сформируем в DX в нужном формате
mov ax, 5701h ;установим дату
int 21h
jc SetTimeError ;если ошибка
lea dx, sOk ;все отработало!
Close:
mov ah, 3eh ;закрываем файл
int 21h
PrintMessage:
mov ah, 9 ;сообщение из ds:dx
int 21h

PrintAny:
lea dx, sAny ;press any key
mov ah, 9
int 21h

mov ah, 0
int 16h ;ждем any key

mov ax, 4c00h
int 21h ;выход в ДОС

CreateError: ;ошибка создания
lea dx, sCreateError
jmp PrintMessage
GetTimeError: ;ошибка чтения даты
lea dx, sGetTimeError
jmp Close
SetTimeError: ;ошибка установки даты
lea dx, sGetTimeError
jmp Close

main endp

;упаковка даты в следующий формат (побитно):
;yyyyyyym mmmddddd,
;yyyyyyy - 0-119, 0 соответствует 1980
;mmmm - 1-12, месяц
;ddddd - 1-31, день
;на входе: ax - год, dh - месяц, dl - день
;упакованная дата в dx
SetDate proc
sub ax, 1980 ;отнимаем базу
shl ax, 9 ;сдвигаем в крайнее левое положение
xchg ah, dh ;dh - год на месте, ah - месяц, al = 0
shr ax, 3 ;устанавливаем месяц в нужную позицию
or dx,ax ;"втыкаем" месяц на свое место
ret
SetDate endp

int_24: ;обработка ошибок
push ds
push di
push si
mov si, data
mov ds, si ;сообщения в сегменте данных
and di, 0fh ;младшие 4 бита - номер ошибки
shl di, 1 ;по 2 байта на адрес
mov si, table_errors[di] ;si - адрес сообщения
mov ah, 0eh ;выводим с помощью БИОС
mov al, 0dh ;сначала перевод строки
int 10h
mov al, 0ah
int 10h
print_loop: ;выводим строку ds:si, заканчивающуюся нулем
lodsb
cmp al, 0
je print_rc
int 10h
jmp print_loop
print_rc: ;добавим общую часть
lea si, Retry_Cancel
print_rc_loop:
lodsb
cmp al, 0
je wait_rc
int 10h
jmp print_rc_loop
wait_rc: ;ждем R или C
mov ah,0
int 16h
cmp ah,13h ;скан-код клавиши R
jne cmp_cancel
mov al,1 ;возвращаем код "повторить операцию"
jmp short jmp_iret
cmp_cancel:
cmp ah,2eh ;скан-код клавиши C
jne wait_rc ;все остальное игнорируем
mov al,3 ;возвращаем код "прервать операцию"
jmp_iret:
pop si
pop di
pop ds
iret

code ends

data segment
sOk db 0dh,0ah,'File create date is changed$'
sCreateError db 0dh,0ah,'File create error$'
sGetTimeError db 0dh,0ah,'Get time error$'
sSetTimeError db 0dh,0ah,'Set time error$'
sAny db 0dh,0ah,'Press any key$',0
fName db 'a:\test.txt',0

;сообщения int24h
;таблица адресов
table_errors dw protect_disk
dw unknown_id
dw not_ready
dw unknown_com
dw crc_error
dw request_error
dw search_error
dw media_type
dw sector_not_fou
dw printer_error
dw write_fault
dw read_fault
dw general_fault
dw unknown_error
dw unknown_error
dw change_error
;сами сообщения
protect_disk db 'Disk protected',0
unknown_id db 'Unknown ID subunit',0
not_ready db 'Disk not ready',0
unknown_com db 'Unknown command',0
crc_error db 'CRC error',0
request_error db 'Request error',0
search_error db 'Search error',0
media_type db 'Unknown disk media',0
sector_not_fou db 'Sector not found',0
printer_error db 'Printer error',0
write_fault db 'Write fault error',0
read_fault db 'Read fault error',0
general_fault db 'General failure',0
unknown_error db 'Unknown error',0
change_error db 'Disk change error',0
Retry_Cancel db ' (Retry or Cancel) ',0

data ends

stk segment stack
dw 100h dup (?)
stk ends

end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа