| STATYSTYKI |
Od 06.09.2000
|
Optymalizacja: 1024x768, IE5 |
|
| Operacje na rejestrach,adresowanie pamięci, przesyłanie danych |
Proste nadawanie wartości rejestrom
Istnieją dwa sposoby nadania odpowiedniej wartości rejestrom:
Wpisanie natychmiastowe - polega na wpisaniu do konkretnego rejestru bezpośredniej wartości, np.
mov ax,100 ;wpisanie do rejestru ax wartości 100
mov bx,-100 ;wpisanie do rejestru bx wartości -100
W ten sposób nie można wpisywać wartości do rejstrów segmentowych. Poniższy przykład jest nieprawidłowy:
mov ds,-100 ;ŹLE!!!!
Przepisanie wartości z rejestru do drugiego rejestru - polega na skopiowaniu zawartości jednego do drugiego (docelowego),np.
mov dx,abh ;wpisz abh do dx
mov ds,dx ;i przepisz do ds
mov bx,si ;przepisz wartość si do bx
mov dx,bx ; przepisz zawartość bx do dx
Taki sposób nie jest poprawny dla rejestru cs:
mov cs,cx ;ŹLE!!!!
Nie można także przepisywać wartości z jednego rejstru segmentowego do drugiego też segmentowego.Poniższy przykład jest niepoprawny:
mov ds,cs ;ŹLE!!!!
Jeżeli chcemy przepisać wartość z jednego rejestru segmentowego do drugiego rejestru segmentowego, możemy posłużyć się jednym z rejestrów: ax,bx,cx,dx,bp,si,di, np.
mov ax,cs ;przepisanie wartości
mov ds,ax ;posrednio z cs do ds
Innym rozwiązaniem jest takie, że z pomocą przychodzi nam stos, np.:
push cs; połóż(zapisz) zawartość cs na stosie
pop ds ;i odczytaj ją do ds
Zerowanie rejestrów
Oto 4 przykładowe instrukcje pozwalające wpisać zero do rejestru ax:
mov ax,0 ;wpisanie wartości bezpośredniej, instrukcja zajmuje 5 bajtów
xor ax,ax ;wykonanie instrukcji xor na dwu identycznych liczbach bitowych, w wyniku otrzymamy zero, instrukcja zajmuje 2 bajty
sub ax,ax ;odjęcie ax od ax, w wyniku otrzymamy zero, instrukcja zajmuje 2 bajty
and ax,0 ;iloczyn logiczny ax i 0, w wyniku otrzymamy zero, instrukcja zajmuje 3 bajty
Zapisywanie i odczytywanie pamięci
Zapisywać i odczytywać pamięć(przesyłać dane)można na różne sposoby. Należy wybierać w miarę mozliwości rozwiązanie dla nas optymalne, zapewniajace przejrzystość i szybkość działania.
Adresowanie bezpośrednie - polega na wpisaniu wartości pod konkretny adres.
Np.:
mov ds:[xxxxx],ax
Adresowanie bezpośrednie rejestrowe - polega na wykorzystaniu jednego z rejestrów: si,di,bx,bp zamiast stałej wartości przesunięcia.
Np.:
mov ds:[bx],ax
Adresowanie pośrednie rejestrowe - podajemy przesunięcie tablicy. Rejestr (si,di,bx,bp) wykorzystujemy jako rzeczywisty nr pola w tablicy.
Np.:
mov ds:TABLICA[si],ax
Adresowanie pośrednie indeksowe bazowe - wykorzystujemy dwa rejestry jako wskaźnik pól tablicy (np. tablice 2D).
Np.:
mov ds:TABLICA[si][bx],al
Należy tutaj podkreślić, że wszystkie tryby adresacji działają w "obie strony". Nie można jednak ładować wartości do stałej,stałej do stałej, ani wykonywać przypisań pamięć-pamięć.
Pobieranie adresów
Pobranie adresu efektywnego
Adres efektywny jest to przesunięcie zmiennej lub etykiety. Do pobrania(załadowania)do rejestru adresu efektywnego służy instrukcja assemblera lea lub offset. Przewagą lea nad offset jest to ,iż możemy się przy jej pomocy odwołać się do dowolnego pola tablicy, np.:
TABLICA db 2000 dup >
lea bx, TABLICA[10] ;załaduj do rejestru bx przesunięcie 11-tego elementu zmiennej TABLICA
Pobranie 32-bitowego adresu logicznego
32-bitowy adres to segment i offset. Do pobrania tego adresu służą dwie instrukcje: lds (ładuje adres do wskazanego rejestru i rejestru ds) i les (wykorzystuje rejestr segmentowy es).
Parametrami obu instrukcji są: rejestr w którym ma być umieszczone przesunięcie (offset) oraz 32-bitowy adres,np.:
lds si, ADRES32_TABLICY
les di,ADRES32_TABLICY
Zamiana dwu bajtów lub słów
Do zamiany dwóch danych stosujemy instrukcję assemblera xchg. Zamieniać możemy między sobą dwa rejestry (oprócz segmentowych), bądź rejestr z komórką pamięci, np.:
xchg ax,bx ;teraz wartość ax ma wartość bx i vice versa
LICZBA dw 2000
xchg ax,2000 ;teraz ax ma wartość 2000, a LICZBA ma wartość ax
Pobranie bajtu z tablicy do rejestru AL
Służy do tego instrukcja assemblera xlat. Ładuje ona do rejestru al bajt o numerze zawartym w al z tablicy podanej jako parametr (offset tej tablicy musi być załadowany do rejestru bx).
Jest to bardzo wygodna instrukcja do konwersji bajtów. Można ją wykorzystać np. do zamiany cyfry szesnastkowej na liczbę dziesiętną, np.
mov al,liczba_szesnastkowa ;(0-15)
ZNAKI db '0123456789abcdef'
lea bx, ZNAKI ;do bx ładujemy offset ZNAKI
xlat ZNAKI ;al zawiera teraz kod odpowiadajacy zmiennej liczba_szesnastkowa
Instrukcję xlat można wykorzystać do prostego szyfrowania , a także przy wyszukiwaniu cykli w permutacji.
<<
|
|