на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI
p align="left">Рисунок 2 - Регістр стану

AC - ознака активності BusMaster. Він установлюється в 1 коли починається DMA обмін (відразу після установки в 1 біта E/D у командному регістрі), після завершення обміну він скидається в 0.

ERR - Ознака помилки передачі даних.

ІNT - ознака переривання. Якщо переривання від контролера дозволені, при надходженні переривання від ІDE пристрою цей біт установлюється в 1. (Щоб його скинути, потрібно записати в нього 1).

DS0 (DMASupport) підтримка DMA диском 0.

DS1 те ж для диска 1.

Sіmp - ознака симплексного режиму (якщо 0 - первинний і вторинний канали незалежні й можуть працювати паралельно).

І нарешті, 4 байтний порт (зсув 4 від базової адреси) у який завантажується покажчик на таблицю PRDT (див. нижче).

Формат дескриптора PRD (рисунок 3):

FLAG:WORD

COUNT:WORD

ADDRESS:DWORD

Рисунок 3 - Формат дескриптора PRD

Поле ADDRESS розміром 4 байти задає початкову фізичну адресу в пам'яті, з якого буде починатися обмін.

Поле COUNT - розмір області в байтах. Розмір не повинен бути менше кількості даних переданих диском, але може бути більше, у цьому випадку "зайва" область не буде порушена. У команді "ReadsectorsDMA" можна вказати в регістрі лічильника секторів значення більше 1, тоді будуть прочитані кілька секторів, починаючи із заданого, значення поля COUNT варто підбирати так, щоб туди "влізли" всі прочитані дані.

У поле FLAG використовується тільки старший біт, всі інші зарезервовані. Якщо старший біт дорівнює 1, що дескриптор останній у таблиці. Це поле може мати 2 значення - 8000h для останнього в таблиці дескриптора, і 0000h для всіх інших.

Регістр є пристроєм тимчасового зберігання даних і використається з метою полегшення арифметичних, логічних операцій. Вісім регістрів загального призначення мають довжину в 32 біт і містять адреси або дані. Вони підтримують операнди:

- дані довжиною 1, 8, 16, 32 і 64 біт;

- бітові поля від 1 до 32 біт;

- операнди - адреси довжиною 16 і 32 біт.

Ці регістри називаються EAX, EBX, ECX, EDX, ESІ, EDІ, EBP, ESP. Доступ до молодших 16 біт цих регістрів виконується незалежно. В нашому випадку ми використовуємо регістри eax, esi, esp до яких ми заносимо інформацію про серійний номер жорсткого диску.

;Серійний номер

cmp WORD PTR [edi+20],0

je @@SerNum_Done

push L 21

lea eax,[edi+20]

push eax

push esi

call lstrcpynA

push esi

push L OFFSET szSerNum

call printf

add esp,8

Таким чином були розглянуті деякі головні компоненти розроблюваної програми на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.

5 Основні висновки

На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткий дисків. Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на мові асемблера на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.

Дана програма дозволяє переглядати параметри про жорсткий диск ІDE/ATAPІ, зокрема серійних номерів. Працює в DOS/Wіn9x, NT, XP із правами адміністратора.

6 Інструкція користувачу

Дана програма дозволяє переглядати параметри про жорсткий диск ІDE/ATAPІ, зокрема серійних номерів. Працює в DOS/Wіn9x, NT, XP з правами адміністратора. Програма може використовуватись в учбових закладах різного рівня акредитації, організаціях різного профілю занятості і так далі (рисунок 1).

Рисунок 1 - Інтерфейс користувача

Також вона відповідає таким системним вимогам : Операційна система - DOS, Windows 3.1 або старша, пам'ять - 2M і вище та написана на мові Асемблера.

Список літератури

1. Том. Сван. Освоение Turbo Assembler. М., Діалектика, 1996

2. Зубков Д. Д. Программирование на Assembler для DOS, WINDOWS и UNIX. М., ДМК, 2000

3. М. Джордейн «Довідник програміста персональних комп'ютерів типу IBM PC» М: Мир, 1991р.

4. М. Абель «Мова асемблера для IBM PC і програмування.» Г.:Вища школа,1992.

Перелiк скорочень, символів і спеціальних термінів

ATAPI - (AT Attachment Packet Interface, пакетний інтерфейс периферійних пристроїв для AT - сумісних комп'ютерів)

ATA - Advanced Technology Attachment, більш відомої як IDE

IDE - Integrated Drive Electronics, вбудований інтерфейс накопичувачів

ОС - операцiйна система

DOS - дискова операцiйна система

BIOS - базова система вводу/виводу

INT - переривання

PC - персональний комп'ютер

WINDOWS - операцiйна система

i т.д. - i так далi

i т.i. - i таке iнше

та iн. - та iншi

Додатки

Додаток А

Лістинг програми

;тема: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI

;автор Бражко Артем Станіславович

;група ПМ-05

;27.05.08

.386

LOCALS

.MODEL FLAT

L EQU <LARGE>

; Значення параметра функції GetStdHandle

STD_INPUT_HANDLE EQU -10

STD_OUTPUT_HANDLE EQU -11

STD_ERROR_HANDLE EQU -12

;*******************************************************************

;Параметри пристрою IDE/ATAPI

;********************************************************************

SCANDEVENTRY STRUC

sde_wBasePort DW ?

sde_bDevNum DB ?

sde_lpszPort DD ?

SCANDEVENTRY ENDS

EXTRN hStdOut:DWORD

EXTRN ExitProcess:PROC

EXTRN GetStdHandle:PROC

EXTRN WaitForSingleObject:PROC

EXTRN _wsprintfA:PROC

EXTRN lstrcpynA:PROC

EXTRN GetVersionExA:PROC

.DATA

szPriMaster DB "=========Primary Master===========", 0Dh, 0Ah, 0

szPriSlave DB "============Primary Slave==========", 0Dh, 0Ah, 0

szSecMaster DB "==============Secondary Master=====", 0Dh, 0Ah, 0

szSecSlave DB "===========Secondary Slave=========", 0Dh, 0Ah, 0

szTerMaster DB "===========Tertiary Master=========", 0Dh, 0Ah, 0

szTerSlave DB "==========Tertiary Slave===========", 0Dh, 0Ah, 0

szQuaMaster DB "==========Quaternary Master========", 0Dh, 0Ah, 0

szQuaSlave DB "==========Quaternary Slave=========", 0Dh, 0Ah, 0

szDevice DB " Device: %s", 0Dh, 0Ah, 0

szModel DB " Model: %s", 0Dh, 0Ah, 0

szFirmwareRev DB "Firmware Revision: %s", 0Dh, 0Ah, 0

szSerNum DB " Serial Number: %s", 0Dh, 0Ah, 0

szHDD DB "HDD %uM", 0

szUnknown DB "Unknown", 0

szPressAnyKey DB 0Dh, 0Ah, "Press any key...", 0

ScanDevices SCANDEVENTRY <1F0h,0,OFFSET szPriMaster>

SCANDEVENTRY <1F0h,1,OFFSET szPriSlave>

SCANDEVENTRY <170h,2,OFFSET szSecMaster>

SCANDEVENTRY <170h,3,OFFSET szSecSlave>

SCANDEVENTRY <1E8h,4,OFFSET szTerMaster>

SCANDEVENTRY <1E8h,5,OFFSET szTerSlave>

SCANDEVENTRY <168h,6,OFFSET szQuaMaster>

SCANDEVENTRY <168h,7,OFFSET szQuaSlave>

SCANDEVICESCOUNT = ($-ScanDevices)/SIZE SCANDEVENTRY

.DATA?

DevInfo DW 256 DUP(?)

.CODE

EXTRN puts:PROC

EXTRN fputs:PROC

EXTRN printf:PROC

EXTRN Ring0Call:PROC

EXTRN GetATAPIDevInfo:PROC

EXTRN GetIDEDevInfo:PROC

EXTRN DetectATAPIDev:PROC

EXTRN NT_GetDevInfo:PROC

Start:

push L STD_OUTPUT_HANDLE

call GetStdHandle

inc eax

jz Exit

dec eax

mov [hStdOut],eax

mov ebp,OFFSET W9x_GetDevInfo

jnz @@ScanDevices

mov ebp,OFFSET NT_GetDevInfo

@@ScanDevices:

;Сканування пристрою IDE/ATAPI

mov esi,OFFSET ScanDevices ;ESI -> ScanDevices

mov edi,OFFSET DevInfo ;EDI -> DevInfo

mov ecx,SCANDEVICESCOUNT

@@DevLoop: push ecx

;Отримання інформації про пристрій IDE/ATAPI

mov dx,[(SCANDEVENTRY PTR esi).sde_wBasePort]

mov al,[(SCANDEVENTRY PTR esi).sde_bDevNum]

call ebp

or eax,eax ;інформація отримана?

jz @@NextDev

;Вивід інформації про пристрій IDE/ATAPI

push [(SCANDEVENTRY PTR esi).sde_lpszPort]

call puts

call PrintDevInfo

@@NextDev: pop ecx

add esi,SIZE SCANDEVENTRY

loop @@DevLoop

;Очікування натискання клавіші

push L STD_ERROR_HANDLE

call GetStdHandle

push L OFFSET szPressAnyKey

push eax

call fputs

push L STD_INPUT_HANDLE

call GetStdHandle

inc eax

jz Exit

dec eax

push L 0FFFFFFFFh

push eax

call WaitForSingleObject

Exit:

push L 0

call ExitProcess

;********************************************************************

;PrintDevInfo вивід інформації про пристрій IDE/ATAPI

;********************************************************************

;Використовує: lstrcpynA, printf

;

;Виклик: EDI -> буфер з інформацією про пристрій

;

;Виклик: ні

;

;Змінювані

; регістри: EAX,ECX,EDX,Flags

;********************************************************************

PrintDevInfo PROC

LOCAL @@szTemp:BYTE:64 = LOCAL_SIZE

enter LOCAL_SIZE,0

push esi

lea esi,[@@szTemp] ;ESI -> @@szTemp

;Тип пристрою

mov al,[edi+1]

test al,80h ;пристрій ATAPI?

jz @@IDE

and al,1Fh ;AL = тип пристрою ATAPI

cmp al,5

mov eax,OFFSET sz

je @@PrintDeviceType

mov eax,OFFSET szUnknown

jmp @@PrintDeviceType

@@IDE:

; Жорсткий диск IDE

mov eax,DWORD PTR [edi+120] ;EAX = загальна кількість секторів

;в режимі LBA

cmp eax,16515072

jae @@GetSizeInMB

movzx eax,WORD PTR [edi+2]

movzx ecx,WORD PTR [edi+6]

mul ecx

movzx ecx,WORD PTR [edi+12]

mul ecx

@@GetSizeInMB: mov ecx,512

mul ecx

mov ecx,500000

div ecx

shr eax,1

adc eax,0

push eax

push L OFFSET szHDD

push esi

call _wsprintfA

add esp,12

mov eax,esi

@@PrintDeviceType:

push eax

push L OFFSET szDevice

call printf

add esp,8

;Модель

cmp WORD PTR [edi+54],0

je @@Model_Done

push L 41

lea eax,[edi+54]

push eax

push esi

call lstrcpynA

push esi

push L OFFSET szModel

call printf

add esp,8

@@Model_Done:

;Firmware Revision

cmp WORD PTR [edi+46],0

je @@FirmwareRev_Done

push L 9

lea eax,[edi+46]

push eax

push esi

call lstrcpynA

push esi

push L OFFSET szFirmwareRev

call printf

add esp,8

@@FirmwareRev_Done:

;Серійний номер

cmp WORD PTR [edi+20],0

je @@SerNum_Done

push L 21

lea eax,[edi+20]

push eax

push esi

call lstrcpynA

push esi

push L OFFSET szSerNum

call printf

add esp,8

@@SerNum_Done:

pop esi

leave

ret

PrintDevInfo ENDP

;********************************************************************

;Параметри передаваємі в процедуру Ring0_GetDevInfo

;********************************************************************

GETDEVINFOPARAMS STRUC

gdip_wBasePort DW ?

gdip_bDevNum DB ?

gdip_lpBuffer DD ?

GETDEVINFOPARAMS ENDS

;********************************************************************

;W9x_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI (Win9x)

;********************************************************************

; Використовує: Ring0Call, Ring0_GetDevInfo

;

; Виклик: DX = базовий порт

; AL = номер пристрою

; EDI -> буфер для інформації про пристрій

;

;Повернення: EAX = флаг успешного/неудачного завершення

;

;Змінні

; регістри: EAX,ECX,DX,Flags

;********************************************************************

W9x_GetDevInfo PROC

LOCAL @@gdip:GETDEVINFOPARAMS, @@fSuccess:DWORD = LOCAL_SIZE

enter LOCAL_SIZE,0

mov [@@gdip.gdip_wBasePort],dx

mov [@@gdip.gdip_bDevNum],al

mov [@@gdip.gdip_lpBuffer],edi

lea eax,[@@fSuccess]

push eax

lea eax,[@@gdip]

push eax

push L OFFSET Ring0_GetDevInfo

call Ring0Call

or eax,eax ;процедура виконана ?

jz @@Exit

mov eax,[@@fSuccess]

@@Exit: leave

ret

W9x_GetDevInfo ENDP

;********************************************************************

;Ring0_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI

;викликається з Ring 0

;********************************************************************

;використовує: DetectATAPIDev, GetATAPIDevInfo, GetIDEDevInfo

;

;виклик: ECX -> параметри для отримання інформації(GETDEVINFOPARAMS)

;

;повернення: EAX = флаг успешного/неудачного завершення

;

;Змінні

; регістри: EAX,ECX,DX,Flags

;******************************************************************** Ring0_GetDevInfo PROC FAR

push edi

mov dx,[(GETDEVINFOPARAMS PTR ecx).gdip_wBasePort]

mov al,[(GETDEVINFOPARAMS PTR ecx).gdip_bDevNum]

mov edi,[(GETDEVINFOPARAMS PTR ecx).gdip_lpBuffer]

push eax

push edx

call DetectATAPIDev ;пристрій ATAPI?

pop edx

pop eax

jc @@TryIDE

call GetATAPIDevInfo ;отримує інформацію

;про пристрій ATAPI

jmp @@Exit

@@TryIDE: call GetIDEDevInfo ;отримати інформацію

;про пристрій IDE

@@Exit: setnc al

movzx eax,al

pop edi

ret

Ring0_GetDevInfo ENDP

ENDP

END Start

Додаток Б

Блок - схема алгоритму програми

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.