01Wpr5 Asm2id 3328 ppt

background image

Język asemblera

Język asemblera

Copyright, 2001 © Jerzy R. Nawrocki

Jerzy.Nawrocki@put.poznan.pl

http://www.cs.put.poznan.pl/~nawrocki/ic
s/

Wprowadzenie do
informatyki

Wykład 5

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program

DEBUG
Arytmetyka

heksadecymalna

Liczby ujemne
Koncepcja von Neumanna
Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Rejestry

var

ax, bx, cx, dx, si, di:
integer;

var

ax, bx, cx, dx, si, di:
integer;

AX

3

BX

0

CX

7

DX

1

SI

8

DI

2

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Instrukcja

p := p + z

p := p + z

ADD

p

,

z

ax := ax + bx +

2

add ax, bx

add ax, 2

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Struktura najprostszego

programu

code segment
assume cs: code
start:

instrukcje

code ends
end start

Dlaczeg

o tak?

Czasami

najwięcej rzucają

cienia właśnie

wyjaśnienia.

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Przykład programu

prog segment
assume cs: prog
start:

add ax, bx

add ax, cx
int 3

prog ends
end start

ax := ax + bx + cx

Koniec

pracy

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Kompilacja – pierwszy krok

Zapisz

program w

pliku

prog.asm

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Uproszczony schemat

kompilacji

MAS
M

LINK

prog.o
bj

prog.e
xe

prog.as
m

prog.l
st

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Kompilacja - MASM

Poleceni

e

Błęd

y

Ostrzeże

nia

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Kompilacja – Listing

kompilacji

Numer

wiersza

Tekst

program

u

Kod

przekład

u

Adres

względ

ny

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Kompilacja - LINK

Nieistotne

ostrzeżenie

Poleceni

e

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Prosty program

Prosty program

Uruchomienie - DEBUG

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program

DEBUG

Arytmetyka

heksadecymalna

Liczby ujemne
Koncepcja von Neumanna
Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

DEBUG

DEBUG

Najważniejsze komendy

R

rejestr

(Register)

G

(Go)

Q

(Quit)

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

DEBUG - przykład sesji

DEBUG - przykład sesji

Wynik

-

rax

AX

0000

1

-

rbx

BX

0000

2

-

rcx

CX

0005

3

:

:

:

-

g

AX=0006 BX=0002 CX=0003 DX=0000 SP=0000

DS=198C ES=198C SS=199C CS=199C IP=0004

199C:0004 CC INT 3

-

q

Nast. instrukcja

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

DEBUG - przykład sesji

DEBUG - przykład sesji

D

E

B

U

G

MS
DOS

MS
DOS

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Częściowe podsumowanie

Częściowe podsumowanie

Umiemy już:
napisać program,
skompilować go,
uruchomić.

Hura!

Ale to

proste!

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

DEBUG - inna sesja

DEBUG - inna sesja

6 + 6 + 6 = 18 czy 12?

Dziwn

e!

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program
DEBUG

Arytmetyka

heksadecymalna

Liczby ujemne
Koncepcja von Neumanna
Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Cyfry

0

do

9

A 10

B 11

C 12

D 13

E 14

F 15

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

System dziesiętny

123

10

= 100 + 20
+ 3

3*

10

0

2*

10

1

+

1*

10

2

+

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

System szesnastkowy

123

16

= 256 + 32 + 3
= 291

10

3*

16

0

2*

16

1

+

1*

16

2

+

12

16

= 1*

16

1

+ 2*

16

0

= 16 + 2

= 18

10

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

12

16

= 18

10

Aha!

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą pośrednią

28F

16

+

37F

16

28F

16

+

37F

16

+

+

1550

10

11

2*

256

+ 8*

16

+ 15

3*

256

+ 7*

16

+ 15

655

10

895

10

6*

256

+ 0*

16

+ 14

60E

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

28F

+

37F

28F

+

37F

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

28

F

+ 37

F

28

F

+ 37

F

F

16

+

F

16

=

15

10

+ 15

10

= 30

10

30

10

:

16

10

=

1 reszta 14

10

=

1 reszta E

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

1

28

F

+ 37

F

E

1

28

F

+ 37

F

E

F

16

+

F

16

=

15

10

+ 15

10

= 30

10

30

10

:

16

10

=

1 reszta 14

10

=

1 reszta E

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

1
2

8

F

+ 3

7

F

E

1

2

8

F

+ 3

7

F

E

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

1
2

8

F

+ 3

7

F

E

1

2

8

F

+ 3

7

F

E

1

+

8

16

+

7

16

=

= 16

10

16

10

:

16

10

=

1 reszta 0

10

=

1 reszta 0

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

11
2

8

F

+ 3

7

F

0E

11

2

8

F

+ 3

7

F

0E

1

+

8

16

+

7

16

=

= 16

10

16

10

:

16

10

=

1 reszta 0

10

=

1 reszta 0

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

11
2

8

F

+ 3

7

F

0E

11

2

8

F

+ 3

7

F

0E

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

11

2

8F

+

3

7F

0E

11

2

8F

+

3

7F

0E

1

+

2

16

+

3

16

=

= 6

10

6

10

:

16

10

=

0 reszta 6

10

=

0 reszta 6

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

011

2

8F

+

3

7F

60E

011

2

8F

+

3

7F

60E

1

+

2

16

+

3

16

=

= 6

10

6

10

:

16

10

=

0 reszta 6

10

=

0 reszta 6

16

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

Dodawanie metodą

bezpośrednią

011

2

8F

+

3

7F

60E

011

2

8F

+

3

7F

60E

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

ax:= ax + bx + cx

011

2

8F

+

3

7F

60E

011

2

8F

+

3

7F

60E

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

ax:= ax + bx + cx

Nie

można

proście

j?

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := bx + cx

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

c := z

c := z

MOV

c

,

z

mov

e

prog segment
assume cs: prog
start:

mov ax, bx

add ax, cx
int 3

prog ends
end start

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

ax:= bx + cx

011

2

8F

+

3

7F

60E

011

2

8F

+

3

7F

60E

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := bx - cx

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

c := c - z

c := c - z

SUB

c

,

z

subtra

ct

prog segment
assume cs: prog
start:

mov ax, bx

sub ax, cx
int 3

prog ends
end start

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := bx - cx

Arytmetyka heksadecymalna

Arytmetyka heksadecymalna

prog segment
assume cs: prog
start:

sub bx, cx

mov ax, bx
int 3

prog ends
end start

A czy

można

tak?

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program
DEBUG
Arytmetyka

heksadecymalna

Liczby ujemne

Koncepcja von Neumanna
Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Liczby ujemne

Liczby ujemne

Uzupełnienie do 2

b jeśli b
0
2

n

- |b| jeśli b

< 0

kod (b)
=

n

bitów daje przedział:

[-2

n

-1

, 2

n

-1

- 1]

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Liczby ujemne

Liczby ujemne

4 bity

15

kod(b
)

b

7

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Liczby ujemne

Liczby ujemne

3 bity

3

3

3

2

2

2

1

1

1

0

0

0

-1

7

7

-2

6

6

-3

5

5

-4

4

4

Liczba

Kod

2

3

- |

b|

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Liczby ujemne

Liczby ujemne

16 bitów

32767

7FFF

7FFF

...

...

...

1

1

1

0

0

0

-1

FFFF

FFFF

...

...

...

-32767

8001

8001

-32768

8000

8000

1111

FFFF

FFFF

+

2

2

0001

1

111

FFFF

FFFF

+

2

2

0001

-1
+ 2
1

-1
+ 2
1

=

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

1111

FFFF

FFFF

+

2

2

0001

1

111

FFFF

FFFF

+

2

2

0001

Liczby ujemne

Liczby ujemne

ax:= bx + cx

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Zmiana znaku

Liczby ujemne

Liczby ujemne

1. Zaneguj bity (0 1, 1 0)
2. Dodaj 1

0

F
1

E
2

D
3

C
4

B
5

A
6

9
7

8

FFFF =

-1

0000

0001

5 -5
-7
7

F -
cyfra

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Zmiana znaku

Liczby ujemne

Liczby ujemne

1. Zaneguj bity (0 1, 1 0)
2. Dodaj 1

0

F
1

E
2

D
3

C
4

B
5

A
6

9
7

8

0002

=
-2

FFFD

FFFE

F -
cyfra

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := - ax

Liczby ujemne

Liczby ujemne

c := -c

c := -c

NEG

c

negati

on

prog segment
assume cs: prog
start:

neg ax

int 3

prog ends
end start

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := - ax

Liczby ujemne

Liczby ujemne

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program
DEBUG
Arytmetyka heksadecymalna
Liczby ujemne

Koncepcja von Neumanna

Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

Specjalizowane kalkulatory (obliczanie
toru pocisku) a uniwersalne komputery

Jak zrealizować uniwersalność:

program jako łącznice kablowe
program jako dane przechowywane w
pamięci (koncepcja von Neumanna)

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

Dwie fazy:

1.

Ściąganie

rozkazu i jego

dekodowanie

2.

Wykonanie

rozkazu

Specjalny rejestr (

licznik rozkazów

)

pokazuje następny rozkaz do
wykonania.

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

Kod Rozkaz Przykład

1

MovRegCon(

R

, C)

1

1

1

R1

1

2

MovRegReg(

Rd

, Rs)

2

2

1

R2

R1

3

AddRegReg(

Rd

, Rs)

3

1

2

R1

R1

+R2

4

SubRegReg(

Rd

, Rs)

4

2

1

R2

R2

–R1

5

NegReg(

R

)

5

2 R2

-

R2

6

Int(C)

6

3

Przykładowe kody rozkazów

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

ax := bx - cx

Koncepcja von Neumanna

Koncepcja von Neumanna

prog segment
assume cs: prog
start:

mov ax, bx

sub ax, cx
int 3

prog ends
end start

2 0
1

4 0
2

6 3

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

cx

ax

ax

bx

bx

5

5

0

0

cx

cx

3

3

ax := bx - cx

10

10

Licznik

Licznik

rozkazów

rozkazów

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

10

10

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

1. Ściągnięcie
rozkazu z
pamięci

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

13

13

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

1a. Ustawienie
licznika na
następny rozkaz

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

13

13

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

5

5

2. Wykonanie
rozkazu

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

13

13

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

5

5

1. Ściągnięcie
rozkazu z
pamięci

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

16

16

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

5

5

1a. Ustawienie
licznika na
następny rozkaz

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Koncepcja von Neumanna

Koncepcja von Neumanna

2

2

0

0

1

1

MovRegReg

ax

bx

10

4

4

0

0

2

2

13

6

6

SubRegReg

3

3

16

Int

18

ax

ax

bx

bx

16

16

Licznik

Licznik

rozkazów

rozkazów

5

5

0

0

ax

cx

cx

cx

3

3

ax := bx - cx

5

5

2

2

2. Wykonanie
rozkazu

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Plan wykładu

Plan wykładu

Prosty program
DEBUG
Arytmetyka

heksadecymalna

Liczby ujemne
Koncepcja von Neumanna

Rozkazy skoku

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skoki warunkowe

Rozkazy skoku

Rozkazy skoku

if c = z
then

begin

. . .

end;

if c = z
then

begin

. . .

end;

CMP

c

,

z

JNE

e

. . .

e

:

c

o

mp

are

j

ump if

n

ot

e

qual

SF ZF

. . .

. . .

PS
W

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skoki warunkowe

Rozkazy skoku

Rozkazy skoku

JE

e

j

ump if

e

qual

if c <> z
then ...

if c <> z
then ...

JNL

e

j

ump if

n

ot

l

ess

if c < z
then ...

if c < z
then ...

JG

e

j

ump if

g

reater

if c <= z
then ...

if c <= z
then ...

JNG

e

j

ump if

n

ot

g

reater

if c > z
then ...

if c > z
then ...

JL

e

j

ump if

l

ess

if c >= z
then ...

if c >= z
then ...

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skoki warunkowe - przykład

Rozkazy skoku

Rozkazy skoku

ax := min {bx,

cx}

mov ax, bx
cmp ax, cx
jle ok
mov ax, cx
ok: int 3

ax:= bx;
if ax > cx
then
ax:= cx

ax:= bx;
if ax > cx
then
ax:= cx

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skok bezwarunkowy

Rozkazy skoku

Rozkazy skoku

while c = z
do

begin

. . .

end;

while c = z
do

begin

. . .

end;

pocz

:

CMP

c

,

z

JNE

kon

. . .

JMP

pocz

kon

:

c = z

. . .

Tak

Nie

j

u

m

p

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skok bezwarunkowy

Rozkazy skoku

Rozkazy skoku

if c = z

then

ins1

else

ins2

if c = z

then

ins1

else

ins2

CMP c,
z

JNE
els

ins1

JMP
kon

els:

ins2

kon:

c = z

ins1

Tak

Nie

ins2

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skok bezwarunkowy -

przykład

Rozkazy skoku

Rozkazy skoku

ax := nwd {ax,

bx}while ax <> bx do

begin
if ax > bx then
ax:= ax - bx
else
bx:= bx - ax
end;

while ax <> bx do
begin
if ax > bx then
ax:= ax - bx
else
bx:= bx - ax
end;

ax

bx

ax >

bx

ax:=ax-
bx

bx:=bx-
ax

Tak

Tak

Nie

Nie

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Skok bezwarunkowy -

przykład

Rozkazy skoku

Rozkazy skoku

ax := nwd {ax,

bx}

whi: cmp ax, bx
je kon
jle els
sub ax, bx
jmp od
els: sub bx, ax
od: jmp whi
kon: int 3

while ax <> bx do
begin
if ax > bx then
ax:= ax - bx
else
bx:= bx - ax
end;

while ax <> bx do
begin
if ax > bx then
ax:= ax - bx
else
bx:= bx - ax
end;

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Podsumowanie

Podsumowanie

Rejestr - rodzaj zmiennej
DEBUG - interfejs z

użytkownikiem

Reprezentacja

heksadecymalna

Pisanie programów w

języku asemblera jest
trudniejsze niż w języku
wysokiego poziomu

Wreszcie
!

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Literatura

Literatura

J.Nawrocki, Programowanie

komputerów IBM PC w języku
asemblera metodą
systematyczną, WPP, 1991.

background image


J.Nawrocki, Wprowadzenie ..,
Wykład 5

Ocena wykładu

Ocena wykładu

1. Wrażenie ogólne? (1 -

6)

2. Zbyt wolno czy zbyt

szybko?

3. Czy dowiedziałeś się

czegoś ważnego?

4. Co poprawić i jak?


Document Outline


Wyszukiwarka

Podobne podstrony:
01Wpr5 Asmid 3327 ppt
03 Sejsmika04 plytkieid 4624 ppt
Choroby układu nerwowego ppt
10 Metody otrzymywania zwierzat transgenicznychid 10950 ppt
10 dźwigniaid 10541 ppt
03 Odświeżanie pamięci DRAMid 4244 ppt
Prelekcja2 ppt
2008 XIIbid 26568 ppt
WYC4 PPT
rysunek rodziny ppt
1 GEN PSYCH MS 2014id 9257 ppt

więcej podobnych podstron