,
AOA 13AOA 13, inforamtyka, art of assembly language
[ Pobierz całość w formacie PDF ]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA POSIADA RAG „THE ART OF ASSEMBLY LANGUAGE” tłumaczone by KREMIK Konsultacje naukowe: NEKRO wankenob@priv5.onet.pl nekro@pf.pl &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ROZDZIAŁ TRZYNASTY: MS-DOS, PC-BIOS i I/O PLIKÓW Typowy system PC składa się z wielu innych składników poza CPU 80x86 i pamięci. MS-DOS i BIOS PC dostarczają połączenia pomiędzy naszą aplikacją a wykorzystywanym sprzętem. Chociaż czasami jest konieczność oprogramować sprzęt bezpośrednio, najczęściej lepiej jest pozostawić to oprogramowaniu systemowemu (MS-DOS i BIOS) wykonującemu to za nas. Co więcej dużo łatwiej jest nam wywołać po prostu podprogram wbudowany w nasz system niż pisać taki podprogram samemu. Możemy uzyskać dostęp do sprzętu IBM PC na jednym z trzech ogólnych poziomów z języka asemblera. Możemy oprogramować sprzęt bezpośrednio, możemy użyć podprogramów ROM BIOS do uzyskania dostępu do sprzętu lub możemy uczynić wywołanie MS-DOS aby uzyskać dostęp do sprzętu. Każdy z poziomów systemu ma swój własny zbiór zalet i wad. Oprogramowanie bezpośrednie sprzętu oferuje dwie zalety w stosunku do pozostałych metod.: sterowanie i wydajność. Jeśli będziemy sterowali trybami sprzętu możemy uzyskać poprawę wydajności systemu przez wykorzystanie specjalnych sztuczek sprzętowych lub innych takich, których nie potrafią podprogramy ogólnego przeznaczenia. Dla niektórych programów, takich jak edytory ekranowe (które muszą mieć szybki dostęp do karty video) bezpośredni dostęp sprzętowy jest jedynym sposobem osiągnięcia rozsądnej poprawienia poziomów. Z drugiej strony, bezpośrednie programowanie sprzętu ma również swoje wady. Edytory ekranowe, mające bezpośredni dostęp do pamięci video, mogą nie działać jeśli pojawi się nowy typ kart video w IBM PC. Dla takich programów mogą być konieczne złożone sterowniki, zwiększające ilość pracy przy tworzeniu i pielęgnacji takiego programu. Co więcej, mając napisanych kilka programów, uzyskujących dostęp do pamięci ekranowej bezpośrednio i zakładając, że IBM wyprodukował nowe, niekompatybilne rozszerzenie, będziemy musieli przepisać wszystkie nasze programy tak, aby działały z nowymi kartami video. Nasza praca stałaby się znacznie łatwiejsza gdyby IBM dostarczył, w stałej, znanej lokacji jakiś podprogramy, które wykonywałby wszystkie operacje ekranowe I/O za nas. Nasze wszystkie programy mogłyby wywoływać te podprogramy. Kiedy producent wprowadziłby na rynek nowe rozszerzenie do kart, dostarczałby nowego zbioru podprogramów dla wyświetlacza z kartą rozszerzenia. Te nowe podprogramy zastąpią stare lub je uaktualnią, tak aby wywołanie starych podprogramów wywoływało tez podprogramy nowsze. Jeśli interfejs programu jest taki sam pomiędzy dwoma zbiorami podprogramów, nasze programy będą działać z nowszymi podprogramami. IBM ma zaimplementowany taki mechanizm z oprogramowaniu systemowym. W najwyższym obszarze jedno megabajtowej przestrzeni w PC znajdują się specjalistyczne adresy dla przechowywania danych ROM. Chip pamięci ROM zawiera specjalne oprogramowanie Basic Input Output System (Podstawowy System Wejścia – Wyjścia) lub BIOS. Podprogramy BIOS dostarczają niezależnego od sprzętu interfejsu dla różnych urządzeń w systemie IBM PC. Na przykład jedną z usług BIOS jest sterowanie wyświetlaniem .Poprzez różne wywołania podprogramu video BIOS, nasz program będzie mógł wypisać znaki na ekranie bez względu na rzeczywistą , zainstalowaną kartę graficzną. Jednym z wyższych poziomów jest MS-DOS. Podczas gdy BIOS pozwala nam manipulować urządzeniami na bardzo niskim poziomie, MS-DOS dostarcza wysokopoziomowego interfejsu dla wielu urządzeń. Na przykład jeden z podprogramów BIOS pozwala nam uzyskać dostęp do dyskietki. Dzięki temu podprogramowi BIOS’a możemy odczytać lub zapisać bloki na dyskietce. Niestety BIOS nie wie nic o takich rzeczach jak pliki czy katalogi. O wie tylko o blokach. Jeśli chcesz uzyskać dostęp do pliku na dyskietce stosując wywołanie BIOS’a musisz wiedzieć dokładnie gdzie ten plik pojawia się na powierzchni dyskietki. Z drugiej strony wywołanie MS-DOS pozwala nam działać na nazwie pliku zamiast na adresie dyskowym pliku. MS-DOS śledzi gdzie na powierzchni dyskietki są pliki i wywołując ROM BIOS odczytuje właściwy blok dla nas. Ten wysokopoziomowy interfejs znacznie redukuje ilość wysiłku jaki nasz program musi wydatkować na uzyskanie dostępu do danych na dyskietce. Celem tego rozdziału jest dostarczenie krótkiego wprowadzenia do różnych usług BIOS’a i DOS’a dostępnych dla nas. Rozdział ten nie próbuje opisywać wszystkich podprogramów lub opcji dostępnych przy każdym podprogramie. Jest kilka tekstów większych od tego, które próbują opisać tylko BIOS lub tylko DOS. Zatem każda próba dostarczenia opisu MS-DOS lub BIOS w pojedynczym tekście jest skazana na porażkę już na starcie – oba są ruchomymi celami, zmieniającymi specyfikację przy każdej nowej wersji. Więc zamiast wyjaśniać wszystko, rozdział ten po prostu będzie próbował prezentować smaczki. 13.0 WSTĘP Rozdział ten przedstawia materiał, który jest specyficzny dla PC. Informacje te o BIOS’ie i DOS’ie nie są konieczne jeśli chcesz nauczyć się programowania w języku assemblera; jednakże informacje te są ważne dla każdego chcącego pisać programy assemblerowe ,które działają pod MS-DOS na kompatybilnych maszynach z PC. W wyniku tego, większość informacji w tym rozdziale jest opcjonalna dla tych , którzy chcą nauczyć się ogólnego programowania w assemblerze. Z drugiej strony, informacje te informacje są przydatne dla tego kto chce pisać aplikacje w assemblerze na PC. Te części ,które mają prefiks „•” są niezbędne. Te części z „⊗” omawiają zaawansowane tematy, które możemy odłożyć na później. • BIOS IBM PC ⊗ Zrzut ekranu • Usługi video ⊗ Instalowanie sprzętu ⊗ Dostępność pamięci ⊗ Usługi nisko poziomowe • Złącze szeregowe We/Wy ⊗ Usługi różnorodne • Usługi klawiatury • Usługi drukowania ⊗ Działanie BASIC ⊗ Ponowne uruchomienie komputera ⊗ Zegar czasu rzeczywistego • Sekwencja wywołania MS-DOS • Funkcje znakowe MS-DOS ⊗ Polecenia napędu MS-DOS ⊗ Funkcje czasu i daty MS-DOS ⊗ Funkcje zarządzania pamięcią MS-DOS ⊗ Funkcje sterowania procesem MS-DOS • „Nowe” segregowanie wywołań MS-DOS • Otwieranie pliku • Tworzenie pliku • Zamykanie pliku • Czytanie z pliku • Zapis do pliku ⊗ Przeszukiwanie ⊗ Ustawienie adresu przekazania dysku ⊗ Znajdowanie pierwszego pliku ⊗ Znajdowanie kolejnego pliku • Usuwanie pliku • Zmiana nazwy pliku ⊗ Zmiana / pobranie atrybutu pliku ⊗ Pobranie / ustawienie daty i czasu pliku ⊗ Inne wywołania DOS • Przykłady plików I/O • Zblokowane pliki I/O ⊗ Program Segment Prefix ⊗ Dostęp do parametrów linii poleceń ⊗ ARGC i ARGV • Pliki podprogramów I/O Standardowej Biblioteki UCR • FOPEN • FCREATE • FCLOSE • FFLUSH • FGETC • FREAD • FPUTC • FWRITE ⊗ Przekierowanie na porty I/O przez podprogramy plików I/O STDLIB 13.1 BIOS IBM PC Zamiast umieścić podprogramy BIOS’u w stałych komórkach pamięci w ROM, IBM użył dużo bardziej elastycznego podejścia przy projektowaniu BIOS’u. Dla wywołania podprogramu BIOS’a, używamy jednej z instrukcji przerwania programowego int 80x86. Instrukcja int używa następującej składni: int wartość Wartość jest jakąś liczbą z zakresu 0..255. Wykonanie instrukcji int będzie powodowała w 80x86 przekazanie sterowania do jednej z 256 różnych procedur obsługi przerwań. Tablica wektorów przerwań zaczyna się w fizycznej komórce pamięci pod adresem 0:0, przechowując adresy tych procedur obsługi przerwań. Każdy adres jest pełnym adresem segmentowym, wymagającym czterech bajtów więc jest 400h bajtów w tablicy wektorów przerwań – jeden adres segmentowy dla każdego z 256 możliwych przerwań programowych. Na przykład, int 0 przekazuje sterowane do podprogramu którego adres znajduje się w komórce 0:0, int 1 przekazuje sterowanie do podprogramu, którego adres jest pod 0:4, int 2 pod 0:8, int 3 pod 0:C a int 4 pod 0:10. Kiedy resetujemy PC jedną z pierwszych czynności jest zainicjalizowanie kilku z tych wektorów przerwań aby wskazały podprogramy usług BIOS. Później, kiedy wykonujemy odpowiednią instrukcje int, sterownie jest przekazane do właściwego kodu BIOS. Jeśli tylko wywołujemy podprogramy BIOS ( w przeciwieństwie do ich napisania) możemy zobaczyć, że instrukcje int są niczym więcej niż specjalnymi instrukcjami call. 13.2 Wprowadzenie do usług BIOS’a BIOS IBM PC używa przerwań programowych 5 i 10h..1Ah dla realizacji różnych działań. Dlatego też instrukcje int 5 i int 10h.. int 1ah dostarczają interfejsu do BIOS’a. Poniższa tablica streszcza usługi BIOS: INT Funkcja 5h Operacja zrzutu ekranowego 10h Obsługa monitora 11h Konfiguracja komputera 12h określenie rozmiaru pamięci 13h Usługa obsługi dysków 14h Obsługa złącza szeregowego I/O 15h Dodatkowe funkcje 16h Obsługa klawiatury 17h Obsługa drukarki 18h BASIC 19h Gorący restart systemu 1Ah Usługa zegara czasu rzeczywistego Większość z tych podprogramów wymaga różnych parametrów w rejestrach 80x86. Niektóre wymagają dodatkowych parametrów w pewnych komórkach pamięci. Poniższe sekcje opisują dokładnie działanie wielu z podprogramów BIOS’a. 13.2.1 INT 5 –WYDRUK ZAWARTOŚCI EKRANU Instrukcja int 5h Działanie BIOS wydruk bieżącej zawartości ekranu Parametry brak Jeśli wykonujemy instrukcję int 5h, PC wyśle dokładna kopię obrazu monitora na drukarkę jak gdybyś nacisnął klawisz PrtSc na klawiaturze. W rzeczywistości BIOS wywołuje instrukcję int 5h kiedy naciskasz PrtSc, więc te dwie operacje są dokładnie identyczne (jedynie jedna jest sterowana programowo zamiast ręcznie). Zauważmy, że 80286 i późniejsze procesory również używają int 5h dla pułapki BOUNDS. 13.2.2 INT 10h - USŁUGI VIDEO Instrukcja int 10h Działanie BIOS Usługi video Parametry Kilka, przekazywane w rejestrach ax, bx, cx, dx i es:bp Instrukcja int 10h wykonuje kilka pokrewnych funkcji ekranowych. Możemy zastosować ja do inicjalizacji monitora, ustawienie rozmiaru i pozycji kursora, odczyt pozycji kursora, manipulacje piórem świetlnym, odczyt i zapis aktywnej strony, przesuwanie danych na ekranie w górę i w dół, odczyt i zapis znaków, odczyt i zapis pikseli w trybie graficznym i zapis łańcucha znaków na ekranie. Wybierasz poszczególne funkcje poprze ustawienie wartości w rejestrze ah. Usługi video przedstawiają jeden z większych zbiorów dostępnych wywołań BIOS. Jest wiele różnych kart graficznych wyprodukowanych dla PC , każda z pomniejszymi zmianami i często mająca swój własny, unikalny zbiór funkcji BIOS.. BIOS odnosi się w tej dodatkowej liście do większości dostępnych funkcji, ale jak powiedziałem wcześniej, lista ta jest niekompletna i przestarzała, nie nadążając za szybkimi zmianami w technologii. Prawdopodobnie najbardziej powszechnym zastosowaniem wywołania usługi video jest podprogram wypisujący znaki: Nazwa: Zapis znaku na ekranie w trybie TTY Parametry: ah = 0Eh, al. = kod ASCII (w trybie graficznym, bl = numer strony) Podprogram ten zapisuje pojedynczy znak na ekranie. MS-DOS wywołuje ten podprogram do wyświetlania znaków na ekranie. Standardowa Biblioteka UCR również dostarcza wywołania , które pozwala nam zapisać znak bezpośrednio na ekranie przy użyciu wywołania BIOS. Większość podprogramów ekranowych BIOS jest napisanych kiepsko. Są one niezmiernie wolne i nie dostarczają, w pewnym sensie, poprawy funkcjonalności. Z tego powodu większość programistów (którzy potrzebują wysoko wydajnych sterowników ekranowych) kończy na napisaniu swoich własnych kodów ekranowych. Uwzględnia to szybkość przy nakładach na przenośność oprogramowania. Niestety, rzadko mammy inny wybór. Jeśli chcemy funkcjonalności zamiast szybkości, powinniśmy rozważyć zastosowanie sterownika ekranowego ANSI.SYS dostarczanego z MS-DOS. Sterownik ten dostarcza wszystkich rodzajów użytecznych usług, takich jak czyszczenie końca linii, czyszczenie końca ekranu, itp. TABLICA 49: FUNKCJE VIDEO BIOS (Lista częściowa) AH Parametry wejściowe Parametry wyjściowe Opis 0 al = tryb wyświetlanie Ustawianie trybu wyświetlania 1 ch - linia początkowa cl - linia końcowa Ustawienie kształtu i rozmiaru kursora. Wartości linii są w zakresie 0..15. Możemy ukryć kursor poprzez ustawienie ch = 20h 2 bh – numer strony dh - wiersz dl – kolumna Ustawienie pozycji kursora (x,y) na ekranie. Zazwyczaj określimy stronę zerową. BIOS zachowa oddzielny kursor dla każdego kursora. 3 bh – numer strony ch – linia początkowa cl – linia końcowa dl – kolumna dh – wiersz Pobranie pozycji i rozmiaru kursora 4 Przestarzałe (obsługa pióra świetlnego) 5 Al.–numerstrony Ustawienie aktywnej strony. Zmiana aktywnej strony na stronę o wyszczególnionym numerze. Strona zerowa jest standardową stroną tekstu. Większość kart graficznych wspiera do ośmiu stron tekstu (0..7) 6 Al– liczba linii do przewinięcia Bh – atrybut ekranowy dla wyzerowanej przestrzeni cl – kolumna lewego górnego rogu okna ch – wiersz lewego górnego rogu okna dl - kolumna prawego dolnego rogu dh – wiersz prawego dolnego rogu Czyści lub przesuwa okno. Jeśli al Zawiera zero, funkcja czyści prostokątną część ekranu wyszczególnioną przez cl / ch (lewy górny róg) i dl / dh (dolny prawy róg). Jeśli al. Zawiera jakąś inną wartość, prostokątne okno będzie przewijane w dół o liczbę linii określoną w al. 7 Al.– liczba linii do przewinięcia Bh – atrybut ekranu dla czyszczonej przestrzeni 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 Czyści lub przesuwa okno. Jeśli al zawiera zero, funkcja czyści prostokątną część ekranu wyszczególnioną przez cl / ch (lewy górny róg) i dl / dh (dolny prawy róg). Jeśli al Zawiera jakąś inną wartość, prostokątne okno będzie przewijane w dół o liczbę linii określoną w al 8 bh – numer strony Al. – kod znaku Ah – atrybut znaku Odczyt bajtu kodu i atrybuty znaku ASCII spod bieżącej pozycji kursora 9 l. – znak Bh – numer strony bl – atrybut cx – liczba znaków do zapisania Zapisuje cx kopii znaku i atrybutu z al./bl zaczynając spod bieżącej pozycji kursora na ekranie. Nie zmienia pozycji kursora. 0Ah Al. – znak Bh – numer strony Zapisuje znak z al. w bieżącej pozycji ekranu stosując istniejący atrybut. Nie zmienia pozycji kursora 0Bh Bh - 0 bl – kolor tła Ustala paletę kolorów dla wyświetlania tekstu 0Eh Al. – kod znaku Bh – numer strony Wypisuje znak na ekranie. Używa istniejącego atrybutu i zmienia pozycję kursora po zapisaniu 0Fh ah – liczba znaków w wierszu al. – tryb pracy bh – numer strony Zwraca informacje o trybie video Zauważmy, że jest wiele innych podfunkcji BIOS 10h. W większości te inne funkcje zajmują się trybem graficznym (BIOS jest zbyt wolny aby zajmować się grafiką, więc nie powinniśmy używać tych wywołań) i rozszerzonym cechami pewnych kart graficznych. 13.2.3 INT 11h – Konfiguracja komputera Instrukcja: int 11h Działanie BIOS: zwraca listę wyposażenia komputera Parametry: na wejściu: żadnych, na wyjściu: AX zawierający listę wyposażenia [ Pobierz całość w formacie PDF ] |
Podobne
|