PPS 2013 W6

background image

Wykład 6

Wsparcie makroasemblera dla budowy

blokowej

background image

Bloki programu

Mechanizmy organizujące bloki

Działanie asemblera/loadera/linkera

Organizowanie bloków w procesorach z segmentacją

background image

Metoda organizowania pamięci odpowiadająca sposobowi

korzystania z pamięci przez programistę

program jest zestawem bloków (segmentów). Blok jest

jednostką logiczną:

program

główny

procedura/y

funkcja/e

obiekt/y

zmienne lokalne

zmienne globalne

blo

k wspólny

stos

tablice

Segmenty programu

łatwiej zapewnić współdzielenie kodu i
ochronę danych

background image

1

3

2

4

1

4

2

3

przestrzeń „użytkownika”

fizyczna przestrzeń pamięci

Segmenty/bloki programu

background image

Segmenty/bloki programu

background image

Współdzielenie segmentów/bloków programu

Bity dostępu przypisane
do segmentów – ochrona
i współdzielenie na
poziomie segmentów

background image

Środki programowania

• definiowanie segmentów programu + nadawanie cech
związanych z tłumaczeniem segmentów

• przekształcanie segmentów:

-

grupowanie, scalanie, ustalanie kolejności

• kształtowanie pliku wynikowego

język asemblera

asembler i konsolidator

background image

Środki programowania

• architektury

nie stosujące segmentacji pamięci

-

mechanizmy języka asemblera;

- ochrona

– realizowana programowo

• architektury

z segmentacją pamięci

-

odwzorowanie segmentów w programie w segmenty

pamięci „rozpoznawane” przez procesor

-

ochrona realizowana sprzętowo

Zależność od architektury procesora

background image

blok 0

blok 1

blok 2

blok 0

blok 1

blok 2

program źródłowy

blok 0

blok 1

blok 2

bloki programu

Bloki/segmenty programu

Odnoszą się do fragmentów programu, które mogą być

docelowo uporządkowane inaczej w kodzie wynikowym

niż występują w programie źródłowym

Pola danych umieszczone w pobliżu korzystających

z nich instrukcji

stanowiące procedury fragmenty umieszczone w

tekście programu głównego

main

function

data

blok 0

blok 1

blok 2

program źródłowy

asemblacja

background image

Bloki programu - asembler

Asembler grupuje części kodu/danych, które są rozproszone w

programie źródłowym, a posiadają ten sam charakter

Korzyści:

Grupowanie zapewnia oszczędność miejsca i krótszy kod

Dzięki tej funkcjonalności – związane ze sobą dane i kod

w

programie źródłowym

mogą być umieszczone blisko siebie, dla

lepszej czytelności i panowania nad programem

background image

Bloki programu

Blok 1

Blok 2

Blok 1

Blok 3

background image

Bloki programu

Dyrektywa USE:

USE [blockname]

ominięcie pola danych

Kolejność w pliku wynikowym:
1, 3, 2, 4

background image

T

u zaczyna się blok domyślny

Bloki programu (przykład)

Użyj bloku CBLKS

4096 bajtów

Użyj bloku CDATA

Blok

domyślny

Blok „CDATA”

Blok „CBLKS”

background image

Bloki programu (przykład cd)

Użyj domyślnego bloku

Użyj bloku CDATA

Blok

domyślny

Blok

„CDATA”

background image

Użyj domyślnego bloku

Blok domyślny (bez nazwy) zawiera instrukcje wykonywalne

Blok CDATA zawiera pojedyncze dane (jedno-

kilka słów)


Blok CBLKS zawiera dane blokowe (tablice)

Użyj bloku CDATA

Bloki programu (przykład cd)

Blok

domyślny

Blok

„CDATA”

background image

asembler logicznie rearanżuje bloki grupując składowe

rezultat – odpowiada wynikowi przepisania programu do

postaci, w której występują zwarte segmenty

Bloki programu – zadanie asemblera

..........

CDATA

CBLKS

asemblacja

background image

Asembler używa wielu liczników programu

dyrektywa

USE

Dyrektywy wyróżniają sekcje, które zostaną załadowane w różne

obszary pamięci

I przejście asemblera

Każdy blok programu – odrębny LC
Każda etykieta w bloku –

adres względny

w stosunku do

początku bloku

Na zakończenie I przejścia, końcowa dla bloku wartość LC =

długość bloku

Asembler może przypisać każdemu blokowi adresy

początkowe w pliku wynikowym

II przejście asemblera

Adres każdego symbolu może być wyliczony poprzez

sumowanie adresu początkowego bloku z

adresem względnym

symbolu

Bloki programu – zadanie asemblera

nie stosowane, gdy segmenty pamięci

background image

Grupowanie bloków przez asembler

adr wzgl nr bloku

background image

Grupowanie bloków przez asembler

adr wzgl nr bloku

background image

asembler „wewnętrznie” rearanżuje kod i dane w zwarte

bloki

kod generowany do pliku wynikowego nie musi być

fizycznie przeorganizowany

– wystarczy, że asembler

wpisze właściwy adres początkowy dla każdej sekcji

Przykład zawartości pliku wynikowego

Bloki programu – asembler/loader

background image

Bloki programu – zadanie loadera

dane

zainicjalizowane

dane

zainicjalizowane

background image

Dodatkowe korzyści:

nie ma potrzeby
generowania kodu dla
tych 2 bloków –
wystarczy zarezerwować
miejsce w pamięci

Bloki programu – korzyści z grupowania

background image

4096 b

Bloki programu – korzyści z grupowania

Dodatkowe korzyści:

duże bloki danych poza
obszarem kodu programu
-

można zastosować

krótsze skoki

background image

Bloki programu dla procesorów wspierających

segmenty pamięci

(ukryte)

Dostęp do danych z różnych segmentów
wymaga zmiany (częste?) zawartości
rejestru segmentowego

grupować

dane w segmentach

background image

nazwa

SEGMENT

[[READONLY]] [[align]] [[combine]] [[use]] [[

‘class’]]

……………..
....................
nazwa

ENDS


Nazwa

: umożliwia grupowanie części segmentu

(każde kolejne użycie tej samej nazwy = kontynuacja
segmentu) i określenie adresu

Segmenty

background image

nazwa

SEGMENT

[[READONLY]] [[

align

]] [[combine]] [[use]] [[

‘class’]]

BYTE, ALIGN(n), WORD, DWORD, PARA, PAGE

Segmenty

BYTE

2 4 16 256

WORD, DWORD, PARA, PAGE

background image

nazwa

SEGMENT

[[READONLY]] [[align]] [[

combine

]] [[use]] [[

‘class’]]

PUBLIC, STACK, COMMON, ATaddress, PRIVATE

Segmenty

Określa porządek wpisywania segmentów z

tą samą nazwą

do

pliku wynikowego

PUBLIC, STACK

– przed wpisaniem

do pliku wynikowego

składowe segmentu są scalane; (STACK pozwala
zainicjalizować rejestr SS)

PRIVATE

w pliku wynikowym

składowe segmentu nie są

scalone

background image

nazwa

SEGMENT

[[READONLY]] [[align]] [[combine]] [[use]] [[

‘class’

]]

‘CODE’, ‘STACK’, ‘DATA’,
‘CONST’

Segmenty

Określa kolejność postępowania

przez konsolidator

z

segmentami o różnych nazwach

background image

(1) asembler łączy wszystkie segmenty PUBLIC o tej samej nazwie

(2) po złączeniu wpisuje do pliku wyjściowego w kolejności, jak w
programie źródłowym (z adresem początkowym pierwszego
składnika segmentu)

(3)

konsolidator

rearanżuje segmenty. Zaczyna od pierwszego

segmentu w pliku, następnie szuka segmentu o tej samej klasie i
konsoliduje go, wpisując jako kolejny do pliku .EXE

(4) powtarza kroki dla następnych klas

Segmenty - grupowanie

background image

nazwa

SEGMENT

[[

READONLY

]] [[align]] [[combine]] [[

use

]] [[

‘class’]]

USE16, USE32, FLAT

Segmenty

Określa, czy generowany kod
ma odpowiadać 16, czy 32-
bitowym przesunięciom

-

wywołania procedur, powroty

-skoki


asembler wykaże błąd, gdy
napotka instrukcję
zapisującą do segmentu

nie zabezpiecza

przed

zapisaniem w trakcie
wykonania programu

READONLY

background image

Typowe definiowanie segmentów

...............zmienne

...............instrukcje

obszar stosu

background image

Segmenty

W procesorze rejestry segmentów np. : CS (+ FS), DS (+ GS), SS, ES.

Użytkownik odpowiedzialny za załadowanie właściwych wartości do
rejestrów segmentowych.

Przykład:

PROG

SEGMENT

ASSUME

CS:

PROG

START

:

ADD

AX, BX

ADD

AX, CX

INT 3

PROG

ENDS

END

START

Procesory z segmentacją pamięci

background image

Segmenty

Dyrektywa ASSUME:

ASSUME segreg:segloc

Asembler wylicza przesunięcia, które wraz z zawartością rej. segment.
określają pełny adres zmiennej symbolicznej.

Przesunięcia do danych

z innego, niż bieżący, segmentu poprzedza „adresem” tego segmentu


Dyrektywa informuje asembler jaką wartość rej. segment. ustalił
użytkownik. Nie generuje kodu ML!


ASSUME zwykle nie potrzebna dla CS (CS automatycznie przypisany
do bieżącego segmentu programu

nazwa segmentu lub grupy

(równoważne wyrażenie)

background image

Segmenty - ASSUME

Program omija wpis do rejestru
segmentowego; dostęp do danych

błędnie

wykonany zostanie w segmencie

DSEG1 (z przesunięciami jak do
segmentu DSEG2)!

background image

Segmenty - ASSUME

Dobra praktyka:

umieść ASSUME przed procedurą

.... jeśli tu następna procedura poprzedź ją dyrektywą ASSUME

Używaj nazw w postaci:

DS1:variable

background image

Grupowanie segmentów

Rozmieszczenie w pamięci

background image

Instrukcja początkowa programu

Dyrektywa END:

END symbol

Etykieta instrukcji startowej

Przykład


Wyszukiwarka

Podobne podstrony:
PPS 2013 W2
PPS 2013 W7
PPS 2013 W5
PPS 2013 W4
PPS 2013 W8
PPS 2013 W5
PPS 2013 W2
GF w6 18.11, Geologia GZMiW UAM 2010-2013, I rok, Geologia fizyczna, Geologia fizyczna - wykłady, 03
Logika W6 2013 14 ppt
14 lutego 2013, PPS, Różne
GF w6 23.03, Geologia GZMiW UAM 2010-2013, I rok, Geologia fizyczna, Geologia fizyczna - wykłady, 05
PPS W6
w6 11 2013
w6 14 11 2013

więcej podobnych podstron