КУРСОВИЙ ПРОЕКТ
з дисципліни СИСТЕМНЕ ПРОГРАМУВАННЯ
Тема розробка системного загрузчика який здійснює ревізію конфігурації комп’ютера та виводить отриману інформацію на екран
Анотація
В курсовому проекті проаналізована функція ревізії конфігурації комп’ютера на рівні Bios-переривання int 11h, а також детально розглянута структура та параметри загрузочної області. На основі даного алгоритму написаний системний загрузчик, який здійснює ревізію конфігурації комп’ютера та виводить отриману інформацію на екран.
Summary
In a course project there is the analyzed function of revision of configuration of computer at the level of Bios-breaking of int 11h, and also the in detail considered structure and parameters of boots region. On the basis of this algorithm the written system boots, this carries out the revision of configuration of computer and destroys obtained information on a screen.
Зміст
1 опис основних функцій, що використані в програмі, блок-схема програми 8
2 код програми ревізії конфігурації комп’ютера з поясненнями (ремарками) 14
3 опис роботи 14
Висновки 17
Перелік використаних літературних джерел 18
Додаток А Програма запису системного загрузчика в загрузочну область
1 опис основних функцій, що використані в програмі, блок-схема програми
Системний загрузчик, програми ревізії конфігурації комп’ютера складається з наступних частин:
тіло програми, в якому відбувається перевірка відповідних значень та виведення повідомлень на екран;
функція встановлення відео режиму 00h переривання int 10h;
функція ревізії обладнання комп’ютера переривання int 11h;
функція виведення символів на екран 0Eh переривання int 10h.
2 код програми-калькулятор з поясненнями (ремарками)
.model tiny ;вибір моделі пам'яті для компіляції сом-файлу CS=ES=SS=DS
.code ;початок кодового сегменту
org 100h ;зміщення в 256 байт для PSP
start: ;мітка першої інструкції
mov ax,0003h ;функція встановлення відеорежиму 3(очистка екрана і ;встановлення
;курсора в 0,0)
int 10h ;виклик переривання виконання функції
int 11h ;виклик переривання визначення обладнання
mov si,ax ;збереження повернутого значення в регістрі SI
and ax,0001h ;накладання маски для перевірки 0-го біту (наявності FDD)
jz m1 ;якщо 0-й біт дорівнює 0 переходимо на мітку m1
;за допомогою функції виводу символу на екран виводимо строку "FDD="
mov ax,0e46h
mov bx,0007h
int 10h
mov ax,0e44h
int 10h
mov ax,0e44h
int 10h
mov ax,0e3dh
int 10h
mov ax,si ;якщо 0-й біт дорівнює 1, виводимо кількість дисководів
and ax,00c0h
add ax,31h
mov ah,0eh
int 10h
m1:
;*********Функція переводу курсора на новий рядок
mov ah,02h
xor bl,bl
mov dx,0100h
int 10h
;*********
mov ax,si
and ax,0002h ;накладання маски для перевірки 1-го біту (наявності ;сопроцесора 8087)
jz m2 ;якщо 1-й біт дорівнює 0 переходимо на мітку m2
;за допомогою функції виводу символу на екран виводимо строку "SOPROCESSOR 8087"
mov ax,0e53h
mov bx,0007h
int 10h
mov ax,0e4fh
int 10h
mov ax,0e50h
int 10h
mov ax,0e52h
int 10h
mov ax,0e4fh
int 10h
mov ax,0e43h
int 10h
mov ax,0e45h
int 10h
mov ax,0e53h
int 10h
mov ax,0e53h
int 10h
mov ax,0e4fh
int 10h
mov ax,0e52h
int 10h
mov ax,0e20h
int 10h
mov ax,0e38h
int 10h
mov ax,0e30h
int 10h
mov ax,0e38h
int 10h
mov ax,0e37h
int 10h
m2:
;*********Функція переводу курсора на новий рядок
mov ah,02h
xor bl,bl
mov dx,0200h
int 10h
;*********
mov ax,si
and ax,000ch ;накладання маски для перевірки 2-3-го бітів (RAM)
jz m5 ;якщо 2-3-й біти дорівнють 0 переходимо на мітку m5
;за допомогою функції виводу символу на екран виводимо строку "MEMORY:Kb"
mov ax,0e4dh
mov bx,0007h
int 10h
mov ax,0e45h
int 10h
mov ax,0e4dh
int 10h
mov ax,0e4fh
int 10h
mov ax,0e52h
int 10h
mov ax,0e59h
int 10h
mov ax,0e3ah
int 10h
mov ax,0e4bh
int 10h
mov ax,0e62h
int 10h
mov ax,si
and ax,000ch
cmp al,04h ;якщо AL=08h виводимо на екран число "16" (RAM=16Kb)
jnz m3 ;інакше переходимо на мітку m3
mov ax,0e31h
int 10h
mov ax,0e36h
int 10h
m3: cmp al,08h ;якщо AL=08h виводимо на екран число "32" (RAM=32Kb)
jnz m4 ;інакше переходимо на мітку m4
mov ax,0e33h
int 10h
mov ax,0e32h
int 10h
m4: cmp al,0ch ;якщо AL=0сh виводимо на екран число "64" (RAM=64Kb)
jnz m5 ;інакше переходимо на мітку m5
mov ax,0e36h
int 10h
mov ax,0e34h
int 10h
m5:
;*********Функція переводу курсора на новий рядок
mov ah,02h
xor bl,bl
mov dx,0300h
int 10h
;*********
mov ax,si
and ax,0100h ;накладання маски для перевірки 8-го біту (присутності DMA)
jz m6 ;якщо 8-го біт дорівнє 0 переходимо на мітку m6
;за допомогою функції виводу символу на екран виводимо строку "DMA Present"
mov ax,0e44h
mov bx,0007h
int 10h
mov ax,0e4dh
int 10h
mov ax,0e41h
int 10h
mov ax,0e20h
int 10h
mov ax,0e70h
int 10h
mov ax,0e72h
int 10h
mov ax,0e65h
int 10h
mov ax,0e73h
int 10h
mov ax,0e65h
int 10h
mov ax,0e6eh
int 10h
mov ax,0e74h
int 10h
m6:
;*********Функція переводу курсора на новий рядок
mov ah,02h
xor bl,bl
mov dx,0400h
int 10h
;*********
mov ax,si ;LPT
and ax,0c000h ;накладання маски для перевірки 14-15-го бітів ;(присутності LPT)
mov di,ax ;збереження результату логічної операції в регістрі DI
jz m9 ;якщо 14-15-й біти дорівнють 0 переходимо на мітку m9
;за допомогою функції виводу символу на екран виводимо строку "LPT:"
mov ax,0e4ch
mov bx,0007h
int 10h
mov ax,0e50h
int 10h
mov ax,0e54h
int 10h
mov ax,0e3ah
int 10h
mov ax,0e20h
int 10h
cmp di,4000h ;якщо DI=4000h виводимо на екран число "1" (LPT:1)
jnz m7 ;інакше переходимо на мітку m7
mov ax,0e31h
int 10h
m7: cmp di,8000h ;якщо DI=8000h виводимо на екран число "2" (LPT:2)
jnz m8 ;інакше переходимо на мітку m8
mov ax,0e32h
int 10h
m8: cmp di,0c000h ;якщо DI=C000h виводимо на екран число "3" (LPT:3)
jnz m9 ;інакше переходимо на мітку m9
mov ax,0e33h
int 10h
m9:
ret
end start
3 опис роботи
На початку програми вибирається модель пам’яті та тип процесора командами model та .386 відповідно. Виконання програми починається із мітки start.
Далі за допомогою функції встановлення відео режиму 00h переривання int 10h ми встановлюємо відео режим 3, тобто текстовий режим з переводом курсору в позицію 0,0. Після встановлення відео режиму викликаємо переривання int 11h, в результаті отримаємо і зберігаємо вихідне значення регістру АХ.
Перевіряємо 0 біт регістру АХ. Якщо він дорівнює 0, переходимо до перевірки 1-го біту, інакше за допомогою функції виводу символів 0Еh переривання int 10h строку “FDD=”, виконуємо логічну операцію АХ&00с0, збільшуємо значення на 1 і отримаємо кількість дисководів, що виводиться на екран. За допомогою функції 02h переривання int 10h переводимо курсор на нову строку.
Перевіряємо 1 біт регістру АХ. Якщо він дорівнює