M E N U
Strona główna Assembler -kurs
Assembler -teksty
AntiCracking
API
Opisy narzędzi
Zabezpieczenia CD/DVD
Budowa plików
Sources
Linki
Kontakt

STATYSTYKI

stat4u
PRV.PL - Twoje miejsce w sieci.
Od 06.09.2000
Optymalizacja:
1024x768, IE5
  • Assembler - kurs

  • 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.

    <<

    ©Copyright by zoomek 2001
    Wszelkie prawa zastrzeżone!