adresowanie pamieci




Kurs Assemblera by Skowik


















var napis=new Array("A","D","R","E","S","O","W","A","N","I","E ","P","A","M","I","Ę","C","I");
var kolory=new Array("EEEE00","FFCC00","FFBB00","FFAA00","FF9900",
"FF7700","FF5500","FF3300","FF1100","FF0011",
"FF0033","FF0055","FF0077","FF0099","FF00AA","FF00CC",
"EE00EE","CC00FF","AA00FF","9900FF","7700FF","5500FF","3300FF","1100FF","0022FF","0055FF");
for(i=0; i< 18; i++)
document.write(napis[i].fontcolor(kolory[i]));



Większość operacji w komputerze są to operacje przesyłania z komórek pamięci
oraz przesyłania danych do komórek pamięci i rejestrów Pamięć komputera IBM PC
została podzielona na segmenty zaczynające się co 16B i zajmują FFFFh bajtów
pamięci. Jak łatwo zauważyć segmenty te zachodzą na siebie.Aby dostać się do
odpowiedniego bajtu należy najpierw podać nr segmentu a potem przesunięcie
względem początku tego adresu. Adres taki nazywa się adresem logicznym,który ma
postać segment:offset.Numer segmentu(baza,początek segmentu) powinien
znajdować się zawsze w rejestrze segmentowym.Wartość przesunięcia(offsetu ,
przemieszczenia) nazywamy adresem efektywnym , bazuje on na położeniu komórki
pamięci w segmencie licząc od początku segmentu.W komputerze rozróżniamy
jeszcze adres fizyczny który określa stan 20-bitowego wektora zewnętrznego
lokalizującego 1MB komórek pamięci czyli komórki o adresach od 00000H do
FFFFFh.Inaczej mówiąc adrs fizyczny to numer komórki wysyłany na magistralę
adresową komputera.Jedna komórka pamięci może mieć tylko 1 adres
fizyczny.Przeliczanie adresu logicznego na fizyczny pokażę na
przykładzie:Przykładowy adres logiczny
27BC:A503H27BC00A503-----320C3Adres fizyczny tej komórki
pamięci to 320C3HAnalogicznie pokaże jak z adresu fizycznego zrobić
logiczne:Przykładowy adres fizyczny BC5C2HAdres ten można
przedstawić w międzyinnymi takich adresach
logicznych:6B5C:0002H6000:B5C2H6424:7382H5C5C:F002HPowodami
wprowadzenia adresów segmentowych są:

pierwsze procesory były 16 bitowe i wygodnie było przetwarzać adres w
postaci 2 liczb 16 bitowych
Adresy segmentowe pozwalają na łatwą relokację(przemieszczenie) programu w
pamięci Pamiętaj!!!Do rejestru segmentowego przenosic
mozesz jedynie zawartosc rejestrow ogolnego przeznaczenia!Do pamieci
mozesz przenosic tylko wartosci z polowek rejestrow ogolnego przeznaczenia(lub
ze zmiennych typu byte)!


SPOSOBY PRZESYŁANIA DANYCH

Do kopiowania danych z jednego miejsca, do drugiego służy instrukcja MOV. W
tej instrukcji zawartość drugiego operanda jest kopiowana do pierwszego, dlatego
nie można w miejsce pierwszego wstawić stałej. Nie można również kopiować stałej
do rejestru segmentowego, ani zmiennej do zmienne. W tych wypadkach trzeba użyć
dodatkowych rejestrów, np.: TAK WOLNO

MOV AH,10 ; stała (dziesiętnie) do rejestru 8-bitowego
MOV AX,123H ; stała (szesnastkowo) do rejestru 16-bitowego
MOV AX,BX ; załadowanie wartości rejestru BX do rejestru AX
MOV CX,[BX] ; załadowanie do rejestru CX słowa o adresie zawartym w BX
MOV AX,ES:10H ; Załadowanie do rejestru AX słowa o adresie , którego segment jest w ES a offset jest równy 10H.
MOV AX,SEG ETYK ; adres segmentu do rejestru
MOV AX,OFFSET ETYK ; offset do rejestru
MOV AH,zmienna[SI+8]; załadowanie do rejestru AH bajtu z pod adresu zmienna + zawartość rejestru SI + 8.
MOV DS,BX;
TAK NIE WOLNO
MOV AH,DX ; niezgodność typów
MOV DS,4 ; stała do rejestru segmentowego
MOV Liczba1,Liczba2; zmienna do zmiennej
MOV IP,BX; zmiana rejestru IP





MOVSB, MOVSW, MOVSD
Wszystkie te instrukcje służą do kopiowania łańcuchów pomiędzy dwoma
miejscami pamięci. Pierwsza z nich (MOVSB) operuje na bajtach (przesyła bajt po
bajcie), druga (MOVSW) na słowach (kopiuje po dwa bajty jednocześnie) i trzecia
na słowach podwójnych, czyli przesyła po cztery bajty. Wszystkie te instrukcje
potrzebują tyle samo taktów procesora, dlatego jeśli kopiujemy dużo danych,
używajmy MOVSD.

W parze DS:SI podajemy adres źródłowy, czyli skąd będziemy kopiować dane,
natomiast do ES:DI podajemy adres docelowy. Sama instrukcja (MOVSB...) kopiuje
tylko jeden "pakiet" (bajt, słowo lub słowo podwójne). Kiedy chcemy skopiować
więcej informacji poprzedzamy instrukcję przedrostkiem REP. W rejestrze CX
wówczas podajemy ile danych chcemy skopiować (ile bajtów, słów lub słów
podwójnych).
Jeśli znacznik D jest ustawiony, rejestry SI i DI są zmniejszane, a kiedy
jest wyzerowany, są zwiększane. Zwiększenie / zmniejszenie jest o tyle, ile
kopiujemy danych, czyli albo 1, 2 lub 4.
Oto przykładowy fragment programu kopiujący tekst:
....
NAPIS1 DB "To jest zmienna lancuchowa"
NAPIS2 DB "Zmienna lancuchowa w assemblerze"
....
MOV AX,SEG NAPIS1;przepisywanie adresu
segmentu w którym znajduje się zmienna do AX
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET NAPIS1
MOV DI,OFFSET NAPIS2
MOV CX,29
REP MOVSB
..
 
 

LODSB, LODSW, LODSDŁadują do rejestru
(LODSB - AL, LODSW - AX, LODSD - EAX) dane znajdujące się pod adresem wskazanym
przez DS:(E)SI. Tak samo, jak w MOVS x jeśli znacznik D jest ustawiony nastąpi
zmniejszenie (E)SI, a kiedy wyzerowany, zwiększenie. Zmiana wartości (E)SI jest
o 1, 2 lub 4. Kiedy zamierzamy pobierać więcej danych poprzedzamy instrukcję
przedrostkiem REP i w CX wpisujemy ilość danych do pobrania (bajtów, słów lub
słów podwójnych).

Poniżej znajduje się fragment przykładowego programu, który wyświetla napisy
zakończone kodem 0:
....
NAPIS1 DB "Zmienna lancuchowa",0
....
MOV AX,SEG NAPIS1
MOV DS,AX
MOV SI,OFFSET NAPIS1
ETYK1:
LODSB
CMP AL,0
JE KONIEC
MOV AH,2
MOV DL,AL
INT 21H
JMP ETYK1
KONIEC:
...

STOSB, STOSW, STOSD
Wykonują operacje przeciwną do LODS x. Wysyłają pod adres DS:(E)DI wartość
rejestru AL (STOSB), AX (STOSW) lub EAX (STOSD). Przy każdej operacji, jeśli
znacznik D jest wyzerowany następuje zwiększenie DI, a kiedy ustawiony
zmniejszenie. Jeśli chcemy przesłać więcej danych poprzedzamy instrukcje
przedrostkiem REP i w CX wpisujemy liczbę wysyłanych danych. Stosowane jest
często w połączeniu właśnie ze LODS x np. do szyfrowania danych. Bajt jest
pobierany (LODS x), kodowany (np. XOR) i wysyłany w to samo miejsce (STOS
x).
LAHF i SAHF
Instrukcja LAHF pobiera do rejestru AH młodszy bajt rejestru znaczników. SAHF
jest natomiast czymś odwrotnym, tzn. modyfikuje młodszy bajt tego rejestru
zgodnie z zawartością rejestru AH. Możemy więc dzięki niemu ustawić odpowiednie
znaczniki.
SPOSOBY ADRESOWANIA
PAMIĘCIAdresowanie bezpośrednie
Tryb adresowania bezpośredniego to adresowanie natychmiastowe, argumentem
rozkazu jest adres komórki pamięci. np.MOV
DS:[xxxx],AX;xxxx - offset adresu segmentowego
Przesyłanie bezadresowe
Przesyłanie bezadresowe polega na przesyłaniu danych między dwoma rejestrami.
np.MOV DS,AX;MOV AH,CL Adresowanie
indeksowe
W tym trybie adresowania , offset adresu jest złożony jako suma adresu w
rejestrze indeksowym (SI,DI,BP) i argumentu bezpośredniego. np.MOV DS:Tablica[SI+0],AX;dostęp do 0
elementu tablicyMOV
DS:Tablica[DI+1],AX;Służy do wybierania elementów
tablic jednoelementowych(wektory), w tym przypadku do elementu o numerze
1; Adresowanie bezpośrednie rejestrowe
W adresowaniu bezpośrednim rejestrowym,jeden rejestr(zwykle BX) jest
wskaźnikiem adresu komórki pamięci. np.MOV
DS:[BX],AX;przesyłanie zawartości rejestru AX pod
adres DS:[BX] MOV CX,DS:[BX];Pobranie do rejestru CX zawartości adresu DS:[BX]
Adresowanie pośrednie rejestrowe
Adresowanie pośredniego rejestrowe polega na odczycie offsetu adresu komórki
pamięci z tablicy. Jako numer pola w tablicy wykorzystujemy rejestry
SI,DI,BX,BP. np.MOV DS:Tablica[Si],AX;
Adresowanie pośrednie indeksowe bazowe
Adresowanie pośrednie bazowo-indeksowe to adresowanie łączące adresowanie
indeksowe i rejestrowe. np.MOV
DS:Tablica[SI][BX],AL;BX - rejestr bazowy SI- rejestr
indeksowyMOV
DS:Tablica[SI+12][BX],AX;MOV
DS:tablica[DI][BX+5],AX;











Strona utworzona przez(c)2001-2


Wyszukiwarka

Podobne podstrony:
Sprawdź swoją pamięć A4
uczenie sie i pamiec
Zimowym rankiem w Edo pamięci 47 roninów
pamiec (3)
tryby adresowania2
Lekcja 7 Trening pamieci to nie wszystko Zadbaj o swoja koncentracje

więcej podobnych podstron