Смекни!
smekni.com

Монітор використання ресурсів комп'ютера (стр. 1 из 3)

Міністерство освіти і науки України

Кiровоградський Державний Технiчний Унiверситет

Факультет автоматики енергетики та програмування

Кафедра програмного забезпечення

Курсовая работа

з дисципліни

“ASM-86 ”

на тему:

"Монітор використання ресурсів комп'ютера"

Зміст

1. Вступ

2. Постановка задачі

3. Обґрунтування вибору методів розв’язку задачі

4. Алгоритм програми

5. Реалізація програми

6. Системні вимоги

7. Інструкція для користувача

8. Висновки

9. Використана література

Додаток

1. Вступ

Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.

Але є багато типів комп'ютерів, які розрізняються своїми можливостями. Щоб досконаліше знати можливості свого комп'ютера, призначені програми, які виводять на екран характеристики машини.

2. Постановка задачі

Розробити програму “Монітор використання ресурсів комп’ютера" на мові програмування ASM-86.

3. Обґрунтування вибору методів розв’язку задачі

Отже, необхідно написати програму, яка виводе на екран ресурси комп’ютера. При виборі алгоритму програми у мене виникло багато варіантів, бо ресурси машини можна знаходити різними засобами. Але на мою думку, я вибрав алгоритми, які більш-менш прості та зрозумілі користувачу.

4. Алгоритм програми

Алгоритм головної програми:

Очищення екрану

Виведення рамки

Аналізує і виводить тип комп'ютера

Аналізує і виводить версію MS-DOS

Аналізує і виводить день тижня

Аналізує і виводить поточну дату

Підготовка виводу системного часу

Аналізує і виводить розмір пам'яті

Аналізує і виводить інформацію про диск

Аналізує і виводить інформацію про мікропроцесор

Виклик процедури виводу часу

Читання порту клавіатури

Порівняння з ESC

14Якщо не 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р. ст.309

4. “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.155

5. “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.178

6. “Макро Асемблер” К.С. Кроп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 0

intel_proc db 0

id_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 00

ROW DB 00

chast dw 00

sit db 10 dup ('$'); строка для вывода

Space dw 00h; long

dw 00h

Buffer 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 00h

free_cluster dw 00

zag_cluster dw 00

fat_format dw 00

crlf db 13,10,'$'

mnoj dd 00h

for_eax dd 00h

for_eax1 dd 00h

ostt dd 00h

memo dd 0ah

DATASG ENDS

; - ---------------------------------------------------

CODESG SEGMENT PARA 'Code'; Код программы

BEGIN PROC FAR

ASSUME CS: CODESG,DS: DATASG,SS: STACKSG,ES: DATASG

PUSH DS

SUB AX,AX; Обнуление AX

PUSH AX

MOV AX,DATASG; Загрузка сегмента данных

MOV DS,AX

MOV ES,AX

MOV AX,0600H

CALL Q10SCR; Очистить экран

CALL Q20CURS; Установить курсор

CALL TABL; Выводит рамку

CALL COMP1; Анализирует и выводит тип компютера

CALL MSDOSVER; Анализирует и выводит версию MS-DOS

CALL SYSTDAT; Анализирует и выводит день недели

CALL SMM1; Анализирует и выводит текущую дату

CALL TIME1; Подготовка вывода системного времени

CALL MEMORY2; Анализирует и выводит размер памяти

CALL DISC; Анализирует и выводит информацию о диске

CALL CPUID; Анализирует и выводит информацию о микропроцессоре

AS:

CALL TIME2; Вызов процедуры вывода времени

in al,60h; Чтение порта клавиатуры

cmp al,1; Сравнение с ESC

jne as; Если не ESC, продолжение вывода времени

mov ah,004ch; Выход из программы

int 21h

RET

BEGIN ENDP

CPUID PROC

.8086; This part of the program must run on an 8086

call get_cpuid

call print

RET

CPUID ENDP

get_cpuid proc

; 8086 CPU check

; Bits 12-15 are always set on the 8086 processor

check_8086:

pushf; save FLAGS

pop bx; store FLAGS in BX

mov ax, 0fffh; clear bits 12-15

and ax, bx; in FLAGS

push ax; store new FLAGS calue on stack

popf; replace current FLAGS value

pushf; set new flags

pop ax; store new flags in AX

and ax, 0f000h; if bits 12-15 are set, then CPU

cmp ax, 0f000h; is an 8086/8088

mov cpu_type, 0; save the CPU type

je END1

JMP FF1

END1: RET

FF1:

; Intel 286 CPU check

; Bits 12-15 are always clear on the Intel processor.

check_80286:

.286

or bx, 0f000h; try to set bits 12-15

push bx

popf

pushf

pop ax

and ax, 0f000h; if bits 12-15 are cleared,

; CPU=Intel 286

mov cpu_type, 2; turn on Intel 286 Cpu flag

jz END2; if CPU is intel 286, check

JMP FF2; for Intel 287 math coprocessor

END2: RET

FF2:

; 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:

.386

pushfd

pop eax; get original EFLAGS

mov ecx,eax; save original EFLAGS

xor eax,40000h; flip AC bit in EFLAGS

push eax; save for EFLAGS

popfd; copy to EFLAGS

pushfd; push EFLAGS

pop eax; get new EFLAGS value

xor eax,ecx; can't toggle AC bit, CPU=Intel386

mov cpu_type, 3; turn on Intel386 CPU flag

je 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:

.486

mov cpu_type, 4; turn on Intel486 CPU flag

pushfd; push original EFLAGS

pop eax; get original EFLAGS in eax

mov ecx,eax; save original EFLAGS in ecx

or eax, 200000h; flip ID bit in EFLAGS

push eax; save for EFLAGS

popfd; copy to EFLAGS

pushfd; push EFLAGS

pop eax; get new EFLAGS value

xor eax,ecx

je 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:

.586

mov id_flag, 1; set flag for indicating use of

; CPUID inst

mov eax, 0; set up for CPUID instruction

cpuid

mov dword ptr vendor_id, ebx; Test for "GenuineIntel" vendor id.

mov dword ptr vendor_id [+4], edx

mov dword ptr vendor_id [+8], ecx

mov si, offset vendor_id

mov di, offset intel_id

mov cx, length intel_id

compare:

repe cmpsb

cmp cx, 0; must be a GenuineIntel if ecx =0

jne cpuid_data

intel_processor:

mov intel_proc, 1

mov [intel-1], '¦'; add a space so the Genuine Intel

; message prints out.

cpuid_data:

mov eax, 1

cpuid

mov saved_cpuid,eax; save for future use

and eax, 0F00H; mask everything but family

shr eax, 8

mov cpu_type, al; set cpu_type with family

mov eax,saved_cpuid; restore data

mov stepping, al

and stepping, 0FH; isolate stepping info

mov eax, saved_cpuid

mov themodel, al

and themodel, 0F0H; isolate model info

shr themodel, 4

end_get_cpuid:

.8086

ret

get_cpuid endp

;

; This procedure prints the appropriate cpuid string

; If the CPUID instruction was supported, it prints out

; the cpuid info.