Wstęp
Kodowanie 64 bitowe
CLI

OPCODE ASSEMBLER

Witam…

Opisane OPCODE nie zawiera tłumaczenie wszystkich rozkazów procesora – to tłumaczenie proszę szukać na innych stronach.
Strona nie zawiera również informacji o cyklach danego rozkazu – tego proszę szukać na innych stronach.
Strona nie zawiera informacji o tym, jakie tryby kodowania występują na komputerach klasy PC – o tym proszę poszukać na innych stronach.

OPCODE może występować na dzień dzisiejszy (rok 2012) w trzech formach: 16, 32 lub 64 bitowych. Moja strona zawiera informację o OPCODE wszystkich możliwych rozkazów, z których korzystają kompilatory, ale z pewnymi wyjątkami:
otóż żaden kompilator nie wygeneruje OPCODE typu:
80 D0 00 00 – ADC AX,0000
ponieważ taki sam zapis daje nam OPCODE:
15 00 00 – ADC AX,0000
Wyżej opisany przypadek można znaleźć w opisie OPCODE, ale są też takie gdzie rozkaz istnieje a nie pojawia się na liście OPCODE:
10 C0 – ADC AL,AL
to samo można zapisać używając OPCODE:
12 C0 – ADC AL,AL
Wyjątków takich jest bardzo dużo, ale ze względu na to, że żaden kompilator ich nie użyje nie zostały tutaj opisane.

Podczas tworzenia tej listy OPCODE zostało zastosowane kolorowanie po to, aby rozróżnić, które bajty odwołują się do adresu w pamięci a które bajty są zwykłymi liczbami, np.:
ADD AX,[0000] –oznacza, iż bajty te są adresem pamięci,
ADD AX,0000 –oznacza, że bajty te są liczbą dodaną do rejestru AX,
JMP 0000 –oznacza bajty, które służą do wskazania adresu skoku, zostało to odznaczone gdyż zapis typu:
                      E9 00 00 – JMP 0000
nie jest poprawnym zapisem gdyż skok ten nie wskazuje skoku do adresu 0000, OPCODE rozkazu JMP obliczany jest na podstawie przesunięcia wstecz lub do przodu.
Następnym fenomenem podczas tworzenia listy OPCODE jest fakt, że niektóre rozkazy pokrywają się ze sobą np.:
90 – XCHG AX,AX
oraz:
90 – NOP
Przeglądając listę poszczególnych rozkazów nie zauważymy takich zdarzeń, ale gdy przejrzymy listę wszystkich rozkazów to spotkamy się z zapisem:
90 – XCHG AX,AX /NOP
Co oznacza, że dany OPCODE posiada dwa lub więcej nazw rozkazów.
Istnieje też jeszcze kwestia działania rozkazów LOOP, LOOPE (LOOPZ), LOOPNE (LOOPNZ) gdyż jak wiadomo rozkaz ten zmniejsza rejestr CX lub ECX i przykładowo, gdy w trybie kodowania 16 bitowego używając kompilatora NASM użyjemy komendy:
loop adres
kompilator wygeneruje OPCODE: E2 XX, dopiero w momencie zapisu
loop adres,ecx
kompilator wygeneruje OPCODE: 67 E2 XX.
Wspominając o kompilatorach warto zwrócić uwagę, że można zapisać komendę:
xchg ax,bx
którą na liście znajdziemy, jako OPCODE: 87 C3, nie mniej kompilator użyje OPCODE: 93 gdyż niema znaczenia dla tego rozkazu, który operand zostanie zapisany, jako pierwszy.
Warto również wiedzieć, że kompilatory ułatwiają nam życie umożliwiając na przykład zapis:
mov eax,[eax*3]
co na liście OPCODE można znaleźć pod zapisem:
mov eax,[eax+eax*2]

W celu ułatwienia odczytu z listy OPCODE wszystkie rozkazy posiadają wskazanie na adres 0 lub też użytą liczbę, 0 jako operand. Wszelkie podane odwołania do liczb czy też adresu zostały zapisane w układzie szesnastkowym.

Jeszcze jedna tylko uwaga: osoby niemające pojęcia o programowaniu proszę nie wpisywać bezmyślnie komendy a następnie kompilować i uruchamiać powstałe programy gdyż grozi to uszkodzeniem komputera.





Polstronki

z tego co wiemy od stycznia 2012 oglądano nas: 234024 razy...

opracował AJOT 2007-2019