;---в сегменте данных
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 ;
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
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.