1.Omów sposób komunikacji aplikacji z urządzeniami I/O.
2. Omów DRIVER_OBJECT.
3. Porównaj mnożenie i dzielenie liczb binarnych typu DB,DW,DD.
4. Zasada tworzenia i wykorzystania makra. Podać przykład.
Ad1.
Omów sposób komunikacji aplikacji z urządzeniami I/O:
System operacyjny Windows 2000/XP zawiera komponenty trybu jądra, które są od siebie
odizolowane programowo i funkcjonalnie. Sterowniki urządzeń wejscia-wyjscia współpracuja przede
wszystkim z takimi komponentami jak:
• zarzadca wejscia-wyjscia (ang. Input/Output Manager);
• mechanizm Plug & Play (ang. Plug & Play Manager);
• mechanizm zarzadzania energii (ang. Power Manager);
• abstrakcyjna warstwa sprzętu (ang. HAL - Hardware Abstraction Layer).
Komponenty te, szczególnie HAL posrednicza przy obsłudze (adan wejscia-wyjscia co schematycznie
przedstawiono na rysunku 2.
Oprogramowanie u(ytkowe pracuje w trybie u(użytkownika. Program, który (ada dostepu do
zasobu sprzetowego, u(ywa interfejsu programowego API (ang. Application Programming
Interface). Interfejs ten udostepniany jest przez biblioteki jądra systemu takie, jak np.
KERNEL32.DLL. Funkcjonalnie operacje wejscia-wyjscia wykonuje komponent zwany zarządca
wejscia-wyjscia (ang. Input/Output Manager), przy czym nie jest to pojedynczy wykonywalny
moduł systemu, a zbiór bibliotek systemowych odpowiedzialnych za usługi systemowe typu
operacje wejscia-wyjscia.
Rys. 2. Skrócony diagram mechanizmu komunikacji aplikacji z urządzeniami I/O
W trybie jądra pracuja równie( systemowe funkcje API stosowane do komunikacji z urządzeniami
zewnetrznymi. W pierwszej fazie obsługi (badania wejscia-wyjscia sprawdzane są parametry, z jakimi
funkcja została wywołana. Je(eli wartosci te ingeruja w chronione obszary systemowe, funkcja nie jest
wykonywana. W drugiej fazie tworzone są struktury danych zwane pakietami (adan wejscia-wyjscia (ang.
IRP - I/O Request Packet), które przesyłane są do sterownika urządzenia. W zale(nosci od rodzaju
wykonywanej operacji, sterownik zwraca do systemu pakiet IRP o zawartosci odpowiedniej rodzajowi
wykonanej operacji. Mo(e to być przykładowo:
• komunikat PENDING - informujacy o tym, (e zadanie jest jeszcze wykonywane i system operacyjny
zostanie powiadomiony o jego zakończeniu;
• komunikat SUCCESS - informujacy o tym, (e zadanie zakonczyło się powodzeniem;
• dane, których czytania dotyczyło polecenie wejscia-wyjscia;
• liczba bajtów danych wysłanych do urządzenia, których dotyczyło polecenie wejscia-wyjscia.
Sterownik wykonuje polecenie zawarte w odebranym pakiecie IRP, może to być zapis lub
odczyt określonych portów wejscia-wyjscia lub te( odwzorowanych w pamięć operacyjna
rejestrów urządzenia zewnętrznego. Sterowniki działają w trybie jądra i wykorzystują funkcje
abstrakcyjnej warstwy sprzętu HAL do komunikacji ze sprzętem.
Po zakończeniu operacji wejscia-wyjscia sterownik, poprzez wywołanie odpowiednich funkcji jądra,
uzupełnia danymi pakiet IRP. Następnie system przekazuje dane zawarte w IRP do aplikacji, pozwalając
na dalsze jej wykonywanie.
Współpraca z urządzeniami wejscia-wyjscia pod kontrola systemu Windows 98/Me
Jądro systemu operacyjnego zwane jest zarządca maszyny wirtualnej VMM (ang. Virtual Machinie
Manager), co wynika z jego funkcji w zakresie przydziału zasobów sprzętowych komputera dla aplikacji,
poprzez utworzenie maszyny wirtualnej. Takie rozwiązanie daje możliwość przydziału zasobów
sprzętowych wielu aplikacjom. Architektura VMM stosowana w nowych generacjach systemów
operacyjnych Microsoft jest ta sama, która wprowadził Windows 3.0 (patrz rys. 3), z dodatkowymi
komponentami odpowiedzialnymi za obsługę nowszych urządzeń i 32-bitowych aplikacji (patrz rys. 4).
Mechanizmy komunikacji systemu Windows 98/Me z urządzeniami wejscia-wyjscia przedstawia rys.
4. Dla aplikacji 32-bitowych (badania wejscia-wyjscia obsługiwane są przez funkcje API udostępniane
poprzez biblioteki DLL takie jak np. kernel32.dll. W przeciwieństwie do systemów Windows 2000/XP nie
istnieje tu jednak jeden konkretny mechanizm komunikacji ze sterownikami. Każdy rodzaj urządzenia
zewnętrznego komunikuje się z systemem wykorzystując specyficzne dla niego metody, z wyjątkiem
urządzeń obsługiwanych przez sterowniki WDM, których współpraca opiera się o standard pakietów IRP.
Na rysunku 4 kolumna środkowa przedstawia mechanizm komunikacji aplikacji Windows 16-
bitowych, a prawa - aplikacji DOS. W obu przypadkach programy zwracają się z (a daniami
bezpośrednio, czy te( pośrednio, do sterownika pracującego w trybie u(użytkownika. Nad dostępem do
zasobów ochronę sprawuje wirtualny sterownik urządzenia pracujący w trybie jądra. Ma on za zadanie
c umożliwić wielu maszynom wirtualnym korzystanie bez konfliktów ze wspólnych zasobów.
Operacje wejscia-wyjscia trybu jądra w Windows 2000/XP wykonywane są w oparciu o standardowa
strukturę IRP, Windows 98/Me korzysta z różnych mechanizmów (np. architektura warstwowa z
przepływem pakietów, pakiety IRP i inne). W przypadku używania sterowników WDM, system korzysta
z modułu NTKERN.VXD, w którym zaimplementowano funkcje w części pokrywające się ze
stosowanymi w systemach Windows 2000/XP. Zadaniem tego modułu jest tworzenie pakietów IRP i
wysyłanie ich do sterowników WDM obsługujących urządzenia. Cały proces realizowany jest tak jak to
zostało wcześniej omówione. Sterowniki urządzeń, teoretycznie, nie są w stanie określić, w jakim
środowisku działają. W praktyce jednak występują sterowniki, WDM, które są niekompatybilne, tzn.
skierowane albo dla Windows 98/Me albo, 2000/XP
Ad. 2
Omów DRIVER_OBJECT.
DRIVER_OBJECT jest tworzony przez sterownik i reprezentuje fizyczne lub
wirtualne urządzenie, które sterownik obsługuje.
DRIVER_OBJECT jest blokiem pamięci umieszczanym i częściowo
inicjalizowanym przez system operacyjny. Ten obiekt opisuje gdzie kod sterownika
jest ładowany do pamięci, nazwę sterownika, oraz zawiera wskaźniki do adresów
funkcji, które sterownik oferuje. Jeden ze wskaźników do adresów funkcji musi być
umieszczony w tablicy wskaźników nazwanej „Function Dispatch Table”.
Ta tablica zawiera wejścia do każdej Major Function Code oferowanej przez
system operacyjny. Obecnie istnieje 28 funkcji, które sterownik może zawierać,
jednak w większości przypadków wystarcza obsługa 8 funkcji: IRP_MJ_CREATE,
IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_PNP,
IRP_MJ_POWER, IRP_MJ_DEVICE_CONTROL, IRP_MJ_SYSTEM_CONTROL.
Domyślnie system operacyjny inicjalizuje wejścia do każdej z 28 funkcji,
nawet jeśli sterownik ich nie wykorzystuje. Jakkolwiek użytkownik odwoła się do
urządzenia, system operacyjny wybiera, która funkcja jest odpowiedzialna za
komunikacje z urządzeniem.
DriverObject jest przekazywany jako parametr do DriverEntry przez
I/O Manager. Rozmiar DeviceExtention jest określony w zmiennej
myExtSize, oraz łańcuch Unicode określa nazwę urządzenia -
myDeviceName. Wszystkie dodatkowe dane przechodzą równie"
w tym wywołaniu, takie jak rodzaj urządzenia, charakterystyka, oraz
wszystkie unikalne dane są przekazywane jako wskaźniki do danych
umieszczone w DeviceObject tworzonym przez IoCreateDevice. Te
i inne informacje są ważnymi szczegółami, kiedy konfigurowany jest
sterownik. Więcej danych znajduje się w DDK.
Ad. 3
Porównaj mnożenie i dzielenie liczb binarnych typu DB,DW,DD:
DB - 1-bajtowa liczba całkowita (tyle co rejestr AL)
DW - 2-bajtowa liczba całkowita (tyle co rejestr AX)
DD - 4-bajtowa liczba całkowita (tyle co rejestr EAX)
Mnożenie:
rejestr
wejściowy wynik
AL * byte = AX
AX * word = DX:AX
EAX * dword = EDX:EAX
Dzielenie:
implied dividend quotient remainder
AX / byte = AL AH
DX:AX / word = AX DX
EDX:EAX / dword = EAX EDX
Ad.4
Zasada tworzenia i wykorzystania makra. Podać przykład:
Ogólnie:
Nazwa makro argumenty
;treść makra
ENDM
Przykład:
RETURN MACRO zmienna
Mov eax,zmienna
Ret
ENDM
Użycie powyższego makra:
RETURN -1;czyli wstawi do eax wartość -1
Asembler analizuje kod i napotykając RETURN -1 wstawi w to miejsce :-1
Mov eax,-1
Ret
Zadania z Masm z czerwca 2007:
1. W masm32 podaj dwa sposoby dowolnej funkcji API.
Odp:
*) Co to jest API:
System Windows przygotowuje dla uruchomionych w nim programów mnóstwo różnych zasobów, których sercem jest Windows API (Application Programming Interface - Interfejs Programowy Aplikacji). Jest to olbrzymi zbiór bardzo użytecznych funkcji, które znajdują się w samym Windows gotowe do wykorzystania przez każdy uruchomiony w tym środowisku program. Funkcje te przechowywane są w kilku dynamicznie dołączanych bibliotekach (DLL - Dynamic Linked Libraries) takich jak kernel32.dll, user32.dll i gdi32.dll.
Kernel32.dll zawiera funkcje API obsługujące zarządzanie pamięcią oraz procesami.
User32.dll zawiera funkcje obsługujące aspekty interfejsu użytkownika dla twojego programu.
Gdi32.dll jest odpowiedzialna za operacje graficzne.
Oprócz tych "trzech głównych" istnieje wiele innych bibliotek dynamicznych, z których może korzystać twój program, o ile posiadasz wystarczającą ilość informacji o zawartych w nich funkcjach API.
1) Pierwszy sposób:
.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
INCLUDE \masm32\include\windows.inc
INCLUDE \masm32\include\kernel32.inc
INCLUDELIB \masm32\lib\kernel32.lib
.DATA
.CODE
start:
INVOKE ExitProcess, 0
END start
Program, który natychmiast wraca do windows, jednak jest to poprawny program.
2) Drugi sposób:
2. Napisz funkcje makra dokonującego zerowania akumulatora (EAX). Podaj rozkaz wywołania Makra w kodzie programu.
3. Opisz zasadę sterownia pracą programu z wykorzystaniem skoków warunkowych sterowanie od flag procesora).
4. Porównaj bitowe i selektywne operacje zerowania ustawiania i negowania.
2 kolokwium (Grupa 1 + 2 dla tych którzy nie zdali 1 koła;
i tylko Grupa 2 dla tych którzy koło 1 zdali; )
Grupa 1
1.Wykonaj zamianę bitów: 7 w rejestrze o adr 2FH z bitem 2 ACC
2.Wykonaj operację porównania arytmetycznego zawartości rejestru R5
- Jeżeli wartość R5 jest mniejsza od 100 dokonaj konwersji liczby w kod U2,
- Jeżeli większa lub równa 100 dokonaj konwersji w kod upakowany BCD
Wprowadź stosowne zmienne wskaźnikowe w obszarze pamięci użytkownika.
3.Stosujac pętle programowa (rozkazem CJNE) oraz indeksując rejestr R0 poprzez adresowanie pośrednie, zaadresuj liniowo pamięć od adresu 30H do 40H. Do komórek pamięci wpisz ich adresy.
4.Napisz nagłówek programu w którym:
-konfigurujesz system przerwań dla T0,T1,ES
-przerwanie ES ma najwyższy priorytet
-Timer 0 pracuje w trybie 1, sterowanie od TR0 odmierza czas 20ms
-Timer 1 pracuje w trybie 2, sterowanie od TR1 ustala prędkość 9600bodów dla SMOD=1
Grupa 2
1.W MASM32 opisz sposób przekazywania danych pomiędzy procedurami podprogramów oraz funkcjami API
2.Podaj przykład wprowadzenia własnej kontrolki w programie oraz sposób realizacji sterowania w oparciu o parametr WParam.
3.Omów porównanie logiczne oraz arytmetyczne dla rodziny procesorów (386) i 486.
Omów zasadę sterowania praca programu z wykorzystaniem skoków warunkowych.
Na poprawce 2 koła (1 egzamin) było podobnie (tzn. 2 grupy do pisania dla tych co nie napisali zadanego koła i odpowiednio 3 lub 4 dla osób które nie napisały 1 lub 2 koła!
Grupa 3
1.Omów zasadę komunikacji aplikacji z urządzeniami I/O.
2.Omów Driver-OBJECT.
3.Omów zasadę sterowania oknem aplikacji za pomocą kontrolek.
4.Opisz zasadę tworzenia i podaj przykłady makra.
Grupa 4
1.Omów sposób tworzenia i wykorzystania struktury IRP
2.Omów Driver-OBJECT/(ale chyba nie Object tylko) Device ????
3.Omów zasadę tworzenia okna aplikacji z wykorzystaniem funkcji CreateWindowEx
4.Podaj przykład wywołania okienka dialogowego.
Dodatkowo na poprawkach bywały takie oto pytania wymieszane z pytaniami z kolosów:
• Napisz procedurę obsługi przerwania od T1 w której odświeżasz Timer dla czasu 25ms oraz negujesz bit P1.7. Podaj wymagana konfiguracje dla timera w nagłówku programu;
• Zamień bity R5 banku 0 (7z 1) (wykorzystując bit przeniesienia C)
• API. Co to jest okno aplikacji i jak się je robi i co to jest uchwyt okna?
System Windows przygotowuje dla uruchomionych w nim programów mnóstwo różnych zasobów, których sercem jest Windows API (Application Programming Interface - Interfejs Programowy Aplikacji). Jest to olbrzymi zbiór bardzo użytecznych funkcji, które znajdują się w samym Windows gotowe do wykorzystania przez każdy uruchomiony w tym środowisku program. Funkcje te przechowywane są w kilku dynamicznie dołączanych bibliotekach (DLL - Dynamic Linked Libraries) takich jak kernel32.dll, user32.dll i gdi32.dll.
Kernel32.dll zawiera funkcje API obsługujące zarządzanie pamięcią oraz procesami.
User32.dll zawiera funkcje obsługujące aspekty interfejsu użytkownika dla twojego programu.
Gdi32.dll jest odpowiedzialna za operacje graficzne.
Oprócz tych "trzech głównych" istnieje wiele innych bibliotek dynamicznych, z których może korzystać twój program, o ile posiadasz wystarczającą ilość informacji o zawartych w nich funkcjach API.
Programy Windows dynamicznie łączą się z tymi bibliotekami DLL, tj. kody funkcji API nie są dołączane do pliku wykonywalnego Windows. Aby twój program wiedział, gdzie znaleźć pożądane funkcje API w czasie swojego wykonania, musisz osadzić tę informację w pliku wykonywalnym. Informacja ta znajduje się w bibliotekach importu. Musisz połączyć swoje programy z właściwymi bibliotekami importu, albo nie będą one potrafiły zlokalizować funkcji API.
666OOO66OO O O 66oooooool Stwórz własny przycisk kończący prace aplikacji.
• Podaj skoki warunkowe procesora (flagi i skoki warunek ze znakiem i bez znaku)
Przed egzaminem surtellos powiedział nam ze biedzie :
- co to jest gapi ?
- jak funkcje api zwracają wartość?
- jakie są wywołania funkcji w api?
- typy driverow ?
- opisy tych typów
- driverobject deviceobject
- driverentry
- różnica między invoke i call
Pytania z mojej grupy z kolosa może się przyda na poprawie.
1) podaj przykłady selektywnego ustawienia ... negowania i zerowania bitów 0,2,3,6 w porcie P1
2) podaj przykłady pośredniego zapisu i odczytu pamięci wewnętrznej danych
3) stosując adresowanie bitowe skopiuj bit 7 portu P1 do bitu 2 rejestru o adresie 20H
4)podaj stany rejestrów IE i IP jeżeli uaktywniamy przerwania od INT1,T0,ES.
ES ma najwyższy priorytet
5)napisz procedurze zamiany zmiennej BIN (30H) w kod U2 (31H) dla liczb z zakresu 0-30H w tym celu wykonaj porównanie arytmetyczne
6)stosując pętle programową (rozkaz DJNZ) oraz indeksując rejestr R1 poprzez adresowanie pośrednie zaadresuj co drugą komórkę pamięci od adresu 30H do adresu 40H
do komórek pamięci wpisz ich adresy
Ponad to z tego co pamiętam co było u nas, to na pewno:
- timery (było coś z równoczesnym startem dwóch timerów w którymś tam trybie)
- konwersja liczb (bcd<->u2, u2<->dec, etc.)
- ANL, ORL, XOR - ustawianie określonych bitów za pomocą maski
|
Grupa I
Cytat:
Grupa II
Cytat:
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////INNE MATERIAŁY////////////////////////////////////////////////////////////////
Powinno być SETB 21H.3 - polecenie to ustawia pojedynczy bit i ta cyfra po kropce określa numer bitu wiec nie potrzebne tam jest to H
oki a w tym listingu tez mi wyrzuca blad w linii 8 Kod:
(...)
thurek napisał/a:
Wygląda na to, że ta komórka pamięci nie może być adresowana bitowo ale z drugiej strony w książce piszą, że można ją tak adresować (jak każdą z przedziału 20H..2FH). Także nie bardzo wiem co tu może być źle
stanny napisał/a:
(...)
W trybie adresowania bitowego mamy do dyspozycji 100h (256) niezależnych bitów. Bity o numerach 00h..7Fh odpowiadają bitom bajtów o adresach 20h..2Fh (w odwrotnej kolejności - tj. bit o numerze 00h odpowiada najmłodszemu bitowi komórki 20h, bit o adresie 07h odpowiada najstarszemu bitowi komórki 20h, bit o numerze 08h odpowiada najmłodszemu bitowi komórki 21h i tak dalej), bity o numerach 80h..FFh odpowiadają poszczególnym bitom bajtów o adresach 80h, 88h, 90h, 9Fh, 0A0h, 0A8h, 0B0h, 0BFh, 0C0h, 0C8h, 0D0h, 0DFh, 0E0h, 0E8h, 0F0h, 0FFh (również w "odwrotnej" kolejności, tj. bit 0E0h odpowiada najmłodszemu bitowi komórki 0E0h, czyli akumulatora (czyli jest równoważny zapisowi ACC.0), bit 0E7h odpowiada najstarszemu bitowi komórki 0E0h (równoważny ACC.7 - można to sobie tak wyobrazić, że do adresu "bazowego" rejestru dodajemy numer bitu - ale tylko dla bitów o numerach > 7Fh), bit 0E8h odpowiada najmłodszemu bitowi komórki 0E8h itp). Kod:
20h.0 equ 0h
stąd w programie w asemblerze można używać wygodniejszej dla człowieka postaci adresu np. 21h.3. W jagodzie nie zadeklarowano takich etykiet, stąd trzeba podawać numer bitu. W każdym razie obie postacie rozkazu (SETB 21h.3 i SETB 0Bh) zostaną zasemblowane w identyczny sposób. Kod:
LJMP start
|
_________________ |
Kalkulator 3-cyfrowy. Może komuś się przyda na poprawce.
Kod: |
|
oraz wersja z blokadą klawiszy dających wartość A,B,C,D,E,F:
Kod: |
|