Wykład 6
Wsparcie makroasemblera dla budowy
blokowej
Bloki programu
Mechanizmy organizuj
ą
ce bloki
Działanie asemblera/loadera/linkera
Organizowanie bloków w procesorach z segmentacj
ą
•
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
blok wspólny
stos
tablice
Segmenty programu
łatwiej zapewni
ć
współdzielenie kodu i
ochron
ę
danych
1
3
2
4
1
4
2
3
przestrze
ń
„u
ż
ytkownika”
fizyczna przestrze
ń
pami
ę
ci
Segmenty/bloki programu
Segmenty/bloki programu
Współdzielenie segmentów/bloków programu
Bity dost
ę
pu przypisane
do segmentów – ochrona
i współdzielenie na
poziomie segmentów
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 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
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 mog
ą
by
ć
umieszczone blisko siebie, dla lepszej czytelno
ś
ci i
panowania nad programem
Bloki programu
Blok 1
Blok 2
Blok 1
Blok 3
Bloki programu
Dyrektywa USE:
USE [blockname]
omini
ę
cie pola danych
Kolejno
ść
w pliku wynikowym:
1, 3, 2, 4
Tu zaczyna si
ę
blok domy
ś
lny
Bloki programu (przykład)
U
ż
yj bloku CBLKS
4096 bajtów
U
ż
yj bloku CDATA
Bloki programu (przykład cd)
U
ż
yj domy
ś
lnego bloku
U
ż
yj bloku CDATA
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)
•
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
•
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
Grupowanie bloków przez asembler
adr wzgl
nr bloku
Grupowanie bloków przez asembler
adr wzgl
nr bloku
•
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
Bloki programu – zadanie loadera
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
4096 b
0027
Bloki programu – korzyści z grupowania
Dodatkowe korzy
ś
ci:
du
ż
e bloki danych poza
obszarem kodu programu
- mo
ż
na zastosowa
ć
krótsze skoki
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
nazwa
SEGMENT
[[READONLY]] [[align]] [[combine]] [[use]] [[‘class’]]
……………..
....................
nazwa
ENDS
Nazwa
: umo
ż
liwia grupowanie cz
ęś
ci segmentu
(ka
ż
da kolejna definicja z t
ą
sam
ą
nazw
ą
=
kontynuacja segmentu) i okre
ś
lenie adresu
Segmenty
nazwa
SEGMENT
[[READONLY]] [[
align
]] [[combine]] [[use]] [[‘class’]]
BYTE, ALIGN(n), WORD, DWORD, PARA, PAGE
Segmenty
BYTE
2 4 16 256
WORD, DWORD, PARA, PAGE
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
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
nazwa
SEGMENT
[[READONLY]] [[align]] [[combine]] [[use]] [[
‘class’
]]
‘CODE’, ‘STACK’, ‘DATA’,
‘CONST’
Segmenty
Okre
ś
la kolejno
ść
post
ę
powania
z segmentami o ró
ż
nych
nazwach
(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
Typowe definiowanie segmentów
...............zmienne
...............instrukcje
obszar stosu
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
Segmenty
Dyrektywa ASSUME:
ASSUME segreg:segloc
Asembler wylicza przesuni
ę
cia, które wraz z zawarto
ś
ci
ą
rej. segment.
okre
ś
laj
ą
pe
ł
ny adres.
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)
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)!
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
Grupowanie segmentów
Rozmieszczenie w pami
ę
ci
Instrukcja początkowa programu
Dyrektywa END:
END symbol
Etykieta instrukcji startowej
Przykład