, AOA 13, inforamtyka, art of assembly language 

AOA 13

AOA 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 ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • dodatni.htw.pl