Plik wynikowy
Produktem asemblera -> plik wynikowy - umożliwia wielokrotne załadowanie raz przetłumaczonego programu (ioader); wyjątek asemblery typu „przetłumacz-i-załaduj”.
Plik wynikowy zwykle * kod wykonywalny (in. maszynowy), lecz postać pośrednia
- instrukcje dla loadera jak załadować program
Format kodu wynikowego zależy od tego, jak dalece ma być on przetwarzany przed ostatecznym załadowaniem programu do pamięci.
- przemieszczanie programu
- konsolidacja z innymi modułami
Główne składowe i główne operacje asemblera
Plik wynikowy
Organizacja typowego pliku wynikowego
•Informacja nagłówkowa: informacja o pliku:rozmiar kodu, nazwa pliku źródłowego, data utworzenia
•Kod wynikowy: Instrukcje binarne i dane utworzone przez kompilator lub asembler
•Informacja relokacyjna: Lista pozycji w kodzie wynikowym, które muszą podlegać relokacji
•Symbole: globalne symbole zdefiniowane w danym module, symbole importowane z innych modułów, symbole zdefiniowane przez linker •Informacja dla debuggingu: informacje nieużyteczne dla loadera lecz potrzebne dla debuggera (np. symbole lokalne, nry wierszy itp..)
Niektóre formaty pliku wynikowego zawierają dodatkowe informacje.
Wystarczający dla załadowania format obejmuje binarny kod wynikowy.
0000 0001 0002 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 010A 01 OB 01OC 010D 010E 010F 0110 |
02 01 00 B2 97 74 0A 12 01 09 80 F7 78 FF D8 FE D5 E0 F9 22 | |||
np. MS-DOS .com (rozmieszczenie i start zawsze od tego samego adresu 0100H) | ||||
1 | ||||
Przykład prostego formatu pliku wynikowego.
Madonn L&hguag*
Rozwój asemblera Assemblei Langu og>?
At^duto Assomblor
Intel Hex Codę :030000 00020100FA
:10010000B297740A12010980F778FFD8FED5E0F99A
:0101100022CC
:00000001FF
Opis pierwszej linii piiku .HEX (intei Hex Codę)
: 03 0000 00 02 01 00 FA
| | | | | | |_ suma kontrolna
I I I I I I
| | | |_|_|_bajty kodu maszynowego (3)
I I I
I I I_typ
I I
| |_adres rozmieszczenia pierwszego bajtu
I
|_liczba bajtów kodu maszynowego
Przykładowy format heksadecymalny Intela pliku wynikowego.
Directiv*s
Relneallon
Bila
ł
Esternal
Relocatable
Routinas
ł
Rdoca.tfl.ble Assc-mbler and Loador
Llnking Loador - Macios -
I
it lonal Aflsombly
External
Routincs
t
Absolut* Assomblor with
Libr ary Routines
Ma ero As&einbler
Full-Fo&ture. Reloeatsbl* Maero As-sembler, willi Cond11 lonal Asac-mbly
' 1 r2 |
MACROS RDBUFF |
MACKO MACRO |
{Defines SIC standard version macros) &INDEV, &BUFADR, &RECLTH | |
{SIC standard version) | ||||
3 r 4 |
WRBUFF |
ENDM MACRO |
{End of RDBUFF} &OUTDEV, &BUFADR, &RECLTH | |
(SIC standard version} | ||||
5 |
ENDM |
{End of WRBUFF} | ||
6 |
ENDM |
{End of MACROS} |
• Substytucja argumentów makro
- wg. listy
STRG DATA1, DATA2
- wg. przypisania
STRG SRC=DATA1, DST=DATA2
• Podstawowy asembler - brak symboli lokalnych;
• Makroasembler - zwykle kopiuje tekst źródłowy bez zmian symbole w tekście makrodefinicji nie są lokalne. —> Odrębne polecenie (LOCAL) dla określenia symboli lokalnych.
- Makroprocesor nadaje unikalne nazwy w czasie wstawiania tekstu makrodefinicji do programu
- Np. STRG MACRO
X1 EQU 10H -► STRG_1_X1 EQU 10H
Parametr w tekście - zastąpiony kolejnym argumentem z listy
FOR parametr, <argument [,argument]..•>
tekst makro
ENDM
- dyrektywa REPEAT
Powtórz makro „wartość wyrażenia” razy
REPEAT wyrażenie tekst makro ENDM
- dyrektywa WHILE
Powtarzaj tekst makro kiedy wyrażenie = TRUE (modyfikacja w makro!)_
WHILE wyrażenie tekst makro ENDM
Przetwarzanie programy
Program źródłowy
Przetwarzanie makro
Makro pno.,
Program rozwinięty
Definicja
„wklej''
“Rozpoznaj definicje “Zachowaj definicje “Rozpoznaj wywołania makro °Rozwiń wywołania makro
i
Kod wynikowy
• Wymaganie
- Każde makro musi być uprzednio zdefiniowane
• Działania makroprocesora przy analizie tekstu źródłowego
- makrodefinicja: DEFINE
- wywołanie makro: EXPAND
° DEFTAB : tablica definicji, tekst makro,
° NAMTAB : tablica nazw, indeks do DEFTAB,
ARGTAB
NAMTAB
DEFTAB
Makroprocesory
• Jednoprzejściowe
- Każde makro musi być zdefiniowane przed użyciem jego wywołania
- Może podczas rozwijania makro przetwarzać definicje
- dopuszczalne definicje zagnieżdżone
• Dwuprzejściowe
- Przejście 1: rozpoznaj makrodefinicje
- Przejście 2: rozpoznaj makrowywołania
Algorytm jednoprzejściowego makroprocesora
EXPAND
Kopiuj
tekst
rozwinięcia,
substytucja
nazwa makro do ja do NAMTAB DEFTAB
☆
☆
★
★
Etykieta |
Dyrektywa |
Operand |
Komentarz |
Symbol |
SEGMENT |
Parametry |
Definicja segmentu; segmenty o wspólnej nazwie łączone; |
Symbol |
ENDS |
Brak |
Koniec segmentu |
Brak |
ASSUME |
Rej.Segminazwa |
Inf. dla asemblera którego segmentu dotyczy adres zawarty w „Rej.Segm" |
Opcjonalna |
GROUP |
Lista segmentów |
Złącz wymienione segmenty w jeden moduł |
Symbol |
EQU |
Wyrażenie |
Przypisanie symbolowi jego wartości (wartości mogą być względne lub bezwzględne) |
Symbol |
MAX (MIN) |
Lista wyrażeń |
SymboL-max (min) z listy |
Symbol |
SET |
Wyrażenie |
SymboU-wyrażenie (ten sam symbol można definiować wielokrotnie za pomocą SET) |
Brak |
USING |
Nazwa |
Wskazanie aktywnego rejestru bazowego |
Brak |
EXTRN |
Lista symboli |
Symbole zdefiniowane poza bieżącym programem |
Brak |
ENTRY |
Lista symboli |
Symbole wskazują punkty wejścia do programu (wywoływane z innego programu) |
Etykieta |
Dyrektywa |
Operand |
Komentarz |
Opcjonalna |
ASCII |
Łańcuch znaków |
Pole znaków |
Opcjonalna |
DB (DW, DD, DQ, DJ) |
Łańcuch wyrażeń |
Utwórz pole bą|tów (słów, podwójnych-, poczwórnych słów, 10-tek bajtów) zainicjalizowane wartościami wyrażeń |
Opcjonalna |
DATA |
Lista stałych lub symboli |
Utwórz pole zainicjalizowane danymi z listy |
Opcjon. |
DEC |
Lista stałych dziesiętnych |
Utwórz pole zainicjalizowane stałymi dziesiętnymi z listy |
Brak |
LITORG i |
Wyrażenie |
Początek pola literałów |
Symbol |
RECORD j |
Polel :dlug,Pole2:dfug,.. |
Definicja struktury danych |
Symbol |
STRUĆ |
Brak |
Początek definicji struktury; zakończenie dyrektywą ENDS |
Symbol |
MACRO |
Lista parametrów |
Początek makrodefinicji |
Brak |
ENDM |
Brak |
Zakończenie makrodefinicji |
Brak |
IF | |
Warunek, wyrażenie |
Polecenie asemblacjl warunkowej |
Brak |
EŃDIF ! |
brak |
Koniec bloku asemblowanego warunkowo |
Etykieta |
Dyrektywa |
Operand |
Komentarz |
Flaga |
ERRxx |
Wyrażenie |
Asembler zasygnalizuje błąd, gdy jest spełniony warunek „xx” dotyczący wyrażenia |
Brak |
UST |
ON lub OFF |
(LIST/NOLIST) włącz/wyłącz wykonywanie listingu |
Brak |
%OUT |
Łańcuch |
(ECHO) używana do sygnalizacji postępu asemblacji |
Brak |
XREF |
Łańcuch z opcjami |
Dołącz do listingu tabelę odniesień |
Liczba |
DUP |
Usta wyrażeń |
Wielokrotna deklaracja wartości |
Nazwa |
OPDEF |
Parametry |
Początek wierszy definiujących „wirtualną” instrukcję (zakończenie-ENDM) |
Nazwa |
PURGEDEF |
Brak |
Usuń nazwę instrukcji z tabeli instrukcji |
Mnemonik |
OPSYN |
Mnemonik |
Nadaj mnemonikowi z pola etykiety znaczenie mnemonika z pola operandu |
©
Identyfikacja programu |
IDENT |
sterowanie programem źródłowym |
END, INCLUDE |
identyfikacja maszyny |
MACHINĘ, .286, PPU |
sterowanie loadei^em |
LCC |
sterowanie trybem |
ABS, .RADIX, CODĘ, QUAL |
sterowanie blokami 1 LC |
BEGIN, DS, EVEN, LIMIT, ODD, ORG, OVERLAY, USE |
sterowanie segmentami |
SEGMENT, ASSUME, GROUP |
deflnlnlowanle (Inlcjallzacja) symboli |
EQU, MAX, MIN, MICCNT, SET |
definiowanie rejestru bazowego |
USING, DROP |
konsolidacja z podprogramami |
CSECT, ENTRY, EXTRN |
★
★
generacja danych |
ASCII, DB, DW, DD, DQ, DT, DATA, DEC, DEF, DIS, LIT, LITORG, PACKED, RECORD, STRUĆ |
sterowanie makroasemblacją |
ENDM, IRP,MACRO, REMOVE, SYSLIST, SYSNDX |
asemblacja warunkowa |
AGO, AIF, ANOP, ELSE, ENDIF, GBLx, IF-ELSE-ENDIF, IFF, IFT, IIF, LCLx, SET |
sterowanie reakcją na błędy |
ERR, ERRxx |
sterowanie listingiem |
LIST, TITLE, XREF |
definiowanie operacji |
OPDEF, PURGDEF |
zarządzanie tablicą kodów ML |
OPSYN |
Etykieta |
Dyrektywa |
Operand |
Komentarz |
Brak |
END |
Wyrażenie adresowe |
Wskazuje koniec programu. Operand ■ adres startowy programu |
Brak |
INCLUDE |
Nazwa pliku |
Włącz tekst z pliku do programu źródłowego |
Brak |
.486 |
Brak |
WskazijJe program na procesor 80486 |
Brak |
PPU |
Łańcuch tekstowy |
Identyfikuje peryferyjnąjednostkę przetwarzającą |
Brak |
LLC |
Dyrektywa loader’a |
Włącz dyrektywę I. do pliku wynikowego |
Brak |
ABS |
Brak |
Segment nlerelokowalny |
Brak |
REL |
Brak |
Segment relokowalny |
Brak |
.RADIX |
B.O.D.H |
Identyfikacja podstawy pozycyjnego systemu liczb |
Brak |
CODĘ |
Znak |
Wybór kodowania znaków |
Brak |
QUAL |
Nazwa |
Dodanie „nazwa” Jako przedrostka do nazw symboli (symbole lokalne) |
Brak |
USE |
Nazwa LC |
U żywą) LC o nazwie „nazwa” |
Brak |
BEGIN |
Op1, Op2 |
Początek bloku Op1 ■ nazwa LC; op2 ■ adres startowy dla Op1 |
Brak |
DS |
Wyrażenie |
Utwórz „x-wyraźenle” lokalizacji danych |
Brak |
ALIGN |
wyrażenie |
Rozmleić od adr.*"wlelokrotnoicl wyrażenia |
Opcjon. |
ORG |
Wyrażenie |
LCBwyrażenle |
W pierwszym przejściu makroasembler tworzy dodatkową tablicę makr:
- symbol przypisany do makra (nazwa),
- tekst makra,
- biożący licznik użycia w programie
W tym samym przejściu - po znalezieniu symbolu makra, makroasembler zastępuje ten symbol tekstem odczytanym z tablicy.
Wpisany tekst jest analizowany w celu znalezienia etykiet.
- modyfikacja symboli etykiet w tekście makra, aby zachowały lokalny charakter (zwykle unikalny przedrostek)
Dalsza praca makroasemblera - analiza programu - jak w I-szym przejściu asemblera
Procedura a wywołanie makro
Wywołanie procedury; użycie stosu
Ten sam tekst wielokrotnie
Main
Kopiowanie kodo - przykład
Udogodnienia asemlera - asemblacja warunkowa
- IF-ELSE-ENDIF (IFE, IFDEF, IFNDEF...)
- Jeden program - wiele wariantów —> generacja innego kodu w zależności od „otoczenia"
• np. pliku źródłowym zdefiniowano parametr typ procesora Przykład:
Processor = 803 86 ;Set to 8086 for 8086-only codę
if |
Processor eq |
80386 |
shl |
ax, 4 | |
else |
;Must be 8086 processor | |
mov |
cl, 4 | |
shl |
ax, cl | |
endif |
Za wyjątkiem instrukcji:
• z adresowaniem natychmiastowym
• względnym (względem PC, rej. bazowego) kody pozostałych instrukcji wymagają modyfikacji
Wszystkie wartości obliczone przez asembler na podstawie adresów:
- lokalizacje etykiet
- wartości wyrażeń
Dwie możliwości realizacji relokowalności:
• dodawanie do adresów odpowiedniej wartości bazowej przez procesor w trakcie wykonywania programu (rejestr bazowy)
• modyfikacja adresów w trakcie ładowania bądź konsolidacji
programu _
Kooperacja asemblera i loadera (linkera) -> plik wynikowy
Relokowalność. Wyrażenia
• Wyrażenia można sklasyfikować jako bezwzględne or względne
- MAXLEN EQU BUFEND-BUFFER
- BUFEND i BUFFER są wielkościami względnymi, reprezentującymi adresy w programie
- jednakże wyrażenia BUFEND-BUFFER reprezentuje wyrażenie bezwzględne
• Gdy wielkości względne są sparowane z przeciwnymi znakami, zależność od wartości adresu początkowego programu jest zniesiona; wynik na wartość bezwzględną.
Symbol |
Type |
Value |
RETADR |
R |
; 30 |
BUFFER i |
R |
36 |
BUFEND |
R |
1036 |
MAXLEN j |
A |
1000 |
•W ogólności dla określenia typu wyrażenia: przeanalizować typy symboli w programie
•Mnożenie i dzielenie wielkości względnych jest niedopuszczalne
Makroinstrukcje
Makroinstrukcja - symbol, którymu przypisano fragment tekstu programu (w
definicji makroinstrukcji)
Gdziekolwiek w pliku źródłowym znajdzie się symbol zdefiniowanego wcześniej makra, asembler wpisze w jego miejsce w pliku źródłowym tekst przypisany do makra (makro = zmienna asemblera, która może być używana jako “skrót” przypisanego jej tekstu)
• Redukuje liczbę błędów powodowanych przez programistę.
• Umożliwia zdefiniowanie często używanych w programie sekwencji instrukcji.
• Wielokrotne użycie tego makra w tekście programu źródłowego każdorazowo zapewni ten sam rezultat
• Skraca się czas przygotowania programu źródłowego a program zyskuje na przejrzystości.
• Symbole użyte w makro są lokalne w obrębie makro i nie są mylone przez asembler z identycznymi symbolami używanymi poza nim.
ADD_AB_R0R1 |
MACRO CLC |
; zeruj bit przeniesienia |
ADD A,R0 |
; dodaj młodsze bajty | |
ADDC B,R1 |
; dodaj starsze bajty z uwzględnieniem przeniesienia | |
ENDM |
; koniec makro |
- Procesor musi posiadać rejestr bazowy
- Jeżeli procesor posiada rejestr limitu segmentu - możliwość ochrony programu
- Prosta realizacja relokacji; program przetłumaczony z adresami względem początku programu
- Wykonywana przez odrębny program np. w czasie rzeczywistym w trakcie ładowania
- Wymaga odpowiedniej informacji w pliku wynikowym
- Maszyny z sementacją - modyfikacja wartości rejestrów segmentowych; w segmencie adresacja względna
- Uwaga! Modyfikacja nie może dotyczyć adresów lokalizacji poza danym procesem
• Wektory przerwań
• Zasoby systemowe
Bąjty (hex) Znaczenie *—__ | |
| 00-01 | |“MZ” Z ASCII. | |
Format MS-DOS .EXE |
| 02-03 | |L. bajtów używ. w ostatnim 512-bajtowym) bloku. | | |
| 04-05 | L. bloków (512 bajt.) składających się na program | | |
| 06-07 | L. pozycji relokowalnych zapisanych po nagłówku| | |
| 08-09 ||Liczba16-bajtowych paragrafów w nagłówku | | |
| 0A-0B | Min. dodatkowej pamięci (w 16 bajt. paragrafach) | | |
| 0C-0D ||Mak. dodatkowej pamięci (w 16 bajt. paragrafach)} |
adresy segment: offset |
| 0E-0F | |Wzgl. poł. segmentu stosu; inlcjallzacja SS ~/ | | |
| 10-11 | Początkowa wartość SP / | | |
| 12-13 | |Suma kontrolna / | | |
| 14-15 | iPoczątkowa wartość IP (instructlon panter). /[ |
po nagłówku: kod programu |
| 16-17 | |Początk. wzgl. wartość CS / / | |
| 18-19 ||Przes. do pierw, relok. elementp^relpos) / | | |
| 1A-1B ||Numer nakładki (0 - prograrnfgłówny) / | | |
| reipos | |Pozycje relokowalne * / | |
I 0x0 W CZASIE WYKONYWANIA
0x0FCD0 ? | |
PROGRAM | |
0x0FFF123 ^ ? | |
PROGRAM |
PROGRAM
! PROGRAM MOŻE BYĆ
ZAŁADOWANY W DOWOLNE L_ MIEJSCE
0x024
Relokowalność = cecha umożliwiająca przemieszczanie programu w pamięci
Ilustracja zagadnienia relokacji programu.
Relokowalność
Relokowalność posiada szereg korzystnych cech:
• zwiększa efektywność przygotowania programu
• programy mogą być przygotowywane w postaci oddzielnych modułów (np. przez różnych programistów, w tym samym czasie);
• daje możliwość użycia zasobów źródłowych
• do programu można włączyć moduły, które zostały uprzednio przygotowane
• umożliwia wieloprogramową pracę systemu komputerowego
• program może być załadowany w dostępne miejsce w pamięci.
W asemblerze relokowalnym adresy określone dla poszczególnych bajtów są zmienne. Adresy bezwzględne zostaną określone w późniejszym etapie przetwarzania programu przez loader lub linker (konsolidator).
Wiersz źrói |
iłowy |
Załadi |
Dwany o |
id 0000H |
Załad |
owany c |
)d 0A00H | |||||
LJMP |
START |
0000: |
02 |
0A00: |
02 | |||||||
0001: |
01 |
0A01: |
OB | |||||||||
0002: |
00 |
0A02: |
00 | |||||||||
START: CPL LED |
0100: |
B2 |
0B00: |
B2 | ||||||||
0101: |
97 |
0B01: |
97 | |||||||||
MOV A, #10 |
0102: |
74 |
0B02: |
74 | ||||||||
0103: |
0A |
0B03: |
OA | |||||||||
LCALL |
DELAY |
0104: |
12 |
0B04: |
12 | |||||||
0105: |
01 |
0B05: |
OB | |||||||||
0106: |
09 |
0B06: |
09 | |||||||||
SJMP |
START |
0107: |
80 |
0B07: |
80 | |||||||
0108: |
F7 |
0B08: |
F7 | |||||||||
DELAY:MOV R0,#0FFH |
0109: |
78 |
BB09: |
78 | ||||||||
010A: |
FF |
OBOA: |
FF | |||||||||
LOOP:DJNZRO,1 |
LOOP |
01 OB: |
D8 |
OBOB: |
D8 | |||||||
010C: |
FE |
OBOC: |
FE | |||||||||
DJNZ ACC |
DELAY |
010D: |
D5 |
OBOD: |
D5 | |||||||
010E: |
E0 |
OBOE: |
EO | |||||||||
010F: |
F9 |
OBOF: |
F9 | |||||||||
RET |
0110: |
22 |
0B10: |
22 | ||||||||
_______ |
___ |