PPS 2013 W4


Wykład 4
Programowanie modułowe w języku
asemblera
Programowanie modułowe
Prog
Proc1-1
Proc1
Proc1-2
Proc1-3
Proc2-1
Proc2
Proc2-2
Proc2-3
Proc3-1
Proc3-2
Proc3
Proc3-3
Programowanie modułowe
0) pij z fili\anki
1) chwyć fili\ankę za ucho
1.1) rozewrzyj palce
1.2) sięgnij ręką do ucha fili\anki
1.3) zaciśnij palce na uchu
2) podnieÅ› fili\ankÄ™ do ust
2.1) unieś rękę do góry
2.2) przysuń rękę poziomo do ust
3) wlej zawartość do gardła
3.1) otwórz usta
3.2) przechyl fili\ankÄ™
3.3) POAYKAJ PAYN!!!
Budowa programu z procedurami
" Dekompozycja funkcjonalna (od góry do dołu) :
 zaprojektuj program przed programowaniem
 podziel du\e zadania na mniejsze
 u\yj struktury hierarchicznej opartej na procedurach
 poszczególne procedury testuj oddzielnie
Summation
Program (main)
Clrs cr PromptForIntegers ArraySum DisplaySum
WriteString ReadInt WriteString WriteInt
WriteInt
Definiowanie i u\ywanie procedur
" Budowanie procedur
" Instrukcje wywołania i powrotu
" Etykiety lokalne i globalne
" Parametry procedur
" Zmienne lokalne
Definiowanie procedury
Prog
Proc1-1
Parametry!!!
Proc1
Proc1-2
Zwykle procedura
Proc1-3
wymaga danych
na przykład
ZEROBYTES zeruje 256
bajtów począwszy od adr
ZEROBYTES: XOR AX, AX
w BX
MOV CX, 128
ZEROLOOP: MOV [BX], AX
ADD BX, 2
NAZWA_PROCEDURY:
LOOP ZEROLOOP
treść procedury
RET
...................
treść procedury
RET
Definiowanie procedury
ZEROBYTES: PROC
Jedna procedura czy dwie?
XOR AX, AX
(ZEROBYTES, DOFFS)
JCXZ DOFFS
ZEROLOOP: MOV [BX], AX
Jeden punkt wejścia czy
ADD BX, 2
dwa?
LOOP ZEROLOOP
RET
DOFFS:
MOV CX, 128
MOV AX, 0FFFFH
FFLOOP: MOV [BX], AX
SUB BX, 2
LOOP FFLOOP
RET
ZEROBYTES: ENDP
Definiowanie procedury
ZEROBYTES: PROC
Jedna procedura czy dwie?
XOR AX, AX
(ZEROBYTES, DOFFS)
JCXZ DOFFS
ZEROLOOP: MOV [BX], AX
Jeden punkt wejścia czy
ADD BX, 2
dwa?
LOOP ZEROLOOP
RET
DOFFS:
dyrektywy
MOV CX, 128
MOV AX, 0FFFFH
PROC
FFLOOP: MOV [BX], AX
ENDP
SUB BX, 2
LOOP FFLOOP
usuwają niejednoznaczność
RET
ZEROBYTES: ENDP
Definiowanie procedury
Definicja procedury:
ProcName proc {near|far}

ProcName endp
Procesory z segmentacjÄ… (Intel x86)
CALL na stosie tylko przesunięcie
RETN
(przesunięcie:segment)
CALL FAR PTR symbol
RETF
na stosie CS i przesunięcie
Więcej o PROC przy omawianiu parametrów
Procedury zagnie\d\one
OutsideProc proc near
& .......
InsideProc proc near
. & ......
InsideProc endp
& .......
OutsideProc endp
Procesory z segmentacjÄ…
(Intel x86)
cseg segment
..............
MyProc proc near
Ret
MyProc endp
..............
cseg ends
Etykiety lokalne i globalne
Lokalna etykieta widoczna tylko dla poleceń w obrębie danej
procedury. Etykieta globalna jest widoczna wszędzie w
programie.
main PROC
jmp L2 ; błąd
L1:: ; etykieta globalna
exit
...........
...........
sub2 PROC
L2: ; etykieta lokalna
jmp L1 ; ok
ret
sub2 ENDP
main ENDP
Parametery procedury
" Dobra procedura powinna być u\yteczna w wielu ró\nych
programach
 nie będzie, je\eli odwołuje się do ustalonych nazw
zmiennych
" Parametry umo\liwiają elastyczność procedur  wartości
parametrów mogą zmieniać się w czasie wykonywania
programu
Parametery procedury
Procedura ArraySum oblicza sumę 32-bitowych wyrazów tablicy (liczby
całkowite). Odwołuje się do 2 nazw zmiennych: myArray, theSum
ArraySum PROC
mov esi,0 ; wskaznik tablicy
mov eax,0 ; wstępnie suma=0
mov ecx,LENGTHOF myArray ;liczba elementów tablicy
L1: add eax,myArray[esi] ; dodaj ka\dy wyraz do sumy
add esi,4 ; wska\ następny wyraz
loop L1 ; powtarzaj size
mov theSum,eax ; wynik do theSum
ret
ArraySum ENDP
Procedura nieprzydatna, gdy trzeba ją wykonywać dla wielu tablic!!!
Klasyfikacja parametrów
" Parametr wejściowy przekazywany do procedury:
 Wywoływana procedura nie będzie modyfikować zmiennej
odpowiadającej temu parametrowi (ew. modyfikacja nie będzie
widzialna poza procedurÄ…).
" Parametr wyjściowy utworzony jest poprzez przekazanie wskaznika do
zmiennej wraz z wywołaniem procedury:
" Procedura nie wykorzystuje wartości zmiennej; przed zakończeniem
wykonywania procedura wpisuje do tej zmiennej wynikową wartość.
" Parametr wejściowo-wyjściowy jest wskaznikiem do zmiennej
zawierającej wartość, która zarówno będzie u\ywana jak i
modyfikowana przez procedurÄ™:
" Zmienna przekazana do procedury jest modyfikowana przez
procedurÄ™.
Przykład
Procedura Swap wymienia wartości dwóch 32-bitowych zmiennych
całkowitych. pValX i pValY (wskazniki do zmiennych) nie zmieniają
wartości. Zmianie podlegają zmienne wskazywane przez wskazniki:
Swap PROC USES eax esi edi,
pValX:PTR DWORD, ; wskaznik do pierwszej zmiennej
pValY:PTR DWORD ; wskaznik do drugiej zmiennej
mov esi,pValX ; pobierz wskazniki
mov edi,pValY
mov eax,[esi] ; pobierz wart. pierwszej zmiennej
xchg eax,[edi] ; zamień z drugą
mov [esi],eax ; zastÄ…p wart. pierwszej zmiennej
ret
Swap ENDP
Przekazywanie parametrów do i z procedury
5 podstawowych mechanizmów przekazywania danych
tylko wejściowe; procedura nie zmienia wartości
parametrów  kopiowanie wewnątrz procedury
" poprzez wartość
wskaznik do zmiennej (adres)
" poprzez odwołanie
przekazywany wskaznik do zmiennej, wartość
zmiennej kopiowana do zmiennej wewn. (mogÄ…
mieć ró\ną wart.). Wyjście - wartość wyniku.
" poprzez zwróconą wartość
jw.; przekazywanie wyłącznie parametru
wyjściowego (nie potrzebne kopiowanie przy
wejściu).
" poprzez rezultat
Wskaznik do funkcji obliczajÄ…cej adres zmiennej
" poprzez nazwÄ™
Przekazywanie parametrów do procedury
...............
rejestry
BLOCK1_ADDR EQU 00AA9988H
komórki pamięci
BLOCK2_ADDR EQU 00AA9988H
----(globalne)
..............
blok
MOV BX, #BLOCK1_ADDR
kod programu
CALL ZEROBYTES
stos
..............
MOV BX, #BLOCK1_ADDR
CALL ZEROBYTES
..................
Mała liczba rejestrów!!!
END
ZEROBYTES: XOR AX, AX
MOV CX, 128
ZEROLOOP: MOV [BX], AX
ADD BX, 2
LOOP ZEROLOOP
RET
Przekazywanie parametrów do procedury
Ta wersja ArraySum wyznacza sumę 32-bitowych elementów
tablicy, której adres podany jest w ESI. Wynik sumy w EAX.
ArraySum PROC
; Wejścia: ESI wskaznik tabeli słów podwójnej długości,
; ECX = liczba elementów tablicy
Mo\na wielokrotnie wywoływać dla
; Wyjście: EAX = suma
ró\nych wartości parametrów
;-----------------------------------------------------
mov eax,0 ; wstępnie suma=0
L1: add eax,[esi] ; dodaj ka\dy wyraz do sumy
add esi,4 ; wska\ następny wyraz
loop L1 ; powtarzaj
ret
ArraySum ENDP
Przekazywanie parametrów do procedury
...............
Rejestry
BLOCK1_ADDR EQU 00AA9988H
Komórki pamięci
BLOCK2_ADDR EQU 00AA9988H
----(globalne)
..............
blok
MOV PARAM, #BLOCK1_ADDR
kod programu
CALL ZEROBYTES
Stos
..............
MOV PARAM, #BLOCK2_ADDR
CALL ZEROBYTES
..................
END
PARAM: DW ?
ZEROBYTES: MOV BX,PARAM
XOR AX, AX
MOV CX, 128
ZEROLOOP: MOV [BX], AX
ADD BX, 2
LOOP ZEROLOOP
RET
Przekazywanie parametrów do procedury
Rejestry
Komórki pamięci
----(globalne)
Parametry umieszczone w bloku
blok
komórek pamięci (jak dla
kod programu
przekazywania w pamięci).
Stos
Wskaznik do bloku przekazany w
rejestrze lub na stosie
Przekazywanie parametrów do procedury
Call disp
Rejestry
Komórki pamięci DB  This parameter is in the code stream. ,0
----(globalne)
.................
blok
Disp PROC NEAR
kod programu
push bp
Stos
mov bp, sp
.............. (m.in. zapisz rejestry na stos)
Mo\liwe zmienne o
mov bx, 2[bp] ;adr powrotu do BX
zmiennej długości
................ (BX zmienia siÄ™, a\ wskazuje
adres za końcem danych)
mov 2[bp], bx ;nowy adres powrotu na stos
.............. (m.in. czytaj rejestry ze stosu)
pop bp
ret
disp endp
Przekazywanie parametrów do procedury
Parametry na stosie czy w rejestrach?
Rejestry
Komórki pamięci
" Parametry w rejestrach wymagajÄ…
----(globalne)
przeznaczenia po rejestrze na
blok
parametr. U\ycie stosu jest
kod programu
wygodniejsze.
Stos
" Przykład dwóch ró\nych sposobów
wywołania procedury DumpMem:
pushad push OFFSET array
mov esi,OFFSET array push LENGTHOF array
mov ecx,LENGTHOF array push TYPE array
mov ebx,TYPE array call DumpMem
call DumpMem
popad
prostszy
Parametry na stosie
Przykład: procedura z
3-ma parametrami:
MyProc(par1,par2,par3);
Wywołanie procedury:
MyProc proc near
MyProc proc near
push par1 pop RtnAdrs32
pop RtnAdrs16
pop Par3
pop Par3
push par2
pop Par2
pop Par2
push par3
pop Par1
pop Par1
call MyProc
push RtnAdrs32
push RtnAdrs16
.
.
.
.
.
.
Odczytanie parametrów w
ret
ret
procedurze
CallProc endp
CallProc endp
ramka
Bezpośredni dostęp do parametrów na stosie
" bezpośredni dostęp do parametrów na stosie z u\yciem przesunięcia w
stosunku do EBP (BP  tryb rzeczywisty).
 np: [ebp + 8]
" EBP  wskaznik bazowy (wskaznik ramki) = adres bazowy ramki na stosie.
" EBP nie zmienia wartości w czasie procedury.
" Na zakończenie procedury przywrócić wejściową wartość EBP.
Przykład:
00000006
[EBP + 12]
00000005
[EBP + 8]
.data
return address
[EBP + 4]
sum DWORD ?
EBP
EBP, ESP
.code
push 6 ; drugi argument
push 5 ; pierwszy argument
AddTwo PROC
call AddTwo ; EAX = suma
push ebp
mov sum,eax ; zapisz sumÄ™
mov ebp,esp
.
. (dostęp do stosu z u\yciem ebp)
.
Ramka na stosie  cd przykładu
00000006
[EBP + 12]
" Odczytanie parametrów ze stosu
00000005
[EBP + 8]
" Przywrócenie wartości esp i ebp
return address
[EBP + 4]
" Usunięcie ramki ze stosu
EBP
EBP, ESP
AddTwo PROC
push ebp
mov ebp,esp ; adres bazowy ramki
mov eax,[ebp + 12] ; drugi argument (6)
add eax,[ebp + 8] ; pierwszy argument (5)
mov esp,ebp
"! instrukcja leave
"!
"!
"!
pop ebp
ret
AddTwo ENDP ; EAX zawiera sumÄ™
inc esp
"! Instrukcja ret 8
"!
"!
"!

.........
{
inc esp
Przekazywanie parametrów do procedury
Ramka z parametrami procedury
Zmienne (lokalne, wewnętrzne) procedury
1) Wykonanie procedury mo\e wymagać u\ycia zmiennych (pomocniczych)
- rejestry procesora
- komórki pamięci
Inne, równoległe wywołanie procedury spowoduje u\ycie tych samych
Zmienna lokalna jest tworzona, u\ywana i likwidowana w
rejestrów i komórek pamięci - konflikt!!!
ramach pojedynczej procedury (jest tymczasowa).
2) Wykonanie procedury wymaga u\ycia rejestrów procesora (wykonywanie
rozkazów)
- te same rejestry mogą być w u\yciu w programie wywołującym
procedurÄ™ - konflikt!!!
" gdzie w pamięci zlokalizować zmienne procedury?
" jak  powielić lokalizacje zmiennych dla kolejnych wywołań procedury?
" jak odwoływać się do zmiennych procedury?
Ramka na stosie  przykład Intel
" Obszar na stosie przeznaczony na: adres powrotu, przekazywane
parametry, zachowane rejestry, zmienne lokalne
" Tworzony w następujących krokach:
 program wywołujący umieszcza
argumenty na stosie i wywołuje
procedurÄ™.
 Wywołana procedura zapisuje EBP
na stos i przepisuje ESP do EBP.
 Je\eli potrzebne sÄ… zmienne
lokalne odpowiednia liczba
całkowita odejmowana jest od ESP,
aby utworzyć miejsce na stosie.
Zmienne wewnętrzne procedury
Ramka ze zmiennymi wewnętrznymi procedury
Przykład: zmienne wewnętrzne procedury -
rekursja
" Proces powstajÄ…cy gdy . . .
 procedura wywołuje samą siebie
 Procedura A wywołuje procedurę B, która wywołuje
procedurÄ™ A
" Rekursja tworzy cykl (patrz ilustracja graficzna)
A
E B
Problem: rekursywne
wywołanie  równocześnie
u\ywane te same parametry
D C
Rekursywne obliczanie sumy
Procedura CalcSum rekursywnie oblicza sumę elementów tablicy
(całkowite). Wejście: ECX = liczba. Wyjście: EAX = suma
Ramka na stosie:
CalcSum PROC
cmp ecx,0 ; sprawdz wart. licznika
12
n
jz L2 ; kończ, gdy zero
ReturnMain
add eax,ecx ; gdy nie, dodaj do sumy
dec ecx ; zmniejsz licznik
ebp0
call CalcSum ; wywołaj rekursywnie
11
n-1
L2: ret
mov esp,ebp
CalcSum ENDP
ReturnFact
pop ebp
ebp1
10
n-2
ret 8
ReturnFact
ebp2
9
n-3
ReturnFact
ebp3
(etc...)
Ramka na stosie  przykład Intel
Instrukcja: ENTER (Make Stack Frame, 80286+)
Instrukcja tworzy ramkę na stosie dla procedury u\ywającej parametrów
własnych zlokalizowanych na stosie.
Liczba bajtów do zarezerwowania.
Składnia:
Immed16=0 "! ENTER = push bp,
mov bp,sp.
ENTER immed16, 0
ENTER immed16, 1
ENTER immed16, immed8
Maksymalny poziom
zagnie\d\enia
Parametry wyników z procedury
" Rejestry
" Stos
" Pamięć (blok)
przed opuszczeniem procedury
return
result
....
zwykle wskaznik do bloku (rejestr
lub stos) + tablica w pamięci
stos
result1
ptr
result2
....


Wyszukiwarka

Podobne podstrony:
PPS 13 W7
PPS 13 W1
PPS 13 W2
PPS 13 W8
EZNiOS Log 13 w4 pojecia slajdy
TM w4 13
ZJ w4 13
UAS 13 zao
er4p2 5 13
Budownictwo Ogolne II zaoczne wyklad 13 ppoz
ch04 (13)
model ekonometryczny zatrudnienie (13 stron)

więcej podobnych podstron