Oprogramowanie
podstawowe trybu
rzeczywistego
Cd.: Turbo Debugger, wybrane
urządzenia, zimny start
Co dziś będzie…
• Powtórzenie – program Hello0,
kompilacja i uruchamianie
•
:
– CMOS,
– zegar,
– generator dźwięku,
– ekran,
– klawiatura
• BIOS i DOS – jak startuje system
2
Pierwszy program 16-bitowy
„pod DOS”
2 nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5 start:
PUSH CS
6
POP DS.
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7 koniec:
MOV AH,4CH
8
INT 21H
3 nazwa
ENDS
1
END start
3
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5 start:
PUSH CS
6
POP DS.
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7 koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
4
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5 start:
PUSH CS
6
POP DS.
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7 koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
5
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5
start:
PUSH CS
6
POP DS.
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7 koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END
start
6
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5
start:
PUSH CS
6
POP DS
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7 koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
7
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5
start:
PUSH CS
6
POP DS
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7
koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
8
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11
napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5
start:
PUSH CS
6
POP DS
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7
koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
9
Pierwszy program 16-bitowy
„pod DOS”
2
nazwa
SEGMENT
4
ASSUME CS:nazwa, DS:nazwa
11
napis
DB 0AH, 0DH, "Hej!", 0AH, 0DH, '$‘
5
start:
PUSH CS
6
POP DS
12
MOV DX,OFFSET napis
9
MOV AH,9
10
INT 21H
7
koniec:
MOV AH,4CH
8
INT 21H
3
nazwa
ENDS
1
END start
10
Kompilacja
• e:\Adam\>e:\tasm\bin\tasm /l /zi hello0
Turbo Assembler Version 4.1 Copyright
(c) 1988, 1996 Borland International
Assembling file: hello0.ASM
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 397k
11
„Listing”
12
„Listing”
13
Łączenie i wykonanie
• e:\>e:\tasm\bin\tlink /v hello0
Turbo Link Version 7.1.30.1. Copyright (c)
1987, 1996 Borland International
Warning: No stack
E:\>hello0
Hej!
E:\>
14
TD – program z „debug
information”
15
TD – program po
załadowaniu
16
Po PUSH CS
17
Po POP DS
18
Po ładowaniu DX
19
Po ustawieniu AH
20
Po wypisaniu „Hej!” na
konsoli
21
Ekran użytkownika (AltF5)
22
Po ładowaniu AH
23
Koniec…
24
A tak wyglądał ekran AFD…
25
Wybrane urządzenia - CMOS
• Na płycie głównej urządzenia zewnętrzne z
podtrzymaniem bateryjnym:
– pamięć konfiguracyjna (CMOS)
– Zegar czasu rzeczywistego (licznik impulsów z
generatora)
• Dostęp do komórki pamięci CMOS:
– O adresie ustawionym w porcie o adresie 70H
– Przez port o adresie 071H w przestrzeni I/O
• Np. odczyt komórki 8 CMOS do AL:
– MOV AL,8
– OUT 70H,AL
– JMP $+2
– IN AL,71H
26
Wybrane urządzenia –
CMOS
27
Wybrane urządzenia - zegar
• Zegar czasu rzeczywistego generuje sygnał
przerwania IRQ0
• co 55ms, tzn. 18,2 razy na sekundę
• Jeśli IF=1, sterownik przerwań generuje
przerwanie nr 8
• Podprogram obsługi przerwania
– aktualizuje czterobajtowy licznik w pamięci pod
adresem 0:46CH (licznik zwiększany o 1 co 55ms)
– zmniejsza o 1 wartość jednobajtowego licznika pod
adresem 0:440H
– jak wszystkie podprogramy obsługi przerwań
zewnętrznych:
• MOV AL,20H ; kod EOI (End Of Interrupt)
• OUT 20H,AL ; port sterownika przerwań
28
29
Wybrane urządzenia –
generator dźwięku
• Blokowanie dźwięku (jak bramka A20, czy
reset) przez sterownik klawiatury – port
61H w przestrzeni I/O
• Zera na bitach 0 i 1 – blokują
•
IN AL,61H
; odczytanie portu 61H...
AND AL,0FCH ; maskowanie speaker'a...
OUT 61H,AL ; zapisanie - wyłączenie speaker'a
•
Jedynki na bitach 0 i 1 – zezwalają na
dźwięk
IN AL,61H
; odczytanie portu 61H...
OR AL,3
; odblokowanie...
OUT 61H,AL ; i zapisanie - włączenie
30
31
Wybrane urządzenia –
generator dźwięku
• Wysokością dźwięku steruje rejestr
dostępny przez port 42H, po wpisaniu
wartości 0B6H do portu 43H
• MOV AL,0B6H ;
adres...
• OUT 43H,AL
;
do rejestru 43H;
• MOV AL,DL
;
wys. dźwięku - mniej znaczący B
• OUT 42H,AL
• MOV AL,DH
;
wys. dzwieku - bardziej znaczacy
• OUT 42H,AL
32
Wybrane urządzenia - ekran
• W IBM PC pamięć obrazu na karcie graficznej to tzw.
„wyświetlana pamięć”: dwudostępne urządzenie
pamiętające.
• Zawartość pamięci obrazu jest cyklicznie odczytywana
ok. 20 razy na sekundę przez układy wyświetlania, ta
zawartość steruje obrazem na ekranie.
• Pamięć obrazu może być zapisywana przez procesor –
jest dostępna w przestrzeni adresowej pamięci
operacyjnej.
• Tryb graficzny: gdy jednostka informacji w pamięci
obrazu opisuje jeden punkt na ekranie (pixel)
• Tryb tekstowy (znakowy), gdy opisuje tzw. znak:
prostokątny obszar na ekranie. Znaki są grupowane w
wiersze i kolumny.
33
Tryby znakowe
• W trybach znakowych pojedynczym elementem obrazu na
ekranie jest znak.
• Znak jest obszarem prostokątnym, który może znajdować się
na ekranie tylko w jednym ze ściśle określonych położeń: cały
obraz na ekranie w trybie znakowym składa się z pewnej liczby
wierszy i kolumn znakowych.
• Rozmiar pola znaku (w punktach) zależy od typu sterownika,
zaś liczby kolumn i wierszy zależą od wybranego trybu
znakowego.
• Każdy znak w pamięci video kodowany jest w postaci dwóch
bajtów: pierwszy (o niższym adresie) zawiera kod znaku (ASCII),
zaś drugi bajt (o adresie o 1 większym) zawiera tzw. atrybut,
określający barwę lub stopień szarości znaku (tzw. kolor
pierwszoplanowy), barwę lub stopień szarości tła i wskaźnik
migotania znaku. Migotanie polega na okresowym przełączaniu
koloru znaku z koloru pierwszoplanowego do koloru tła i
odwrotnie. Bit sterujący migotaniem może być wykorzystywany
jako bit sterujący jasnością koloru tła.
34
Tryby podstawowe
• Tablica trybów pracy sterowników obrazu
•
Pamięć
• Tryb_ __Rodzaj__ Rozdzielczość Sterowniki _____Kolory_______
obrazu
• 00h Tekstowy 40 x 25
Oprócz MDA16 stopni szarości
B8000
• 01h Tekstowy 40 x 25
Oprócz MDA16 znak/8 tło
B8000
• 02h Tekstowy 80 x 25
Oprócz MDA16 stopni szarości
B8000
• 03h Tekstowy 80 x 25
Oprócz MDA 16 znak/8 tło
B8000
• 04h Graficzny 320 x 200 Oprócz MDA4 B8000
• 05h Graficzny 320 x 200 Oprócz MDA4 stopnie szarości
B8000
• 06h Graficzny 640 x 200 Oprócz MDA 2
B8000
• 07h Tekstowy 80 x 25
MDA,EGA,HGC czerń/biel
B0000
• 0Bh Zarezerwowany (wewnętrzny dla EGA)
• 0Ch Zarezerwowany (wewnętrzny dla EGA)
• 0Dh Graficzny 320 x 200 EGA
16
A0000
• 0Eh Graficzny 640 x 200 EGA
16
A0000
• 0Fh Graficzny 640 x 350 EGA czerń/biel
A0000
• 10h Graficzny 640 x 350 EGA
16 A0000
35
Atrybut w trybach
tekstowych
• CGA i EGA
• bit nr: 7 6 5 4 3 2 1 0
•
B R G B I
R G B
•
•
Kolor Kolor
•
tła pierwszego planu (znaku)
•
•
migotanie
Intensywność koloru znaku
• R ‑ składowa czerwona barwy (Red);
• G ‑ składowa zielona barwy (Green);
• B ‑ składowa niebieska barwy (Blue).
36
Kodowanie barw
•
bit znaki gdy sterownik
•
•
Wartość
I
R
G
B
Monochrom.
Kolor
•
•
0
0
0
0
0
Czarne
Czarne
•
1
0
0
0
1
Podkreślone
Niebieskie
•
2
0
0
1
0
Zielone
•
3
0
0
1
1
Cyjan
•
4
0
1
0
0
Czerwone
•
5
0
1
0
1
Magenta
•
6
0
1
1
0
Brązowe
•
7
0
1
1
1
Białe
Białe
•
•
8
1
0
0
0
Szare
•
9
1
0
0
1
Jasne Podkr.
Jasne Niebieskie
•
10
1
0
1
0
Jasne Zielone
•
11
1
0
1
1
Jasne Cyjan
•
12
1
1
0
0
Jasne Czerwone
•
13
1
1
0
1
Jasne Magenta
•
14
1
1
1
0
Żółte
•
15
1
1
1
1
Jasne Białe Jasne Białe
•
Cyjan ‑ kolor niebieskozielony;
•
Magenta ‑ fioletowy.
37
Pamięć obrazu
• Obowiązują następujące reguły wyznaczania położenia
bajtów opisujących znak w pamięci obrazu:
• AdK = 2*LK*Y + 2*X
• AdA = 2*LK*Y + 2*X + 1
• gdzie:
• AdK ‑ adres kodu znaku względem początku strony w
pamięci obrazu;
• AdA ‑ adres atrybutu znaku względem początku strony
w pamięci obrazu;
• LK ‑ liczba kolumn w aktualnym trybie, LK {40,80};
• X ‑ numer kolumny pozycji znaku na ekranie, X
{0..LK‑1};
• Y ‑ numer wiersza pozycji znaku na ekranie, Y {0..24}.
38
Przerwanie BIOSu 10H
AH=0 ‑ ustawienie nowego trybu wyświetlania
dane:
AL ‑ nowy tryb wyświetlania; wyniki: nie ma;
AH=1 ‑ ustawienie rozmiaru kursora:
dane: CL (bity 4..0) ‑ numer pierwszej (od góry) linii kursora w polu znaku;
CH (bity 4..0) ‑ numer ostatniej (od góry) linii kursora w polu znaku;
wyniki: nie ma;
AH=2 ‑ ustawienie położenia kursora:
dane:
BH ‑ numer strony;
DL ‑ nr kolumny;
DH ‑ nr
wiersza;
wyniki: nie ma;
AH=3 ‑ odczytanie położenia i rozmiaru kursora:
dane:
BH ‑ numer strony;
wyniki
:DL ‑ nr kolumny, w której znajduje się kursor;
DH ‑ nr wiersza, w którym znajduje się kursor;
CL (bity 4..0) ‑ numer pierwszej (licząc od góry) linii kursora w polu
znaku;
CH (BITY 4..0) ‑ numer ostatniej (licząc od góry) linii kursora w polu
znaku;
39
Przerwanie BIOSu 10H cd.
AH=4 ‑ ustawienie numeru (przełączenie) strony wyświetlanej
dane: AL ‑ nowy numer strony do wyświetlania; wyniki: nie
ma;
AH=8 ‑ odczytanie znaku i atrybutu z pozycji wskazywanej przez
kursor:
dane: BH ‑ numer strony; wyniki: AL ‑ kod znaku; AH ‑ atrybut;
AH=9 - zapisanie znaku i atrybutu wielokrotnie na pozycji
wskazywanej przez kursor:
dane: BH ‑ nr strony; AL ‑ kod znaku; BL ‑ atrybut; CX ‑ liczba
powtórzeń znaku;
wyniki: nie ma;
AH=10 (0AH) ‑ zapisanie znaku wielokrotnie na pozycji
wskazywanej przez kursor:
dane: BH ‑ nr strony; AL ‑ kod znaku; CX ‑ liczba powtórzeń
znaku;
wyniki: nie ma;
40
Przerwanie BIOSu 10H cd.
AH=12 (0CH) ‑ zapisanie punktu na ekranie (w trybie graficznym;
funkcja niedozwolona dla sterownika Hercules
dane: AL ‑ kolor punktu (piksela);
CX ‑ pionowa pozycja punktu (numer wiersza punktów na
ekranie);
DX ‑ pozioma pozycja punktu (numer kolumny punktów na
ekranie);
BH ‑ numer strony wyświetlanej;
wyniki:
nie ma;
AH=13 (0DH) ‑ odczytanie punktu z ekranu (w trybie graficznym;
funkcja niedozwolona dla sterownika Hercules):
dane: CX ‑ pionowa pozycja punktu (numer wiersza punktów na
ekranie);
DX ‑ pozioma pozycja punktu (numer kolumny punktów na
ekranie);
BH ‑ numer strony wyświetlanej;
wyniki: AL ‑ kolor punktu (piksela);
41
Przerwanie BIOSu 10H cd.
AH=14 (0EH) ‑ zapisanie znaku na ekranie na
polucji kursora i przesunięcie kursora (tzw. zapis w
trybie TTY):
dane: AL ‑ kod znaku do zapisania; BL ‑ kolor tła
(gdy tryb graficzny); BH ‑ numer strony;
wyniki: nie ma;
AH=15 (0FH) ‑ pobranie aktualnego trybu video:
dane: nie ma;
wyniki:
AL ‑ tryb video;
AH ‑ liczba kolumn na stronie;
BH ‑ numer strony wyświetlanej.
42
Funkcja 9 DOSu
AH=9 przy wywołaniu przerwania INT 33
(21H) ‑ wyprowadzenie łańcucha znaków
ograniczonego znakiem $ (dolara):
dane:
DS:DX ‑ adres początku łańcucha
znaków;
wyniki: nie ma;
łańcuch znaków powinien być zakończony
znakiem $ (dolara), który nie będzie
wysyłany na ekran. Nie ma sposobu
wyświetlenia znaku dolara za pomocą tej
funkcji.
43
Wybrane urządzenia -
klawiatura
44
Przerwania klawiatury 1
• Przerwanie sprzętowe 9: po kazdym
wciśnięciu, zwolnieniu i przekroczeniu
interwału przytrzymywania klawisza;
porty sterownika klawiatury od 60H
poczynając
• BIOS odczytuje numer (kod skanowania)
klawisza, dokonuje konwersji na ASCII i
umieszcza te dwa bajty w buforze
pierścieniowym (FIFO) klawiatury
45
Przerwania klawiatury 2
• Przerwanie usługowe BIOS nr 22 (16H), bez „echa”, funkcje:
• AH=0 –
pobranie
znaku z bufora klawiatury: ASCII AL, scan
code AH
• AH=1 – sprawdzenie bufora (NIE „wyjmuje” znaku z bufora):
– Jeśli bufor jest pusty, to 1ZF, jeśli nie, to 0ZF i
odczyt
(bez
kasowania w buforze) jak przy funkcji 0
• AH=2 – odczyt bajtu stanu klawiszy specjalnych „shift”
– 7stan Insert (związany z klawiszem Ins)
– 6stan CapsLock
– 5stan NumLock
– 4stan ScrollLock
– 3Alt
– 2Ctrl
– 1lewy klawisz Shift
– 0prawy klawisz Shift
• AH = 10H, 11H, 12H to odpowiedniki 0, 1 i 2 dla „nowych”
klawiatur
46
Przerwania klawiatury 3
• Przerwanie 21H DOS, funkcja AH=10H
„wejście buforowe z klawiatury”
– AH=10H
– DS:DX – adres pola buforowego
– Pierwszy znak pola (ds:dx) powinien
zawierać długość pola
– Wynik: ds:[dx+1] – liczba znaków
wprowadzonych (do Enter lub końca bufora)
– Od ds:(dx+2) wprowadzone znaki
47
Jak startuje 80x86 (także
Pantium, czy np. pierwszy z
rdzeni Core 2 Duo)
Przestrzenie adresowe dostrzegane przez programistę:
Pamięci: 1M + 64K – 16 = 0FFFF0H+0FFFFH = 10FFEFH [B]
I/O: 64KB
Urządzeń pamięci głównej – w zależności od zestawu, np.:
2GB
Pamięci karty graficznej – w zależności od typu, np. 1GB
Przestrzenie niedostępne bezpośrednio, np.:
Pamięci konfiguracyjnej (CMOS)
Dysków…
Niedostrzegalne dla programisty - różnego rodzaju
bufory:
Caches procesora: I i II poziom
Bufory dysków
48
Pamięć w real address
mode
49
Jak startuje system? Zimny
start
• POST: (Power‑On‑Self Test), w którym:
• inicjowanie wszystkich podzespołów płyty głównej i test poprawności ich pracy;
• ustawienie wektorów przerwań BIOS'u, pozostałe wektory ustawiane na "puste"
podprogramy obsługi (IRET);
• Ustalenie i zapamiętanie konfiguracji;
• dołączenie oprogramowania z kart rozszerzeń: obszar od 0A0000H sprawdzany
co 256 B, czy nie zawiera 55AAH ‑ jeśli tak, to CALL FAR PTR xxx:3 (gdzie xxx to
sprawdzany adres); tam program inicjujący:
– inicjalizacja podzespołów karty,
– sprawdzenie ich sprawności i
– ustawienie odpowiednich wektorów przerwań;
• próba odczytania z mechanizmu dyskowego A: pierwszego sektora ze ścieżki
zerowej (boot record), zawierającego prosty program ładujący; w razie
powodzenia ładowania sterowanie jest przekazywane do tego programu;
• w razie niepowodzenia próby odczytu z dysku A: dokonywana jest identyczna
próba odczytu i uruchomienia bootstrap’u z dysku C:
• w razie niepowodzenia odczytu z C: próba uruchomienia interpretera języka
BASIC;
• w razie niepowodzenia wypisanie komunikatu (na monitorze) z żądaniem
włożenia do mechanizmu A: dyskietki systemowej a następnie oczekiwanie na
spełnienie tego żądania.
50
Start DOSu
• Ładowanie pierwszego sektora i CALL
do tego obszaru (MBR lub boot record).
• Poszukiwanie i ładowanie:
– IBMBIO.COM i IBMDOS.COM (IBM)
– IO.SYS i MSDOS.SYS (Microsoft)
• Dodatki według CONFIG.SYS
• Ładowanie COMMAND.COM
• Pierwszy batch: AUTOEXEC.BAT
51