Tryb Real Address Mode
(lub Virtual 8086-Mode)
Cd. Historia: BIOS, DOS,
programy, struktura
programów
Co dziś będzie…
• Powtórzenie wybranych rozkazów
przenoszących sterowanie
• Struktura programu – zagnieżdżane
podprogramy
• Wybrane przerwania BIOS i DOS
• Zimny start i ładowanie
• Struktura .EXE
2
Rozkazy, które trzeba znać
– ADD, SUB, CMP
– NOT, AND, OR, XOR, TEST
– INC, DEC
– PUSH, POP
– IN, OUT
– JMP, CALL, RET
– Jxx, JCXZ, LOOP
– INT, IRET
3
Rozkazy przenoszące
sterowanie
• Przeniesienie sterowania to zmiana
zawartości licznika rozkazów
–
Sekwencyjne przeniesienie sterowania – gdy
działa automat zwiększający LR o długość
rozkazu
–
Niesekwencyjne: brutalne ładowanie LR
• Niesekwencyjne przeniesienia:
–
Skoki efektywne
–
Sekwencje przerwań
–
Sekwencje powrotu (to rodzaj skoków) IRET
4
Rodzaje skoków
• Skoki:
– Bezwarunkowe a warunkowe
– Bezpośrednie/pośrednie
– Bezwzględne/względne
– Efektywne/nieefektywne (to cecha
wykonania skoku, a nie cecha rozkazu skoku)
• Tylko w trybie adresów rzeczywistych
skoki
• Wewnątrzsegmentowe/międzysegmentowe
5
Skoki bezwarunkowe
• Zawsze efektywne
• JMP adres – far lub near
• JMP SHORT adres – względny, krótki
• CALL adres – far lub near
• RET – far lub near (decyduje
dyrektywa PROC lub zapis RETF)
• IRET
6
Rozkazy powodujące
przerwania
• Przerwania wewnętrzne (supervisor
call)
– INT n
– INT 3 (jednobajtowy)
– INTO (warunkowy)
• Przerwania „undefined opcode”
• Przerwania od „błędów”, np.
dzielenia przez 0
7
Powtórka
• Odłożyć
coś
na stos:
– sp sp-2
– [ss:sp]
coś
• Zdjąć ze stosu
coś
:
–
coś
[ss:sp]
– sp sp+2
• „wykonanie” skoku:
– cs:ip argument far
– Ip argument near
8
Powtórka cd.
• PUSH
coś
– Odłożyć na stos
coś
• POP
coś
– Zdjąć ze stosu
coś
• INT
N
– Żądanie przerwania wewnętrznego do
sterownika
• IRET
– Powrót z przerwania
9
Sekwencja przerwania
N
• Po zakończeniu rozkazu (CS:IP wskazuje
na kolejny rozkaz) pamiętanie stanu
sterowania:
– Odłożyć na stos rejestr F (odpowiednik pushf)
– Odłożyć na stos rejestr CS (push cs)
– Odłożyć na stos rejestr IP (push ip)
• Wymuszenie nowego stanu sterowania:
– IP [0:4*
N
]
– CS [0:4*
N
+2]
10
Sekwencja powrotu IRET
• Odtworzenie stanu sterowania ze
stosu
– IP [ss:sp]
– SP SP + 2
– CS [ss:sp]
– SP SP + 2
– F [ss:sp]
– SP SP + 2
11
Podprogramy
• W języku C:
– Int funkcja (int par1, int par2, int par3);
• W asemblerze:
– PUSH par3
– PUSH par2
– PUSH par1
– CALL funkcja
– ADD SP, 6 ; gdy podprogram w konwencji
C)
12
Podprogram
• Początek
– PUSH BP
– MOV BP, SP
– SUB SP, dlugosc_danych_lokalnych
• Wywoływanie parametrów i zmiennych
– MOV AX,[BP+4] ; parametr 1
– MOV DX, [BP-2] ; zmienna 1
• Konwencja: C a Pascal
– RET lub RET 6
13
Programy rezydentne a
shelle
• SEGMENT
– Deklaracje danych podprogramu obsługi
• OBSLUGA
– podprogram obsługi przerwania
• INIT
– część inicjująca programu
• ENDS
• Po zainicjowaniu, w pamięci tylko
OBSLUGA
14
Jak przejąć przerwanie
• STARY
LABEL DWORD
• CZOFFSET DW ?
• CZSEG
DW ?
----------------------------------------------------------------------------------------
• ; pobranie "przechwytywanego" wektora przerwania
•
MOV AL,NRWKT ; symbol NRWKT to numer wektora
•
MOV AH,35H
; numer funkcji: pobranie wektora nr AL do ES:BX
•
INT 21H
; przerwanie uslugowe DOS'u
• ; zapamietanie starej wartosci wektora
•
MOV CZOFFSET,BX
; czesc OFFSET
•
MOV CZSEG,ES; czesc SEG
• ; teraz ustawienie nowej wartosci wektora - w DS jest juz to samo co w CS
•
MOV DX,OFFSET OBSLUGA
; czesc OFFSET adresu podprogramu
obslugi
•
MOV AL,NRWKT ; numer wektora
•
MOV AH,25H
; funkcja: ustawienie wektora nr AL z DS:DX
•
INT 21H
; przerwanie uslugowe DOS'u
15
OBSLUGA (np. przerwanie
16H)
• OBSLUGA
PROC FAR
•
TEST AH,0EFH
; sprawdzenie czy funkcja odczytu (0 lub 10H)
•
JZ OBSL1
•
JMP CS:STARY
; STARY to adres podwojnego slowa: skok
miedzysegentowy
;
• OBSL1
LABEL NEAR
•
PUSHF
•
CALL CS:STARY ; symulacja sekwencji przerwania (jak po rozkazie
INT):
• ; tu mogą wystąpić różne działania modyfikujące dane wyjściowe z
przerwania
• OK_JUZ
LABEL NEAR
• ; koniec dzialan modyfikujacych
•
IRET
• ; to koniec podprogramu obslugi (czesci rezydentnej programu)
• OBSLUGA
ENDP
16
Zakończ i pozostań
• ; obliczenie nowej długości programu w DX
•
MOV DX,OFFSET INIT
; adres poczatkowy fragmentu "do
odrzucenia"
•
ADD DX,100H ; zwiekszony o dlugosc PSP daje dlugosc pozos-
•
; tajacego w pamieci fragmentu (w bajtach)
•
ADD DX,0FH
; teraz przygotowanie do zaokraglenia do
paragrafow
•
MOV CL,4
; ustawienie licznika przesuniec
•
SHR DX,CL
; wlasciwe zaokraglenie: dzielenie przez 16
(przesunie-
•
; cie logiczne o 4 pozycje w prawo
• ; zakonczenie z pozostaniem w pamieci
•
MOV AL,0
; kod powrotu, rowny 0
•
MOV AH,31H
; funkcja: koncz i pozostaw
•
; w pamieci DX nietykalnych paragrafow
•
INT 21H
; przerwanie uslugowe DOS'u
• ; i to juz koniec programu
17
Przerwania – przegląd
• Mikroprocesorowe
o numerach 0 i 1; do przerwań
mikroprocesorowych zaliczyć można też przerwania o
numerach 3 i 4. Przez przerwania mikroprocesorowe
rozumie się takie przerwania, których cechy
szczególne zależą głównie od mikroprocesora.
• 0 – dzielenie przez 0
– MOV BX,0
– DIV BX
• 1 – single step (flaga TF)
• 2 – przerwanie niemaskowalne (NMI) [zewnętrzne?]
• 3 – breakpoint (INT 3)
• 4 – przerwanie przy nadmiarze (INTO)
18
Przerwania
• Sprzętowe
(zewnętrzne) o numerach 2, 8, 9,
11‑15 (0BH‑0FH). Przerwania sprzętowe wynikają
z organizacji IBM PC i nie można ich zmienić.
Przerwania te obsługiwane są przez BIOS lub
podprogramy zawarte na kartach rozszerzeń.
• BIOS'u
o numerach 5, 16‑28 (10H‑1AH) i 72
(48H), oprócz 24 (18H).
• Tzw.
adresowe BIOS'u
o numerach 27, 28 i 29
(1BH, 1DH i 1EH). W rzeczywistości są to adresy
danych (FAR) specjalnych BIOS'u ‑ pewnych tablic
pomocniczych. Nie są to adresy
podprogramów obsługi.
19
Przerwania główne DOSu
• Główne DOS'u
o numerach 32, 33, 37‑39
(20H, 21H, 25H‑27H). Szczególnie ważne są
przerwania:
– 33 (21H): tzw. przerwanie osłonowe lub
usługowe ‑ stanowi żądanie wykonania
przez DOS jednej z funkcji usługowych
o numerze zadanym w rejestrze AH;
– 32 (20H): żądanie normalnego zakończenia
pracy programu użytkowego;
– 39 (27H): żądanie zakończenia pracy
programu użytkowego z pozostaniem w
miejscu (z przesunięciem początku TPA wg
zawartości rejestru DX).
20
Przerwania (?) adresowe
DOSu
• Tzw.
adresowe DOS'u
o numerach 34, 35 i 36 (22H, 23H i 24H). Można
powiedzieć, że o ile pozostałe przerwania programowe wywoływane są przez
program użytkownika, a obsługiwane przez oprogramowanie systemowe (BIOS
lub DOS), to dla omawianych przerwań rzecz się ma dokładnie odwrotnie:
przerwania te wywoływana są przez DOS, a mogą być obsługiwane przez
program użytkownika
, jeśli ustawi on odpowiednio wektory przerwań.
Przerwania są wywoływane:
– 35 (23H): po naciśnięciu kombinacji klawiszy Ctrl‑Break (^C); jeśli
użytkownik ustawi ten wektor, to zostanie on odtworzony po zakończeniu
pracy programu;
– 36 (24H): po wystąpieniu błędu krytycznego ‑ tzn. takiego, po którym
normalne kontynuowanie programu nie jest możliwe; jeśli użytkownik ustawi
ten wektor, to zostanie on odtworzony po zakończeniu pracy programu;
– 34 (22H): jeśli w programie wystąpi przerwanie 32 (20H ‑ normalne
zakończenie programu), lub 39 (27H ‑ zakończenie z pozostaniem w
miejscu) sterowanie zostanie przekazane pod adres międzysegmentowy
określony tym wektorem, lecz nie będzie to wejście do procedury obsługi
przerwania tylko normalny skok; omawiane "przerwanie" adresowe
wykorzystywane jest przez tzw. nakładki na DOS (np. Norton Commander),
tzn. programy powołujące do pracy inne programy pod swoją kontrolą; jeśli
użytkownik zmieni ten wektor, to musi go odtworzyć przed
zakończeniem pracy programu.
21
Przerwania inne
• Zarezerwowane (na potrzeby wewnętrzne
DOS'u) o numerach 40‑95 (28H‑5FH).
• Użytkownika (do dowolnego wykorzystania
w programach użytkowych) o numerach
96‑103 (60H‑67H).
• Niewykorzystywane o numerach 104‑127
(68H‑7FH) i 241‑255 (0F1H‑0FFH).
• Interpretera języka BASIC o numerach 24 i
128‑240 (18H i 80H‑0F0H).
22
Koniec
Dalej następują materiały pomocnicze:
ilustracje do rozmieszczenia
programów w pamięci…
23
Pamięć w real address
mode
24
25
Co jest w pamięci?
26
System i programy w
pamięci
27
Moduł ładowalny .EXE (DOS)
EXE header
00 word "MZ" - Link file .EXE signature (Mark Zbikowski?)
02 word length of image mod 512
04 word size of file in 512 byte pages
06 word number of relocation items following header
08 word size of header in 16 byte paragraphs, used to locate the
beginning of the load module
0A word min # of paragraphs needed to run program
0C word max # of paragraphs the program would like
0E word offset in load module of stack segment (in paras)
10 word initial SP value to be loaded
12 word negative checksum of pgm used while by EXEC loads pgm
14 word program entry point, (initial IP value)
16 word offset in load module of the code segment (in paras)
18 word offset in .EXE file of first relocation item
1A word overlay number (0 for root program)
RELOCATION TABLE
IMAGE
28
Moduł ładowalny .EXE, cd.
• - relocation table and the program load module follow the header
• - relocation entries are 32 bit values representing the offset into
the load module needing patched
• - once the relocatable item is found, the CS register is added to
the value found at the calculated offset
•
Registers at load time of the EXE file are as follows:
• AX: contains number of characters in command tail, or 0
• BX:CX
32 bit value indicating the load module memory size
• DX zero
• SS:SP
set to stack segment if defined else, SS=CS and
SP=0 or top of memory.
• DS set to segment address of EXE header
• ES set to segment address of EXE header
• CS:IP
far address of program entry point, (label on
"END„ statement of program)
29
Moduł wykonywalny
• PSP – Program Segment Prefix
• Blok opisu otoczenia ENVIRONMENT
– por. komendę SET
• Image a postać .COM
• Organizacja wielu programów w pamięci
• Bloki allokacji pamięci
• UMB – Upper Memory Blocks
30
Bloki allokacji pamięci
31
Bloki po załadowaniu TD
BAL
32
Blok environment
33
PSP i program
34