|
Монітор використання ресурсів комп'ютера
Монітор використання ресурсів комп'ютера
6 Міністерство освіти і науки України Кiровоградський Державний Технiчний Унiверситет Факультет автоматики енергетики та програмування Кафедра програмного забезпечення Курсовая работа з дисципліни “ASM-86 ” на тему: "Монітор використання ресурсів комп'ютера" Зміст - 1. Вступ
- 2. Постановка задачі
- 3. Обґрунтування вибору методів розв'язку задачі
- 4. Алгоритм програми
- 5. Реалізація програми
- 6. Системні вимоги
- 7. Інструкція для користувача
- 8. Висновки
- 9. Використана література
- Додаток
1. ВступТепер комп'ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп'ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп'ютери одержали широке розповсюдження, комп'ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.Але є багато типів комп'ютерів, які розрізняються своїми можливостями. Щоб досконаліше знати можливості свого комп'ютера, призначені програми, які виводять на екран характеристики машини.2. Постановка задачіРозробити програму “Монітор використання ресурсів комп'ютера" на мові програмування ASM-86.3. Обґрунтування вибору методів розв'язку задачіОтже, необхідно написати програму, яка виводе на екран ресурси комп'ютера. При виборі алгоритму програми у мене виникло багато варіантів, бо ресурси машини можна знаходити різними засобами. Але на мою думку, я вибрав алгоритми, які більш-менш прості та зрозумілі користувачу.4. Алгоритм програмиАлгоритм головної програми:Очищення екрануВиведення рамкиАналізує і виводить тип комп'ютераАналізує і виводить версію MS-DOSАналізує і виводить день тижняАналізує і виводить поточну датуПідготовка виводу системного часуАналізує і виводить розмір пам'ятіАналізує і виводить інформацію про дискАналізує і виводить інформацію про мікропроцесорВиклик процедури виводу часуЧитання порту клавіатуриПорівняння з ESC14Якщо не ESC, продовження виводу часу15. Закінчити програму.5. Реалізація програмиПрограма написана на мові ASM-86 з використанням команд процесора 86/286. Вона складається з головної програми, яка викликає процедури, та процедур, які виконують необхідні дії по визначенню ресурсів машини.Для визначення системної дати та дня тижня я використовував функцію 2AH переривання 21H.Для визначення системного часу я використовував функцію 2СH переривання 21H.Для визначення розміру пам'яті я використовував пам'ять CMOS, порти 70h та 71h.Для визначення метки тому, формату FAT я читав BOOT-сектор диску, та аналізував інформацію в ньому. Читання сектору я проводив за допомогою переривання 25H.Для визначення вільного місця, кількості загальних та вільних кластерів я використовував функцію 36H переривання 21H.Для визначення версії DOS я використовував функцію 30H переривання 21H.Для визначення типу комп'ютера я використовував байт пам'яті, який знаходиться по адресу: 0F000H: 0FFFEH.Програма компілюється Turbo Assembler, зв'язується за допомогою TLINK.6. Системні вимогиIBM сумісний комп'ютер із мікропроцесором Intel 80086 або старшим.Операційна система - ДОСПам'ять - 640 К і вище7. Інструкція для користувачаДля запуску програми-монітору використання ресурсів комп'ютера, потрібно в командному рядку набрати kurs1. exe та натиснути Enter.Програма аналізує та виводе на екран відомості про тип комп'ютера, поточну дату, день тижня, розмір пам'яті, розмір розширеної пам'яті, версію MS-DOS, метку тому диска, формат FAT диску, вільне місце на диску, кількість вільних кластерів на диску та тип процесора. Також програма виводе на екран поточний час до тих пір, поки користувач не натисне клавішу ESC.8. ВисновкиОтже, на мові ASM-86 створено програму-монітор використання ресурсів комп'ютера.9. Використана література1. Р. Джордейн “Справочник программиста персональных компьютеров типа IBM PC” М: Мир, 1991р.2. П. Абель “Мова асемблера для IBM PC та програмування." М.: Вища школа, 1992.3. “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.3094. “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.1555. “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.1786. “Макро Асемблер” К.С. Кропiйко, О.Д. Богатирова. Київ - “Наука” 1991р.7. Електронний довідник BOOK. ДодатокЛістинг програмиSTACKSG SEGMENT PARA STACK 'Stack'; СтекDW 32 DUP (?)STACKSG ENDS; - ---------------------------------------------------DATASG SEGMENT PARA 'Data'; Данныеsaved_cpuid dd?vendor_id db 12 dup (?)cpu_type db?themodel db?stepping db?id_flag db 0intel_proc db 0id_msg db "Ця система маэ: $"c8086 db "8086/8088 мiкропроцессор$"c286 db "Intel 286 мiкропроцнссор$"c386 db "Intel386 (TM) мiкропроцессор$"c486 db "Intel486 (TM) DX мiкропроцессор$"Pentium db "Pentium (TM) мiкропроцессор", 13, 10, '$'intel db " Genuine Intel Processor", 13, 10, "$"modelmsg db "Модель: $"steppingmsg db "Шаг: $"familymsg db "Процессор сiмейства: $"period db ". ",13,10,"$"dataCR db?,13,10,"$"intel_id db "GenuineIntel"TYPEC DB 'Тип комп"ютера','$'MJR DB 'PCjr ','$'MPC DB 'PC','$'MXT DB 'XT','$'MAT DB 'AT','$'VER DB 'ВЕРСIЯ MS-DOS ','$'STAR DB 2 DUP (?)TOCH DB '. 'MLAD DB 2 DUP (?)TOCH1 DB '. ','$'SDAT DB 'СИСТЕМНA ДАТА ','$'GOD1 DB 2 DUP (?)GOD2 DB 2 DUP (?),'-'MUNS DB 2 DUP (?),'-'DAY DB 2 DUP (?)TOCH2 DB '. ','$'MEMMS DB 'Розмiр пам"ятi','$'MEMMS1 DB 'Розмiр розширеноi пам"ятi','$'MEM1 DB 2 DUP (?)MEM2 DB 2 DUP (?),'$'DENTIG DB 'День тиждня','$'NED DB 'Недiля',13,10,'$'PON DB 'Понедiлок',13,10,'$'VIV DB 'Вiвторок',13,10,'$'SER DB 'Середа',13,10,'$'CHE DB 'Четверг',13,10,'$'PYA DB 'П"ятниця',13,10,'$'SUB DB 'Субота',13,10,'$'TIME DB 'Системний час','$'HOUR DB 2 DUP (?),': 'MIN DB 2 DUP (?),': 'SEC DB 2 DUP (?),'$'COL DB 00ROW DB 00chast dw 00sit db 10 dup ('$'); строка для выводаSpace dw 00h; longdw 00hBuffer dw 17000 dup (00);prompt1 db 13,10,' Кiлькiсть вiльних кластерiв на диску = ','$'prompt2 db 13,10,' Доступне дискове пространство = ','$'prompt3 db 13,10,' Кiлькiсть всього кластерiв на диску = ','$'prompt4 db 13,10,' Загальне дискове пространство = ','$'MetkaToma db 13,10,' Метка тому = ',11 dup (0),'$'RFAT db 13,10,' Формат FAT = ',8 dup (0),'$'Sectors_Per_Cluster dw 00hfree_cluster dw 00zag_cluster dw 00fat_format dw 00crlf db 13,10,'$'mnoj dd 00hfor_eax dd 00hfor_eax1 dd 00hostt dd 00hmemo dd 0ahDATASG ENDS; - ---------------------------------------------------CODESG SEGMENT PARA 'Code'; Код программыBEGIN PROC FARASSUME CS: CODESG,DS: DATASG,SS: STACKSG,ES: DATASGPUSH DSSUB AX,AX; Обнуление AXPUSH AXMOV AX,DATASG; Загрузка сегмента данныхMOV DS,AXMOV ES,AXMOV AX,0600HCALL Q10SCR; Очистить экранCALL Q20CURS; Установить курсорCALL TABL; Выводит рамкуCALL COMP1; Анализирует и выводит тип компютераCALL MSDOSVER; Анализирует и выводит версию MS-DOSCALL SYSTDAT; Анализирует и выводит день неделиCALL SMM1; Анализирует и выводит текущую датуCALL TIME1; Подготовка вывода системного времениCALL MEMORY2; Анализирует и выводит размер памятиCALL DISC; Анализирует и выводит информацию о дискеCALL CPUID; Анализирует и выводит информацию о микропроцессореAS:CALL TIME2; Вызов процедуры вывода времениin al,60h; Чтение порта клавиатурыcmp al,1; Сравнение с ESCjne as; Если не ESC, продолжение вывода времениmov ah,004ch; Выход из программыint 21hRETBEGIN ENDPCPUID PROC.8086; This part of the program must run on an 8086call get_cpuidcall printRETCPUID ENDPget_cpuid proc; 8086 CPU check; Bits 12-15 are always set on the 8086 processorcheck_8086:pushf; save FLAGSpop bx; store FLAGS in BXmov ax, 0fffh; clear bits 12-15and ax, bx; in FLAGSpush ax; store new FLAGS calue on stackpopf; replace current FLAGS valuepushf; set new flagspop ax; store new flags in AXand ax, 0f000h; if bits 12-15 are set, then CPUcmp ax, 0f000h; is an 8086/8088mov cpu_type, 0; save the CPU typeje END1JMP FF1END1: RETFF1:; Intel 286 CPU check; Bits 12-15 are always clear on the Intel processor.check_80286:.286or bx, 0f000h; try to set bits 12-15push bxpopfpushfpop axand ax, 0f000h; if bits 12-15 are cleared,; CPU=Intel 286mov cpu_type, 2; turn on Intel 286 Cpu flagjz END2; if CPU is intel 286, checkJMP FF2; for Intel 287 math coprocessorEND2: RETFF2:; Intel386 CPU check; The AC bit (bit 18), is a new bit introduced in the EFLAGS; register on the Intel486 DX CPU to generate alignment faults.; This bit can not be set on the Intel386 CPU.;check_intel386:.386pushfdpop eax; get original EFLAGSmov ecx,eax; save original EFLAGSxor eax,40000h; flip AC bit in EFLAGSpush eax; save for EFLAGSpopfd; copy to EFLAGSpushfd; push EFLAGSpop eax; get new EFLAGS valuexor eax,ecx; can't toggle AC bit, CPU=Intel386mov cpu_type, 3; turn on Intel386 CPU flagje end_get_cpuid; if CPU is Intel386, now check; for an Intel 287 or Intel387 MCP; Intel486 DX CPU, Intel 487 SX MCP, and Intel486 SX CPU checking;; Checking for the ability to set/clear the ID flag (bit 21) in EFLAGS; which diferentiates between Pentium (or greater) and the Intel486.; If the ID flag is set then the CPUID instruction can be used to; determine the final version of the chip, else it's a 486;;check_Intel486:.486mov cpu_type, 4; turn on Intel486 CPU flagpushfd; push original EFLAGSpop eax; get original EFLAGS in eaxmov ecx,eax; save original EFLAGS in ecxor eax, 200000h; flip ID bit in EFLAGSpush eax; save for EFLAGSpopfd; copy to EFLAGSpushfd; push EFLAGSpop eax; get new EFLAGS valuexor eax,ecxje end_get_cpuid; if ID bit cannot be changed,; CPU=Intel486 without CPUID; instruction functionality; Otherwise, execute CPUID instruction to determine vendor,; family, model and stepping.check_vendor:.586mov id_flag, 1; set flag for indicating use of; CPUID instmov eax, 0; set up for CPUID instructioncpuidmov dword ptr vendor_id, ebx; Test for "GenuineIntel" vendor id.mov dword ptr vendor_id [+4], edxmov dword ptr vendor_id [+8], ecxmov si, offset vendor_idmov di, offset intel_idmov cx, length intel_idcompare:repe cmpsbcmp cx, 0; must be a GenuineIntel if ecx =0jne cpuid_dataintel_processor:mov intel_proc, 1mov [intel-1], '¦'; add a space so the Genuine Intel; message prints out.cpuid_data:mov eax, 1cpuidmov saved_cpuid,eax; save for future useand eax, 0F00H; mask everything but familyshr eax, 8mov cpu_type, al; set cpu_type with familymov eax,saved_cpuid; restore datamov stepping, aland stepping, 0FH; isolate stepping infomov eax, saved_cpuidmov themodel, aland themodel, 0F0H; isolate model infoshr themodel, 4end_get_cpuid:.8086retget_cpuid endp;; This procedure prints the appropriate cpuid string; If the CPUID instruction was supported, it prints out; the cpuid info.print procpush axpush bxpush cxpush dxMOV COL,2MOV ROW,15CALL Q20CURSmov dx, offset id_msgmov ah, 9hint 21h; print initial messagecmp id_flag, 1; if set to 1, cpu supported CPUID; instruction; print detailed CPUID informationje print1print_86:cmp cpu_type, 0jne print_286MOV COL,30MOV ROW,16CALL Q20CURSmov dx, offset c8086mov ah, 9hint 21hjmp end_printprint1: jmp print_cpuid_dataprint_286:cmp cpu_type, 2jne print_386MOV COL,30MOV ROW,16CALL Q20CURSmov dx, offset c286mov ah, 9hint 21hjmp end_printprint_386:cmp cpu_type, 3jne print_486MOV COL,30MOV ROW,16CALL Q20CURSmov dx, offset c386mov ah, 9hint 21hjmp end_printprint_486:MOV COL,30MOV ROW,16CALL Q20CURSmov dx, offset c486mov ah, 9hint 21hjmp end_printprint_cpuid_data:cmp cpu_type, 5jne print_cpuid_contMOV COL,30MOV ROW,16CALL Q20CURSmov dx, offset Pentiummov ah, 9int 21hprint_cpuid_cont:MOV COL,2MOV ROW,16CALL Q20CURSmov dx, offset familymsg; print family msgmov ah, 9hint 21hmov al, cpu_typemov byte ptr dataCR, aladd byte ptr dataCR, 30H; convert to ASCIIMOV COL,30MOV ROW,17CALL Q20CURSmov dx, offset dataCR; print family infomov ah, 9hint 21hMOV COL,2MOV ROW,18CALL Q20CURSmov dx, offset steppingmsg; print stepping msgmov ah, 9hint 21hmov al, steppingmov byte ptr dataCR, aladd byte ptr dataCR, 30H; convert to ASCIIMOV COL,30MOV ROW,18CALL Q20CURSmov dx, offset dataCR; print stepping infomov ah, 9hint 21hMOV COL,2MOV ROW, 19CALL Q20CURSmov dx, offset modelmsg; print model msgmov ah, 9hint 21hmov al, themodelmov byte ptr dataCR, aladd byte ptr dataCR, 30H; convert to ASCIIMOV COL,30MOV ROW, 19CALL Q20CURSmov dx, offset dataCR; print stepping infomov ah, 9hint 21hend_print:pop dxpop cxpop bxpop axRETprint endpTABL PROC; Процедура вывода рамкиMOV CX,78; Количество симв. для верт. линии рамкиMOV COL,1MOV ROW,0CALL Q20CURSLINE: MOV AH,02HMOV DL, 205; Вывод верт. верхней линии рамкиINT 21HLOOP LINEMOV CX,22; Количество симв. для гориз. линии рамкиMOV DH,1LINE2: MOV COL,0MOV ROW,DHCALL Q20CURS; Установка курсораMOV AH,02HMOV DL,186; Вывод гориз. левой линии рамкиINT 21HINC DHLOOP LINE2MOV CX,22MOV DH,1LINE3: MOV COL,79MOV ROW,DHCALL Q20CURSMOV AH,02HMOV DL,186; Вывод гориз. правой линии рамкиINT 21HINC DHLOOP LINE3MOV CX,78MOV COL,1MOV ROW,23CALL Q20CURSLINE1: MOV AH,02HMOV DL, 205; Вывод вертик. нижней линии рамкиINT 21HLOOP LINE1MOV COL,79; Вывод углов рамкиMOV ROW,0CALL Q20CURSMOV AH,02HMOV DL,187INT 21HMOV COL,0MOV ROW,0CALL Q20CURSMOV AH,02HMOV DL, 201INT 21HMOV COL,0MOV ROW,23CALL Q20CURSMOV AH,02HMOV DL, 200INT 21HMOV COL,79MOV ROW,23CALL Q20CURSMOV AH,02HMOV DL,188INT 21HRETTABL ENDPCOMP1 PROC; Процедура анализирования и вывода; информации про тип компютераMOV COL,1MOV ROW,1CALL Q20CURS; Установка курсораLEA DX,TYPEC; Вывод сообщения о типеMOV AH,09HINT 21HMOV AX,0F000H; Чтение типа комп. по адресу 0F000H: 0FFFEHMOV ES,AXMOV AL,ES: [0FFFEH]CMP AL,0FDH; Проверка на JRJE JRCMP AL,0FFH; Проверка на PCJE PCCMP AL,0FEH; Проверка на XTJE XTCMP AL,0FCH; Проверка на ATJE AT; Переход на вывод ATJR: MOV COL,30MOV ROW,1CALL Q20CURS; Установка курсораLEA DX,MJR; Вывод JRMOV AH,09HINT 21HRETPC: MOV COL,30MOV ROW,1CALL Q20CURS; Установка курсораLEA DX,MPC; Вывод PCMOV AH,09HINT 21HRETXT: MOV COL,30MOV ROW,1CALL Q20CURS; Установка курсораLEA DX,MXT; Вывод XTMOV AH,09HINT 21HRETAT: MOV COL,30MOV ROW,1CALL Q20CURS; Установка курсораLEA DX,MAT; Вывод ATMOV AH,09HINT 21HRETCOMP1 ENDPMSDOSVER PROC; Процедура анализирования и вывода версии MS-DOSMOV AH,30HINT 21H; читаем номер версии DOSMOV STAR,AL; переводим старшую часть версии в символOR STAR,30HMOV AX,0000; переводим младшую часть версии в символыMOV AL,AHMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV MLAD,ALMOV [MLAD+1],AHMOV COL,1; Столбец 1MOV ROW,2; Строка 2CALL Q20CURS; Установка курсораLEA DX,VER; вывод младшей части версииMOV AH,09HINT 21HMOV COL,30MOV ROW,2CALL Q20CURS; Установка курсораLEA DX,STAR; вывод старшей части версииMOV AH,09HINT 21HRETMSDOSVER ENDPSYSTDAT PROC; Процедура анализирования и вывода дня неделиMOV COL,1MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,DENTIG; Вывод сообщенияMOV AH,09HINT 21HMOV AH,2AHINT 21H; Чтение даты и дня неделиCMP AL,0; Проверка на воскресенеJE VOS; Переход на вывод воскр.CMP AL,1JE POCMP AL,2JE VTCMP AL,3JE SRCMP AL,4JE CHTCMP AL,5; Проверка на пятницуJNE mqjmp PTmq: CMP AL,6; Проверка на суботуMOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,SUBMOV AH,09HINT 21HRETVOS: MOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,NEDMOV AH,09HINT 21H; Вывод воскр.RETPO: MOV COL,30MOV ROW,3CALL Q20CURSLEA DX,PONMOV AH,09HINT 21H; Вывод пон.RETVT: MOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,DENTIGMOV AH,09HINT 21HLEA DX,VIVMOV AH,09HINT 21H; Вывод вт.RETSR: MOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,SERMOV AH,09HINT 21H; Вывод ср.RETCHT: MOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,CHEMOV AH,09HINT 21H; Вывод четвергRETPT: MOV COL,30MOV ROW,3CALL Q20CURS; Установка курсораLEA DX,PYAMOV AH,09HINT 21H; Вывод пятницыRETSYSTDAT ENDPSMM1 PROC; Процедура анализирования и вывода текущей датыMOV AH,2AHINT 21H; Чтение датыMOV AX,0000; Перевод числа в символьный видMOV AL,DLMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV DAY,ALMOV [DAY+1],AHMOV AH,2AH; Чтение датыINT 21HMOV AX,0000; Перевод месяца в символьный видMOV AL,DHMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV MUNS,ALMOV [MUNS+1],AHMOV AH,2AHINT 21H; Чтение датыMOV COL,1MOV ROW,4CALL Q20CURS; Установка курсораLEA DX,SDAT; Вывод сообщения о датеMOV AH,09HINT 21HMOV COL,30MOV ROW,4CALL Q20CURS; Установка курсораmov dx,cxcall dec16out; Перевод года в символьный вид и его выводLEA DX,MUNS-1; Вывод месяца и числаMOV AH,09HINT 21HRETSMM1 ENDPTIME1 PROCMOV COL,1MOV ROW,5CALL Q20CURS; Установка курсораLEA DX,TIME; Вывод сообщения о времениMOV AH,09HINT 21HRETTIME1 ENDPTIME2 PROC; Процедура анализирования и вывода текущего времениmov ah,1mov ch,10hmov cl,0int 10h; Скрытие курсораMOV AH,2CH; Чтение текущего времениINT 21HMOV AX,0000; Перевод часов в символьный видMOV AL,CHMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV HOUR,ALMOV [HOUR+1],AHMOV AH,2CHINT 21H; Чтение текущего времениMOV AX,0000; Перевод минут в символьный видMOV AL,CLMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV MIN,ALMOV [MIN+1],AHMOV AH,2CHINT 21H; Чтение текущего времениMOV AX,0000; Перевод секунд в символьный видMOV AL,DHMOV BH,0ahDIV BHOR AL,30HOR AH,30HMOV SEC,ALMOV [SEC+1],AHMOV COL,30MOV ROW,5CALL Q20CURS; Установка курсораLEA DX,HOUR; Вывод текущего времениMOV AH,09HINT 21HRETTIME2 ENDPspace_count proc; Процедура анализирования; свободного места на диске; Free_Space=ax*cx*bx;mov ah,36hmov dl,0int 21h; читаем размер свободного пространства.386mov Sectors_Per_Cluster,ax; сохранение значения секторов на кластерmov free_cluster,bx; сохранение значения свободных кластеровmov zag_cluster,dx; сохранение значения всего кластеровmul bx; результат - в DX: AXmov word ptr for_eax,dxmov word ptr for_eax1,axxor eax,eaxmov eax,dword ptr for_eaxshl eax,16or eax,dword ptr for_eax1mov word ptr mnoj,cx; EDX: EAXmul mnojcall perevod; перевод числа в строкуretspace_count endpperevod proc; Процедура перевода числа в строку.386lea si,sitxor cx,cx; counterjmp oop1onz: mov edx,dword ptr spacemov eax,ebxoop1:xor ebx,ebx; part of resultoop: cmp edx,00jne delycmp eax,memojl yesdely:sub eax,memosbb edx,00add ebx,1adc space,0jmp oopyes: mov dword ptr ostt,eaxmov dx,word ptr osttor dl,30h; перевести в символьный видmov [si],dl; сохранить символьный вид 10-ой цифры в строкеinc si; перейти к следующей позицииinc cxcmp dword ptr space,00h; проверка на наличие 10-ых знаков для выводаjne onz; продолжение выделения отдельных цифрcmp ebx,00hjne onzdec siretperevod endpdisp_c proc; Процедура вывода свободного места на дискеmov ah,9; вывести сообщение о свободном местеlea dx,prompt2int 21hokp:mov ah,2h; функция вывода символовmov dl, [si] ;int 21h; Вывод свободного местаdec siloop okpretdisp_c endpvyv_dec1 proc; Процедура анализирования и вывода количества; свободных кластеровlea si,sitxor cx,cxmov al,0ahcbwmov bx,axmov ax,free_clustermov chast,axmmm:xor dx,dxmov ax,chastdiv bxmov chast,ax; octatok - in dxor dl,30hmov [si],dlinc siinc cxcmp chast,00hjne mmmdec sim1:mov dl, [si]mov ah,2hint 21hdec siloop m1retvyv_dec1 endpvyv_dec2 proc; Процедура анализирования и вывода количества; свободных кластеровlea si,sitxor cx,cxmov al,0ahcbwmov bx,axmov ax,zag_clustermov chast,axmmmqw:xor dx,dxmov ax,chastdiv bxmov chast,ax; octatok - in dxor dl,30hmov [si],dlinc siinc cxcmp chast,00hjne mmmqwdec sim1qw:mov dl, [si]mov ah,2hint 21hdec siloop m1qwretvyv_dec2 endpclust_count proc; Процедура анализирования и вывода количества; свободных кластеровmov ah,9h; функция выводаlea dx,prompt1; сообщения о своб. кластерахint 21h; вызов DOScall vyv_dec1; Вызов процедуры вывода свободных кластеровmov ah,9h; функция выводаlea dx,prompt3; сообщения о своб. кластерахint 21h; вызов DOScall vyv_dec2; Вызов процедуры вывода свободных кластеровretclust_count endpget_logic_boot proc; Процедура анализирования BOOT-сектораmov dx,0mov cx,0ffffhlea bx,Buffermov dword ptr Buffer,0; с какого сектора начинать чтениеmov word ptr Buffer+4,1; количество секторов для чтенияmov word ptr Buffer+6,bx; Адрес буфера (смещение)mov ax,dsmov word ptr Buffer+8,ax; Адрес буфера (сегмент)mov al,3; функция чтенияint 25h; Чтение BOOT-сектораpop dx; восстановление стека после int 25hcld; установка направления вперед для movsbpush ds; установка es на сегмент данныхpop esmov si,offset Buffer [43] ; регистр si - смещение Buffer [43] -метка томаmov di,offset MetkaToma [16] ; регистр di - смещение MetkaToma [16] -метка томаmov cx,11; колич. символов в метке томаrep movsb; копирование метки тома в переменнуюmov dx,offset MetkaToma; Вывод метки томаmov ah,9int 21hmov si,offset Buffer [54] ; регистр si - смещение Buffer [54] -тип FATmov di,offset RFAT [16] ; регистр di - смещение RFAT [16] -тип FATmov cx,8; колич. символов в типе FATrep movsb; копирование типа FAT в переменнуюmov dx,offset RFAT; Вывод типа FATmov ah,9int 21hretget_logic_boot endpDISC PROC; Процедура анализирования и вывода информации о дискеcall get_logic_boot; Вызов процедуры анализирования BOOT-сектораcall space_count; Вызов процедуры анализирования свободного местаcall disp_c; Вызов процедуры вывода свободного местаcall clust_count; Вызов процедуры анализирования и вывода количества; свободных кластеровRETDISC ENDPQ10SCR PROC NEAR; Процедура прокрутки экрана; AX установлен при вызовеMOV BH,31; Цвет (07 для ч/б)SUB CX,CXMOV DX,184FHINT 10H; прокрутка экранаRETQ10SCR ENDPQ20CURS PROC NEAR; Процедура установки курсораMOV AH,02SUB BH,BHMOV DH,ROWMOV DL,COLINT 10H; Установка курсораRETQ20CURS ENDPMEMORY2 PROC; Процедура анализирования и вывода размера памятиMOV COL,2MOV ROW,6CALL Q20CURS; Установка курсораLEA DX,MEMMS; Вывод сообщения о памятиMOV AH,09HINT 21HMOV COL,30MOV ROW,6CALL Q20CURS; Установка курсораmov al,15h; Установка для чтения из CMOSout 70h,al; младшего байта размера памятиnopxor ax,axin al,71h; Чтение из CMOS размера памятиmov bx,axmov al,16h; Установка для чтения из CMOSout 70h,al; старшего байта размера памятиnopxor ax,axin al,71h; Чтение из CMOS размера памятиshl ax,8add bx,axmov dx,bxcall dec16out; Перевод размера памяти в строку и его выводMOV COL,2MOV ROW,7CALL Q20CURS; Установка курсораLEA DX,MEMMS1; Вывод сообщения о расширенной памятиMOV AH,09HINT 21HMOV COL,30MOV ROW,7CALL Q20CURS; Установка курсораmov al,17h; Установка для чтения из CMOSout 70h,al; младшего байта размера расширенной памятиnopxor ax,axin al,71h; Чтение из CMOS размера расширенной памятиmov bx,axmov al,18h; Установка для чтения из CMOSout 70h,al; старшего байта размера расширенной памятиnopxor ax,axin al,71h; Чтение из CMOS размера расширенной памятиshl ax,8add bx,axmov dx,bxcall dec16out; Перевод расширенного размера памяти в строку; и его выводRETMEMORY2 ENDPdec16out proc near; Процедура перевода 16-битного кода в строку; DX-число для переводаdec16out0:push ds; сохраняем используемые регистры в стекеpush dipush dxpush cxpush ax; помещение символьных цифр во временный буферmov cx,0mov di, offset cs: tbuff; адрес временного буфераdec16out1:push cx; сохранить cxmov ax,dxmov dx,0mov cx,10div cx; деление на 10xchg ax,dx; получение остаткаadd al,30h; перевод цифры в символmov cs: [di],al; поместить символ в буферinc di; переход к следующему символуpop cx; восстановить cxinc cx; увеличить количество цифрcmp dx,0; проверка частного на 0jnz dec16out1; если не равно, продолжать выделение цифрdec16out2:dec di; вывод символов буфера в обратном порядкеmov al,cs: [di]call stdout; Вызов процедуры вывода символа на экранloop dec16out2pop ax; восстанавливаем сохраненные регистры из стекаpop cxpop dxpop dipop dsretdec16out endpstdout proc near; Процедура вывода символа на экранpush dxmov dl,al;mov ah,2; функция вывода символа на экранint 21h; вывод символаpop dxrettbuff db 255 dup ('$')stdout endpCODESG ENDSEND BEGIN
|
|