background image

Wykład 2 

 

 Zaawansowane mechanizmy  

języka asemblera

 

 

 

background image

 

Dyrektywy  

Asemblacja warunkowa  

Makroinstrukcje 

Zagadnienie relokacji 

Postacie pliku wynikowego 

 

background image

Możliwości  asemblera  

p

os

p

  

background image

Dyrektywy  asemblera   

 

 

background image

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. 

background image

Rozszerzenie  języka 

asemblera  - dyrektywy 

W prostych asemblerach 

– kilka 

dyrektyw; 

 

W zaawansowanych asemblerach 

– 

dziesiątki dyrektyw. 

background image

Funkcje dyrektyw 

background image

Funkcje dyrektyw 

background image

Przykłady  dyrektyw 

sterowanie 

identyf. 

background image

Przykłady  dyrektyw 

loader 

tryb 

background image

Przykłady  dyrektyw 

warunki 

tryb asemblacji 

background image

segmenty 

Przykłady  dyrektyw 

background image

segmenty cd 

Przykłady  dyrektyw 

background image

przypisanie 

konsolidacja 

Przykłady  dyrektyw 

background image

Przykłady  dyrektyw 

dane 

dane 

background image

Przykłady  dyrektyw 

makro 

background image

Przykłady  dyrektyw 

błędy 

wydruk 

background image

Przykłady  dyrektyw 

kody 

background image

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 

 

background image

Asemblacja  warunkowa 

Przykład: 

 

background image

Makroinstrukcje 

 

 

 

background image

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) 

background image

Makroinstrukcje 

definicja makro 

„wywołanie”  makro 

„wywołanie”  makro 

.......... 

.......... 

program 

background image

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. 

background image

 

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 

background image

  
       

 
 

 

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 

background image

 
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 

background image

Problemy  makro 

• Instrukcje definiujące makro 
• Zastępowanie parametrów 
• Lokalność symboli 
• Rozwinięcie warunkowe 

background image

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

  . 


background image

Zagnieżdżone  makrodefinicje 

Przetwarzanie makrodefinicji w trakcie rozwijania 

ENDM 

ENDM 

ENDM 

........ 

RDBUFF 

........ 
........ 

WRBUFF 

........ 

MACROS         MACRO 

background image

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 

 


background image

• Substytucja argumentów makro 

– wg. listy 

 

 

STRG  DATA1, DATA2 

– wg. przypisania 

 

 

STRG  SRC=DATA1, DST=DATA2 

Zastąpienie parametrów 

background image

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 

background image

„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 
 

background image

„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!) 

background image

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 

background image

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 

background image

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 

background image

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 

background image

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 

background image

READ 

Search  

(Pseudo-Op Table) 

Search NAMTAB 

(Macro Name Table) 

Search  

(Machine Op Table) 

Process 

machine 

instruction 

Type? 

MACRO 

Define 

Process 

pseudo-ops 

MACRO 

Expand 

Pass 2 

Pass 1 

Makroasembler  2 przejściowy 

background image

Relokacja programów.  Postać wynikowa

   

background image

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ść 

background image

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.

  

background image

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 

background image

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 

background image

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 

background image

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 

background image

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 

background image

-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ść 

background image

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 

background image

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ść 

background image

Plik wynikowy 

background image

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 

background image

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 

background image

 

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... 

background image

Formaty plików wynikowych cd. 

Przykład  budowy a.out UNIX’a 

background image

Formaty plików wynikowych cd. 

background image

Formaty plików  wynikowych  (a.out)

 

background image

Ładowanie programu do 
pamięci 

background image

Relokowalność. Format pliku wynikowego 

Format MS-DOS 

.EXE 

 

adresy 

segment:offset 

po nagłówku: kod 

programu 

background image

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 

background image

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)