| OPCODE ASSEMBLER
Witam… Opisane OPCODE zawiera tłumaczenie wszystkich rozkazów procesora – nie zawiera natomiast opisu cykli omawianych komend, 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. Na stronie znajdziesz 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 opracowania tych list 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 – NOP 90 – XCHG AX,AX 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.
|