Консультация № 184642
01.12.2011, 20:20
65.00 руб.
0 8 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Нужно прочитать имя файла, записанного на диске «D», и вывести его на экран. Обработать ситуацию, когда дискета отсутствует при помощи INT24h.
Ассемблер-Tasm.exe Исполняемый файл в формате EXE.
очень надеюсь на вас=)

Обсуждение

давно
Старший Модератор
31795
6196
01.12.2011, 20:36
общий
Если смотреть с точки зрения РС времен первых HDD, на которые устанавливалась система, то дисковод может иметь имя либо А, либо В. HDD c системой носит имя С, остальные HDD - D..Z.


Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
01.12.2011, 21:10
общий
ну в задание как бы дискета A, но так как на компьютере нет флоппи диска,то лучше заменить имя с диска С,на имя флешки,точнее на любой другой съемный носитель
давно
Посетитель
7438
7205
01.12.2011, 22:02
общий
02.12.2011, 03:13
На флешке не сработает прерывание 24h.
Вернее, стаботало бы, если бы была сбойная флешка...
При отсутствии флешки будет обычная ошибка "путь не найден"
Т.к. устройства нет вообще. Прерывание 24h возникает при сбоях имеющегося устройства.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
02.12.2011, 14:45
общий
А посему работу прерывания 24h надо проверять только на дискетах.
Делаем? А проверите потом на компьютере с флоппи-дисководом.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.12.2011, 14:49
общий
делайте=)
так и сделаю
спасибо
давно
Посетитель
7438
7205
02.12.2011, 14:54
общий
Тогда вопрос: надо считать имя одного, первого попавшегося файла?
Просто, чтобы попробовать отработку 24 прерывания?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
02.12.2011, 14:59
общий
да
имя первого файла
давно
Посетитель
7438
7205
02.12.2011, 15:43
общий
это ответ
Здравствуйте, Дмитрий!
Вот Вам программа

[code h=207]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, dta ;установим свою область DTA
mov ah, 1ah
int 21h

lea dx, sMask ;a:\*.*
mov cx, 26h ;все:и readonly, и system, и hidden
mov ah, 4eh ;ищем файлы
int 21h
jc NotFound

lea si, dta.fname ;имя файла в DTA
jmp PrintMessage

NotFound:
lea si, sNotFound
cmp ax, 18 ;ошибка "не найдено в поиске"
je PrintMessage
lea si, not_ready ;все остальное считаем, что устройство не готово
PrintMessage: ;вывод сообщения из ds:[si]
mov ah, 0eh ;сначала сделаем перевод строки
mov al, 0dh
int 10h ;функцией БИОС
mov al, 0ah
PrintLoop:
int 10h
lodsb
cmp al, 0
jne PrintLoop

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

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

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

main 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

_DTA struc
res db 21 dup (?)
attr db ?
time dw ?
date dw ?
len dd ?
fname db 13 dup (?)
_DTA ends

data segment
sNotFound db 'Files not found',0
sAny db 0dh,0ah,'Press any key$',0
sMask db 'a:\*.*',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

dta _DTA <>
data ends

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

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