; przypadku oczywiťcie rŕcznie } IndeksModyf1:= 110 ; [numer rejstru SI} IndeksModyf2:= 011 ; (numer rejestru BX} Niech procedura GenerujInstrukcje...

Pokaż mi serce nie opętane zwodniczymi marzeniami, a pokażę ci człowieka szczęśliwego.

rozkaz DEC, który
w tabeli jest zapisany jako:
01001Rej DEC rejestr Rej.
Jak widać, instrukcja ta posiada parametr Rej, w tym przypadku rejestr 16 - lub 32 -
bitowy. Załóżmy, iż rejestr jest 16-bitowy. Zapisana w asemblerze sekwencja szukająca
operandu dla instrukcji powinna wyglądać mniej więcej tak:
SzukajArgumentu:
MOV AX,7
Call RandomAX ; weč liczbŕ z przedzia│u 000...111


; liczba w AL (bo AH-0)
cmp AL,IndeksModyfl ; czy rejestr zajŕty przez


; pierwsza cz໩ indeksu ?
je SzukajArgumentu
cmp AL, IndeksModyf2 ; czy rejestr zajŕty przez


; druga cz໩ indeksu ?
je SzukajArgumentu
cmp AL, Licznik ; czy rejestr zajŕty przez licznik ?
je SzukajArgumentu
cmp AL,100b ; czy rejestr to SP ?
je SzukajArgumentu


; argument znaleziony i jest w AL


; AL=00000arg - argument na trzech


; m│odszych bitach
or al, 01001000b ; zsumuj logicznie z 5 bitami kodu


; operacj i DEC
stosb ; zapisz ca│a instrukcjŕ DEC arg do bufora
Postępując w podobny sposób można rozszerzyć generator o wszystkie możliwe do
wykorzystania, opisane dalej instrukcje.
W opisie instrukcji przyjęto następujące oznaczenia:
Rej - określa rejestr biorący udział w operacji; rodzaj rejestru (8-, 16-, czy 32-bitowy) jest
określany na podstawie bitu D (jeżeli ten istnieje w instrukcji) oraz w zależności od tego,
czy przed instrukcją wystą-pił przedrostek 66. Jeżeli D=0, to rejestr jest 8-bitowy; jeżeli
przedrostek nie wystąpił i D=0, to 16-bitowy, w innym wypadku jest on 32-bitowy.
Wartości przypisane poszczególnym rejestrom są następujące:
Rej
000
001
010
011
100
101
110
111
8-bitowe
AL.
CL
DL
BL
AH
CH
DH
BH
16-bitowe AX
CX
DX
BX
SP
BP
SI
DI
32-bitowe EAX
ECX
EDX
EBX
ESP
EBP
ESI
EDI

Mem - określa adres w pamięci, na którym wykonywana jest operacja; sposób
adresowania zależy od obecności przedrostka 67 oraz od pola struktury MmRejMem,
będącej drugim bajtem instrukcji. W zależności od zawartości pola Mm zmienia się
wielkość offsetu dodawanego do odpowiednich rejestrów (08 - ofset 8 bitowy, 016 - 16
bitowy, 032 - 32 bitowy).
Jeżeli nie wystąpił przedrostek 67, to używany jest następujący sposób adresowania (16
- bitowy, Seg oznacza domyślny segment adresujący dane, jeżeli przed instrukcja nie
wystąpił przedrostek innego segmentu):
Mem
Seg/Mm 00
01
10
11 - operacja
na rejestrze o
numerze Mam,
a nie na
pamieci
000
DS
[BX+SI]
[BX+SI+O8]
[BX+SI+O16]

001
DS
[BX+DI]
[BX+DI+O8]
[BX+DI+O16]

010
SS
[BP+SI]
[BP+SI+O8]
[BP+SI+O16]

011
SS
[BP+DI]
[BP+DI+O8]
[BP+DI+O16]

100
DS
[SI]
[SI+O8]
[SI+O16]

101
DS
[DI]
[DI+O8]
[DI+O16]

110
DS/SS
DS:[O16] SS:[BP+O8]
SS:[BP+O16]

111
DS
[BX]
[BX+O8]
[BX+O16]


Jeżeli wystąpił przedrostek 67, to używany jest następujący sposób adresowania
(32-bitowy):
Mem
Seg/Mm 00
01
10
11-operacja na
rejestrze o
numerze Mem,
a nie na
pamięci
000
DS
[EAX]
[EAX+O8}
[EAX+O32]

001
DS
[ECX]
[ECX+O8]
[ECX+O32]

010
DS
[EDX]
[EDX+O8]
[EDX+O32]

011
DS
[EBX]
[EBX+O8]
[EBX+O32]

100

[SIB]
[SIB+O8]
[SIB+O32]

101
DS/SS
DS:[O32]
SS:[EBP+O8]
SS:[EBP+O32]
110
DS
[ESI]
[ESI+O8]
[ESI+O32]

111
DS
[EDI]
[EDI+O8]
[EDI+O32]


Użyty w tabeli skrót SIB (ang. Scale Index Base) oznacza rozszerzony sposób
adresowania, w którym ułatwiony jest m.in. dostęp do tablic. Bajt opisujący pola SIB
występuje zaraz po bajcie MmRejMem. Sposób obliczania przez procesor adresu
zawartego w SIB jest następujący:
Adres SIB:=Baza+Indeks*(2^N), gdzie
> baza opisywana jest przez bity 7-5 bajtu SIB;
> indeks opisywany jest przez bity 4-2 bajtu SIB;
> liczba N opisywana przez bity 1-0 bajtu SIB (tak więc jedyna możliwość to mnożenie
indeksu przez 2^00=1, 2^01=2, 2^10=4 2^11=8).
Poniższa tabela zawiera wartości, które może przyjmować Baza.
Baza
Seg/Mm
00
01,10,11
000
DS
EAX
EAX
001
DS
ECX
ECX
010
DS
EBX
EBX
011
DS
EDX
EDX
100
SS
ESP
ESP
101
DS/SS
DS:O32
SS:EBP
110
DS
ESI
Copyright (c) 2009 Pokaż mi serce nie opętane zwodniczymi marzeniami, a pokażę ci człowieka szczęśliwego. | Powered by Wordpress. Fresh News Theme by WooThemes - Premium Wordpress Themes.