212 8. Uruchamianie programów asemblerowych
???1???? - nazwa podkatalogu ??1????? - plik zmodyfikowany ?1 ?????? - zarezerwowane 1 ??????? - zarezerwowane
OOH
01H-08H
09H-0BH
OCH-ODH
OEH-OFH
10H-13H
14H-15H
16H-17H
18H-1FH
20H
21H-24H
Numer stacji dysków: 0 - aktualnie Przydzielony dysk, 1 - dysk A:, 2 - dysk B: itd.
Nazwa pliku (bez rozszerzenia); niewykorzystane miejsca wypełnione od prawej strony spacjami
Rozszerzenie nazwy pliku: niewykorzystane miejsca wypełnione od prawej spacjami Wskazanie aktualnego rekordu logicznego w pliku (rekord logiczny składa się z jednego lub więcej bloków po 128 bajtów); po otwarciu pliku ustalany jest na wartość 0 Wielkość bloku w bajtach; standardowo równa 80H, OOH dla bloku o 128 bajtach (po otwarciu pliku wielkość może być zmieniona)
Rozmiar pliku w bajtach (ang. filc size)
Data ostatniego zapisu do pliku adres 15H: rrrrrrrm 1411: mmmddddd
przy czym: rrrrrrr - rok zakodowany dwójkowo liczony od 1980 mmmm - miesiąc dwójkowo ddddd - dzień zakodowany dwójkowo Czas ostatniego zapisu do pliku adres 17H: gggggmmm 16H: mmmsssss przy czym: ggggg - godzina dwójkowo
mmmmmm - minuty dwójkowo
sssss - trzydzieste części minuty dwójkowo (n/30)
Zarezerwowane
Aktualny blok o długości 128 bajtów wewnątrz rekordu logicznego określonego pod adresem OCH-ODH: musi być określony przez program przed dostępem do pliku sekwencyjnego
Bieżący numer bloku w odniesieniu do początku pliku; używany przed dostępem swobodnym do pliku; wskaźnik musi być ustawiany przez program; jeżeli wielkość bloku jest mniejsza niż 64, to używane są tylko trzy bajty wskaźnika___
832. Program EXE2B1N
Program EXE2BIN dostępny jako plik o nazwie EXE2BIN.EXE przekształca plik o rozszerzeniu EXE (uzyskany w wyniku łączenia programem LINK), w plik o rozszerzeniu COM lub BIN. Plik o rozszerzeniu COM jest przewidziany do bezpośredniego ładowania do pamięci operacyjnej i automatycznego wykonania (podobnie jak plik o rozszerzeniu EXE). W przypadku wystąpienia dwóch plików o tej samej nazwie lecz różnych rozszerzeniach EXE i COM, zostanie załadowany i wykonany drugi z wymienionych.
Sposób wywołania programu EXE2BINjesl następujący A> EXE2BIN plik wej[.EXE] [plik_wyj[.ext]
przy czym ext może być: COM lub BIN. ^ 1
Pierwszy parametr określa plik wejściowy przeznaczony do przetwarzania. Pominięcie rozszerzenia powoduje przyjęcie EXE. Pominięcie z kolei nazwy pliku wyjściowego powoduje domyślne jej przyjęcie zgodne z nazwą pliku wejściowego. Niepodanie rozszerzenia nazwy pliku wyjściowego powoduje przyjęcie BIN. Przy tworzeniu programu źródłowego, który ma być przekształcony w program zapisany w pliku o rozszerzeniu COM należy pamiętać, że łączna wielkość programu i obszaru
8.3. Programy pomocnicze danych nie może przekraczać 64 KB, nie może też wystąpić segment stosu. Program powinien rozpoczynać się dyrektywą ORG 100H i nie może zakładać konkretnych wartości dla rejestrów segmentowych. Sposób przeprowadzenia konwersji zależy od początkowej wartości rejestrów CS:IP.
Jeżeli CS:IP nie jest określone, to plik o rozszerzeniu EXE zawiera informacje
0 początkowej zawartości tych rejestrów - równej 0:0 - i o bezpośrednim wykonaniu konwersji. Jeśli program zawiera instrukcje, których konwersja wymaga znajomości położenia programu w pamięci, to EXE2BIN zażąda podania adresów segmentów. W tym przypadku program musi być ładowany w konkretny, żądany obszar pamięci
1 automatyczne ładowanie programu przez system MS-DOS nie może być użyte.
Jeżeli CS.IP jest określone jako 0000:100H, to program EXE2B1N przyjmuje, że program jest w całości relokowalny, a definiowanie położenia programu w pamięci jest niedozwolone. W przypadku, gdy plik wejściowy nie jest zgodny z formatem plików o rozszerzeniu EXE lub rejestry CS:IP mają inną niż ww. wartości, wreszcie gdy program nie jest w całości relokowalny lub przekracza 64 KB pamięci, to jest wyświetlany komunikat o błędzie
File cannot be converted
Po załadowaniu do pamięci operacyjnej programu zapisanego w pliku o rozszerzeniu COM rejestry segmentów zawierają adres segmentu dla PSP, wskaźnik programu 1P przyjmuje wartość 100H, a rejestr SP wartość odpowiednią adresowi końca segmentu programu. Faktyczny rozmiar segmentu zostaje zmniejszony o 256 bajtów w celu zbudowania stosu. Na szczycie stosu (adres 0FFFEH-0FFFFH) zostaje umieszczone zerowe słowo. Jeżeli program kończy się rozkazem RET, to nastąpi skok pod adres OH znajdujący się w obszarze PSP i zostanie wykonany rozkaz INT 20H kończący program. Jest to możliwe pod warunkiem, że wskaźnik stosu będzie miał tę samą wartość przed wejściem do programu i bezpośrednio przed rozkazem RET. Ten sposób kończenia programu nie jest jednak zalecany, gdyż łatwo prowadzi do błędów. Strukturę obszaru PSP przedstawiono w tabl. 8.2.
Na rysunku 8.4 pokazano przykładowe wywołanie programu EXE2BIN oraz katalog dysku po tej operacji. Jak widać, plik o rozszerzeniu COM jest znacznie mniejszy od swego odpowiednika o rozszerzeniu EXE.
B:\ >a:cxc2bin ekran.exe ckran.com B:\ >dir
Volumc in drive B is MASM Directory of B:\EKRAN
< D1R> |
5.02.88 |
9.24 |
<DIR> |
5.02.88 |
9.24 |
1792 |
5.02.88 |
10.08 |
6221 |
5.02.88 |
10.10 |
281 |
5.02.88 |
10.10 |
172 |
5.02.88 |
10.11 |
959 |
5.02.88 |
10.11 |
191 |
17.05.88 68608 bytes frec |
11.45 |
EKRAN ASM EKRAN LST EKRAN OBJ EKRAN MAP EKRAN EXE EKRAN COM
10 File(s)
Rys. 8.4. Przebieg konwersji plików EXE => COM