Wykład 2
Zaawansowane mechanizmy
języka asemblera
Dyrektywy
Asemblacja warunkowa
Makroinstrukcje
Zagadnienie relokacji
Postacie pliku wynikowego
Możliwości asemblera
p
os
tę
p
Dyrektywy asemblera
Rozszerzenie języka
asemblera - dyrektywy
Rozkazy dla asemblera.
Wykonywane przez asembler, nie
tłumaczone na ML.
Mogą wpływać na wynikowy
kod, tablicę symboli, plik listingu,
wewnętrzne parametry
asemblera.
Rozszerzenie języka
asemblera - dyrektywy
W prostych asemblerach
– kilka
dyrektyw;
W zaawansowanych asemblerach
–
dziesiątki dyrektyw.
Funkcje dyrektyw
Funkcje dyrektyw
Przykłady dyrektyw
sterowanie
identyf.
Przykłady dyrektyw
loader
tryb
Przykłady dyrektyw
warunki
tryb asemblacji
segmenty
Przykłady dyrektyw
segmenty cd
Przykłady dyrektyw
przypisanie
konsolidacja
Przykłady dyrektyw
Przykłady dyrektyw
dane
dane
Przykłady dyrektyw
makro
Przykłady dyrektyw
błędy
wydruk
Przykłady dyrektyw
kody
Asemblacja warunkowa
• Polecenia sterujące asemblacją (wykonywane w
czasie asemblacji)
– 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
Asemblacja warunkowa
Przykład:
Makroinstrukcje
Makroinstrukcje
Makroinstrukcja – symbol, któremu 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)
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)
Makroinstrukcje
definicja makro
„wywołanie” makro
„wywołanie” makro
..........
..........
program
Makroinstrukcje
Gdziekolwiek w pliku źródłowym znajdzie się symbol
zdefinio
Korzyści stosowania makroinstrukcji:
•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 (etykiety) 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
; dod. starsze bajty z uwzględnieniem przen.
ENDM
; koniec makro
Przykład definicji makra
Makroinstrukcje
WRREC
RDREC
Np. 2-
krotne
wywołanie
Wywołanie makro a procedura
EXPAND
…
Main
RDBUFF
190a
190m
WRBUFF
210a
210h
WRBUFF
220a
220h
Wywołanie procedury;
użycie stosu
Makro
Main
RDBUFF
WRBUFF
Ten sam
tekst
wielokrotnie
RDREC
WRREC
WRREC
Main
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
Makroasembler
Problemy makro
• Instrukcje definiujące makro
• Zastępowanie parametrów
• Lokalność symboli
• Rozwinięcie warunkowe
Kopiowanie kodu - przykład
Program źródłowy
STRG
MACRO
MOV AX, BX
MOV BX, AX
NOP
ENDM
.
STRG
.
STRG
.
.
Program rozwinięty
.
.
MOV AX, BX MOV
BX, AX
NOP
.
MOV AX, BX MOV
BX, AX
NOP
.
{
{
Zagnieżdżone makrodefinicje
Przetwarzanie makrodefinicji w trakcie rozwijania
ENDM
ENDM
ENDM
........
RDBUFF
........
........
WRBUFF
........
MACROS MACRO
Zastąpienie parametrów - przykład
Program źródłowy
STRG
MACRO
DST, SRC
MOV AX,
SRC
MOV
DST
, AX
NOP
ENDM
.
STRG
DATA1, DATA2
.
STRG
DATA4, DATA5
Program rozwinięty
.
.
MOV AX,
DATA1
MOV
DATA2
, AX
NOP
MOV AX,
DATA4
MOV
DATA5
, AX
NOP
{
{
• Substytucja argumentów makro
– wg. listy
STRG DATA1, DATA2
– wg. przypisania
STRG SRC=DATA1, DST=DATA2
Zastąpienie parametrów
Lokalność symboli
• Podstawowy asembler – brak symboli lokalnych
• Makroasembler
– jeżeli kopiowałby tekst źródłowy
bez zmian symbole w tekście makrodefinicji
nie
byłyby lokalne
• Symbole lokalne
- makroprocesor nadaje unikalne
nazwy w czasie wstawiania tekstu makrodefinicji do
programu
– Np.
STRG MACRO
X1 EQU 10H
STRG_1_X1 EQU 10H
„Makro” - wywołania powtarzane
Dyrektywy
FOR, REPEAT, WHILE
Efekt użycia: skrócenie tekstu programu:
FOR
parametr, <argument [,argument]...>
tekst makro
ENDM
REPEAT
wyrażenie
tekst makro
ENDM
Powtórz makro „wartość
wyrażenia” razy
Parametr w tekście – zastąpiony
kolejnym argumentem z listy
„Makro” - wywołania powtarzane
Dyrektywy
FOR, REPEAT, WHILE
Efekt użycia: skrócenie tekstu programu:
WHILE
wyrażenie
tekst makro
ENDM
Powtarzaj tekst makro kiedy wyrażenie
= TRUE (modyfikacja w makro!)
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
Program źródłowy
Makro procesor
Asembler
Kod wynikowy
Makrodefinicje
Przetwarzanie makro
Definicja
„wklej”
Przetwarzanie programu
Program rozwinięty
•Rozpoznaj definicje
•Zachowaj definicje
•Rozpoznaj wywołania makro
•Rozwiń wywołania makro
W pierwszym
przejściu makroasembler tworzy
tablicę makr:
-
symbol
przypisany do makra (nazwa),
-
tekst makra
,
-
bieżący licznik użycia
w programie
-
argumenty
W tym samym
przejściu - po znalezieniu symbolu
makra, makroasembler
-
zastępuje ten symbol tekstem
odczytanym z tablicy,
- podstawia argumenty
Makroasembler
Makroprocesor jednoprzejściowy
• Wymaganie
– Każde makro musi być uprzednio zdefiniowane
• Działania makroprocesora przy analizie tekstu źródłowego
– makrodefinicja: DEFINE
– wywołanie makro: EXPAND
DEFTAB
NAMTAB
ARGTAB
• DEFTAB
: tablica definicji, tekst makro,
• NAMTAB
: tablica nazw, indeks do DEFTAB,
• ARGTAB
: argumenty.
DEFINE
EXPAND
PROCESSLINE
MACRO
CALL
Definicja zagnieżdżona
!
macro
…
GETLINE
PROCESSLINE
GETLINE
Następny wiersz
PROCESSLINE
jest
makro
ARGTAB
NAMTAB
nazwa makro do
NAMTAB
Algorytm jednoprzejściowego makroprocesora
DEFINE
Kopiuj
definicję
makro z
pliku
źródłowego
EXPAND
Kopiuj
tekst
rozwinięcia,
substytucja
PROCESSLINE
jest
makrowywołanie
RDBUFF
DEFTAB
RDBUFF
makrodefinicja
do DEFTAB
WRBUFF
WRBUFF
makrodefinicja z
DEFTAB
READ
Search
(Pseudo-Op Table)
Search NAMTAB
(Macro Name Table)
Search
(Machine Op Table)
Process
machine
instruction
R
R
Type?
MACRO
Define
Process
pseudo-ops
R
R
MACRO
Expand
R
Pass 2
Pass 1
Makroasembler 2 przejściowy
Relokacja programów. Postać wynikowa
PROGRAM
PROGRAM
0x0FCD0
?
?
0x0FFF123
0x0
0x024
W CZASIE WYKONYWANIA
PROGRAM MOŻE BYĆ
ZAŁADOWANY W DOWOLNE
MIEJSCE
PROGRAM
Ilustracja zagadnienia relokacji programu.
Relokowalność = cecha umożliwiająca
przemieszczanie programu w pamięci
Relokowalność
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.
Wiersz źródłowy
Załadowany od 0000H
Załadowany od 0A00H
LJMP START
0000: 02
0A00: 02
0001: 01
0A01: 0B
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: 0A
LCALL DELAY
0104: 12
0B04: 12
0105: 01
0B05: 0B
0106: 09
0B06: 09
SJMP START
0107: 80
0B07: 80
0108: F7
0B08: F7
DELAY:MOV R0,#0FFH
0109: 78
0B09: 78
010A: FF
0B0A: FF
LOOP:DJNZ R0,LOOP
010B: D8
0B0B: D8
010C: FE
0B0C: FE
DJNZ ACC,DELAY
010D: D5
0B0D: D5
010E: E0
0B0E: E0
010F: F9
0B0F: F9
RET
0110: 22
0B10: 22
Relokowalność. Problem wyrażeń
•
Wyrażenia można sklasyfikować jako
b
ezwzglę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
R
36
BUFEND
R
1036
MAXLEN
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
Kody instrukcji
wymagają modyfikacji
za wyjątkiem
instrukcji:
• z adresowaniem natychmiastowym
• względnym (względem PC, rej. bazowego)
• rejestrowym
• bezargumentowych
W instrukcjach
modyfikacji
wymagają
wszystkie
wartości obliczone przez asembler na podstawie
adresów:
- lokalizacje etykiet
-
wartości wyrażeń
Realizacja relokowalności
D
wie możliwości realizacji relokacji:
1. dodawanie
do adresów odpowiedniej wartości
bazowej przez procesor w trakcie wykonywania
programu (
rejestr bazowy
)
Realizacja relokowalności
– 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 domyślnej
lokalizacji początku programu
D
wie możliwości realizacji relokacji (cd):
2.
modyfikacja adresów
w trakcie ładowania bądź
konsolidacji programu
Kooperacja asemblera i loadera (linkera)
plik wynikowy
Realizacja relokowalności
-
Wykonywana przez odrębny program np. w czasie
rzeczywistym w trakcie ładowania
- Wymaga odpowiedniej informacji w pliku wynikowym
– Maszyny z segmentacją – 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
-asemblery absolutne
asembler absolutny przypisuje bajtom kodu
maszynowego adresy absolutne (bezwzględne)
- asemblery relokowalne
- tłumaczenie z założeniem domyślnej lokalizacji
- wynikowe adresy poszczególnych bajtów traktowane
jako nieostateczne.
- ostateczne adresy bezwzględne zostaną określone w
późniejszym etapie przetwarzania programu przez
loader lub linker (konsolidator).
Relokowalność
Mechanizm umożliwiający relokowalność -
plik wynikowy
Produktem asemblera
plik wynikowy
-
umożliwia wielokrotne
załadowanie raz przetłumaczonego programu (loader); wyjątek
asemblery typu
„przetłumacz-i-załaduj”.
Plik wynikowy zwykle
kod wykonywalny (in. maszynowy), lecz
postać pośrednia
- np. + 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
loadable
linkable
executable
Asembler
Asembler
Linker
(konsolidator)
Konwerter
pliku
wynikowego
Konwenter listingu
PROM
programator
Emulator
sprzętowy
Zintegrowany
debuger
Pakiet
asemblera
Plik listingu z
wartościami
absolutnymi
Plik w
formacie
HEX
Plik tablicy
symboli
Plik
wynikowy
Plik
biblioteczny
Plik ładowalny
Debugger
Elementy mechanizmu umożliwiającego relokowalność i modułowość
Plik wynikowy
0000
02
0001
01
0002
00
0100
B2
0101
97
0102
74
0103
0A
0104
12
0105
01
0106
09
0107
80
0108
F7
0109
78
010A
FF
010B
D8
010C
FE
010D
D5
010E
E0
010F
F9
0110
22
Przykład prostego formatu pliku wynikowego
• rozmieszczenie i start zawsze od tego samego
adresu np. w przykładzie 0000H/0100H
• Inne przykłady: np. MS-DOS .com
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
•Informacja dla debuggingu
:
informacje nieużyteczne dla loadera lecz
potrzebne dla debuggera (np. symbole lokalne, n-ry wierszy itp..)
Niektóre formaty pliku wynikowego zawierają dodatkowe informacje.
Wystarczający dla załadowania format obejmuje binarny kod wynikowy
.
Plik wynikowy
Intel Hex Code
:030000 00020100FA
:10010000B297740A12010980F778FFD8FED5E0F99A
:0101100022CC
:00000001FF
Opis pierwszej linii pliku .HEX (Intel Hex Code)
: 03 0000 00 02 01 00 FA
| | | | | | |_
suma kontrolna
| | | | | |
| | | |__|__|___
bajty kodu maszynowego (3)
| | |
| | |____________
typ
| |
| |_____________
adres rozmieszczenia pierwszego bajtu
|
|______________
liczba bajtów kodu maszynowego
Przykładowy format heksadecymalny Intela pliku
wynikowego
cdn...
Formaty plików wynikowych cd.
Przykład budowy a.out UNIX’a
Formaty plików wynikowych cd.
Formaty plików wynikowych (a.out)
Ładowanie programu do
pamięci
Relokowalność. Format pliku wynikowego
Format MS-DOS
.EXE
adresy
segment:offset
po nagłówku: kod
programu
Relokowalność. Rola loadera
Zwykle ostatni etap relokacji realizuje loader
• Wszystkie pozycje, których adresy umieszczone są po
nagłówku pliku wynikowego podlegają przetworzeniu
– Do wartości pozycji
dodawane jest przesunięcie
wynikające z relokacji
Przykład: ładowanie pliku .exe
• przeczytaj nagłówek (sprawdź typ pliku)
• sprawdź ilość dostępnej pamięci (minalloc/ maxalloc)
• utwórz PSP (obszar z parametrami z linii rozkazowej)
• załaduj program zaraz za PSP (nblocks/lastsize)
• dla każdej relocpos dodaj adres bazowy do nr-u
segment we wskaźniku
• dla każdego tak otrzymanego adresu: dodaj adres
bazowy do wskazanej zawart. Pamięci
• ustaw SP na sp (po relokacji)
• skocz od adresu = ip+relokacja (start programu)