Rafał
Nowicjusz
Dołączył: 02 Gru 2007
Posty: 13
Przeczytał: 0 tematów
Skąd: Goświnowice
|
Wysłany: Sob 8:15, 20 Lut 2010 Temat postu: adresacja asembler |
|
|
Tryby adresowania
Tryb adresowania wyznacza sposób w jaki dostajemy się do adresu, czyli położenia naszego operandu (operandu czyli argumentu danego rozkazu). Na początek może Ciebie przerazić ilość tych trybów jednak zauważ, że wszystkie są dość do siebie podobne. Dodatkowo niektóre tryby są jakby modyfikacją poprzednich, jak na przykład trzy ostatnie. Czasem wystarczy tylko zmienić zapis operandu i mamy zupełnie inny tryb adresowania. Pisząc program nieraz będziesz używał z któregoś z sposobów określenia położenia operandu choć może sam nawet nie będziesz o tym wiedział, ani tym bardziej jak on się nazywa. Co więcej spora część z tych trybów jest całkiem intuicyjna, lecz czasem trzeba uważać na małe "kruczki".
Adresowanie rejestrowe
(wartość operandu zawarta jest w jakimś rejestrze ogólnego przeznaczenia)
mov ax, bx
Adresowanie bezpośrednie (nazywane także natychmiastowym)
(wartość danego operandu jest już podana)
mov ax, 1
lub
mov ax, 010Ch
Adresowanie pośrednie
(wartość dla danego rozkazu znajduje się w komórce o adresie podanym w operandzie)
mov ax, [102h]; Adres końcowy to DS:0 + 102h
Wartość w tych dwóch nawiasach jest odpowiednikiem "to co znajduje się w komórce o adresie 102h"). Jeżeli programujesz lub programowałeś w języku C bądź C++ to ten sposób adresowania jest podobny do operatora wyłuskania. Oto odpowiednik w C(++):
int ax = *0x102;
Adresowanie pośrednie z przemieszczeniem
(używa się operacji arytmetycznych na danym adresie)
byte_tbl db 12,15,16,22,..... ;tablica bajtów
mov al,byte_tbl+2
mov al,byte_tbl[2] ;to samo lecz w innej formie
Co w C/C++ byłoby niemal takie same. Aby dostać się do elementu położonego o dwa bajty od początku należy dodać 2 lub odwołać się do elementu trzeciego (licząc od zera) jak w wspomnianych językach wysokiego poziomu.
Adresowanie rejestrowe, pośrednie
(w danym rejestrze zawarty jest adres komórki z pożądaną wartością)
mov ax,[di]
Nie myl tego z adresowaniem rejestrowym. Zobacz przykład:
mov dx,si ;skopiuj do DX wartość rejestru SI
mov dx,[si] ;skopiuj do rejestru DX coś co jest w komórce pamięci o adresie zapisanym w SI. Jeśli SI
;ma np. wartość 0D7h to do rejestru DX zostanie skopiowane to, co znajduje się właśnie w tej komórce
Rejestry używane do tego typu adresowania to: BX, BP, SI, DI
Adresowanie bazowe z przemieszczeniem
mov ax, arr[bx]; gdzie BX jest przemieszczeniem wewnątrz tablicy ARR
Ten tryb adresowania jest analogiczny do docierania do danego elementu tablicy w C. Porównaj sobie powyższy kod z poniższym:
int AX,BX; //nazwa zmiennej taka aby kod był jak najbardziej podobny do asemblerowego
int arr[4]= {6,5,34,22}; //zakładam oczywiście że BX ma wartość od 0 do 3
AX = arr[BX];
Adresowanie bazowo-indeksowe
mov ax,[bx + di]
Przykładowo, jeśli mówimy o tablicy, BX jest początkiem tablicy (zawiera adres jej pierwszego elementu), zaś DI jest indeksem w danej tablicy.
Adresowanie bazowo-indeksowe z przemieszczeniem
mov ax,[bx + di + 10]
|
|