Консультация № 195835
12.06.2019, 17:37
0.00 руб.
0 6 0
Уважаемые эксперты! Дали задание на ргр:
Создать метку тома дискеты, значение которой вводится с клавиатуры (ввод с клавиатуры средствами DOS, а также вывод на экран в текстовом режиме)
Не понимаю что это такое, подскажите, пожалуйста

Обсуждение

давно
Посетитель
7438
7205
12.06.2019, 17:41
общий
Адресаты:
Здравствуйте! Вы еще работаете с дискетами?
У тома дискеты, как и у любого диска есть имя (метка). Вот и требуется присвоить новое имя дискете... Вот и все...
Пробуйте, пишите сюда, поможет, подправим...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403126
4
12.06.2019, 17:51
общий
Адресаты:


Есть некоторые наброски, но это неправильный вариант решения вопроса
Код:

;---в сегменте данных
VOL_STRING DB 'The volume label is $'
NO_LABEL DB 'There is no volume label $'
DIR_AREA DB 3584 DUP(?)

;---читаем 7 секторов каталога
MOV AX,SEG DIR_AREA ;сегмент буфера
MOV ES,AX ;
MOV BX,OFFSET DIR_AREA ;смещение буфера
MOV DL,0 ;номер накопителя
MOV DH,0 ;номер головки
MOV CH,0 ;номер дорожки
MOV CL,6 ;стартовый сектор

MOV AL,7 ;число секторов каталога
MOV AH,2 ;номер функции чтения
INT 13H ;читаем каталог в память
;---ищем метку тома, сравнивая байт атрибутов с 8
MOV CX,112 ;число элементов
ADD BX,11 ;смещение для атрибутов
TRY_AGAIN: MOV AL,[BX] ;берем 1-й элемент
CMP AL,8 ;это метка тома?
JE GOT_IT ;если да, то уход
ADD BX,32 ;иначе на след. элемент
LOOP TRY_AGAIN ;
;---выводим сообщение об отсутствии метки тома
MOV AH,9 ;функция вывода строки
LEA DX,NO_LABEL ;указываем на строку
INT 21H ;выводим ее
JMP SHORT CONTINUE ;на конец
;---выводим строку, дающую метку тома
GOT_IT: MOV AH,9 ;функция вывода строки
LEA DX,VOL_STRING ;указываем на строку
INT 21H ;выводим ее
SUB BX,11 ;указатель на метку
MOV CX,11 ;пишем 11 символов
MOV AH,2 ;функция вывода символов
NEXT_CHAR: MOV DL,[BX] ;символ в DL
INT 21H ;выводим символ
INC BX ;переходим к следующему
LOOP NEXT_CHAR ;
давно
Посетитель
7438
7205
13.06.2019, 20:20
общий
Адресаты:
Читать при помощи 13h - плохая идея
Идея должна быть такая:
Volume label - метка тома, это обычный файл с атрибутом 8h.
Метку тома легко найти простым поиском файлов, по маске '*.*' с атрибутом 8h, функцией FindFirst, сервиса int 21h.
Если файл найден, то это и есть метка тома, только придется вручную вырезать из имени точку (если она есть).
Если не найден, то метка отсутствует (NO_NAME).
Установить метку, по идее, можно функцией 16h, сервиса int 21h - Create truncate file using FCB.
Последнее никогда не пробовал...
Дерзайте

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403126
4
18.06.2019, 10:51
общий
19.06.2019, 10:58
Адресаты:
Код:

text segment 'code'

assume CS:text, DS:text
org 100h

main:
; очистка экрана : начало
mov AX, 0600h ; AH=06 (прокрутка)
; AL=00 (весь экран)
mov BH, 07 ;Нормальный атрибут (черно/белый)
mov CX, 0000h ;Верхняя левая позиция
mov DX, 184fh ;Нижняя правая позиция
int 10h ;Передача управления в BIOS
; очистка экрана : конец

mov ah,09
lea dx,msg_lb1
int 21h

mov ah,09
lea dx,msg_lb2
int 21h

mov ah,09
lea dx,msg_lb3
int 21h

mov ah,09
lea dx,msg_lb4
int 21h

mov ah,09
lea dx,msg_lb5
int 21h

; перевод размера программы в символьный вид: начало
lea DI, msg_size[20]
mov AX, word ptr _size
call GET_CHAR
; перевод размера программы в символьный вид : конец
; устанавливаем позицию курсора для вывода ФИО и группы
mov AH, 02 ;Запрос на установку курсора
mov BH, 00 ;Экран 0
mov DH, 01 ;Строка 01
mov DL, 00 ;Столбец 00
int 10h ;Передача управления в BIOS
; выводим ФИО и группу
lea DX, m1
call PRINT
; устанавливаем позицию курсора для приглашения ввести новую метку
mov AH, 02 ;Запрос на установку курсора
mov BH, 00 ;Экран 0
mov DH, 06 ;Строка 06
mov DL, 00 ;Столбец 00
int 10h ;Передача управления в BIOS
; выводим приглашение ввести новую метку
lea DX, msg_lb
call PRINT
; считываем новую метку тома дискеты с клавиатуры
lea DX, sLabel+1 ;Загрузка адреса сообщ.
mov BX, DX ;копируем смещение в рег. BX
mov AL, 12 ;заносим в AX
mov [BX], AL ;пересылать содержимое регистра AL по адресу, лежащему в регистре DX
mov AH, 0Ah
int 21h
; сохраняем количество реально введённых символов
xor CX, CX ;делим на 10
mov CL, byte ptr sLabel[2]
add CL, 3
mov DI, CX
; дописывам префикс к метке тома, указав диск A:
mov [sLabel+0], byte ptr 'C'
mov [sLabel+1], byte ptr ':'
mov [sLabel+2], byte ptr '\'
mov [sLabel+DI], 00
; устанавливаем позицию курсора для вывода сообщения о результате
mov AH, 02 ;Запрос на установку курсора
mov BH, 00 ;Экран 0
mov DH, 08 ;Строка 08
mov DL, 00 ;Столбец 00
int 10h ;Передача управления в BIOS
; метка тома создаётся функцией создания файла
mov AH, 3ch ;АН = 3Ch (номер функции DOS)
mov CX, 08
lea DX, [sLabel]
int 21h
jc L_ERR
; выводим сообщение об успешной смене метки тома
lea DX, msg_ok
call PRINT

L_EXIT:
; устанавливаем позицию курсора для вывода размера программы
mov AH, 02
mov BH, 00
mov DH, 10
mov DL, 00
int 10h

; выводим размер программы
lea DX, msg_size
call PRINT

; функция ожидания нажатия клавиши
mov AH, 08h
int 21h
; выход из программы в DOS
mov AX, 4C00h
int 21h

L_ERR: ; обработка ошибочной ситуации
lea DX, msg_err
call PRINT
jmp L_EXIT

PRINT proc ; вывод сообщения
push AX
mov AH, 09h
int 21h
pop AX
ret
PRINT endp

; функция перевода числового значения в строковой тип
GET_CHAR proc
mov CX,0010
СA:
cmp AX,0010
jb CB
xor DX,DX
div CX
or DL,30H
mov [DI],DL
dec DI
jmp СA
CB:
or AL,30H
mov [DI],AL
ret
GET_CHAR endp

; Поля данных
m1 db "",'$'
msg_size db "Razmer programmy: $"

msg_lb db "Vvedite novuyu metku: $"
msg_lb1 db "Raschetno-graficheskaya rabota",0ah,0dh,'$'
msg_lb2 db "Po discipline Sistemnoe programmnoe obespechenie",0ah,0dh,'$'
msg_lb3 db "Vipolnil: Student",0ah,0dh,'$'
msg_lb4 db "FIO ",0ah,0dh,'$'
msg_lb5 db "Variant :",0ah,0dh,'$'
msg_ok db "Metka diska C izmenena.",0ah,0dh,"$"
msg_err db "Oshibka! Metka ne smenena!",0ah,0dh,"$"
sLabel db 16 dup (00h)

; вычисляем размер программы
_size = $-main
text ends
end main
давно
Посетитель
403126
4
19.06.2019, 10:59
общий
Адресаты:
Извините, существует ли способ упростить этот код?
давно
Посетитель
7438
7205
19.06.2019, 11:38
общий
Адресаты:
Я бы делал так... [code lang=asm h=200]text segment 'code'

assume CS:text, DS:text
org 100h

main:
; очистка экрана : начало
mov ax, 0003h
int 10h

mov ah,09
lea dx,msg_lb1
int 21h

; выводим приглашение ввести новую метку
lea DX, msg_lb
call PRINT

; считываем новую метку тома дискеты с клавиатуры
lea DX, sLabel ;Загрузка адреса сообщ.
mov AH, 0Ah
int 21h

xor BX, BX
mov BL, cnt
mov byte ptr [sName+1], ':'
mov byte ptr [sName+2], '\'
mov byte ptr [data+BX], 0

; метка тома создаётся функцией создания файла
mov AH, 3ch ;АН = 3Ch (номер функции DOS)
mov CX, 08
lea DX, [sName]
int 21h
jc L_ERR
; выводим сообщение об успешной смене метки тома
lea DX, msg_ok
call PRINT

L_EXIT:

; выводим размер программы
lea DX, msg_size
call PRINT

mov AX, word ptr _size
call PRINT_AX

lea DX, msg_lf
call PRINT

; функция ожидания нажатия клавиши
mov AH, 08h
int 21h
; выход из программы в DOS
mov AX, 4C00h
int 21h

L_ERR: ; обработка ошибочной ситуации
lea DX, msg_err
call PRINT
jmp L_EXIT

PRINT proc ; вывод сообщения
push AX
mov AH, 09h
int 21h
pop AX
ret
PRINT endp

; функция перевода числового значения в строковой тип
PRINT_AX proc
mov bx, 10
xor cx, cx
PRINT_AX_div_loop:
xor dx, dx
div bx
inc cx
push dx
test ax, ax
jne PRINT_AX_div_loop
mov ah, 2
PRINT_AX_out_loop:
pop dx
or dl, '0'
int 21h
loop PRINT_AX_out_loop
ret
PRINT_AX endp

; Поля данных
msg_size db "Razmer programmy: $"

msg_lb db "Vvedite novuyu metku: $"
msg_lb1 db "Raschetno-graficheskaya rabota",0ah,0dh
db "Po discipline Sistemnoe programmnoe obespechenie",0ah,0dh
db "Vipolnil: Student",0ah,0dh
db "FIO Drozdov",0ah,0dh
db "Variant : 1 (for example)",0ah
msg_lf db 0dh,0ah,'$'

msg_ok db 0ah,0ah,0dh,"Metka diska C izmenena.",0ah,0dh,0ah,"$"
msg_err db 0ah,0ah,0dh,"Oshibka! Metka ne smenena!",0ah,0dh,0ah,"$"

sName db 'C'
sLabel db 12
cnt db 0
data db 13 dup (00h)

; вычисляем размер программы
_size = $-main
text ends
end main
[/code]Только я не уверен, что функция 3ch поменяет имя тома
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа