asm_x86 - prefiks 0x66

0

Zauwazylem, ze nasm dodaje instrukcji prefiks rowny 0x66 w przypadku gdy jednym z operandow jest rejestr o bitowosci odmiennej z kodem, czyli reg 16b & kod 32b i na odwrot(nie dotyczy 8b). Pisze wlasnie 16b & 32b dizasembler i nie wiem, czy wszystkie asemblery sie tak zachowuja i czy jest to z gory nalozony wymog ? W manualach Intela, a konkretnie w czesci 2a w dziale Instruction Format->Instruction Prefixes jest tylko krotka wzmianka o tym, ze prefiks 0x66 dotyczy rozmiaru operandow oraz ze jest wykorzystywany przez niektore instrukcje. Co o tym myslicie ?

1

0x66 to przełącznik rozmiaru dla instrukcji pracujących na pełnym słowie maszynowym - w trybie 16bit daje dostęp do pełnych rejestrów 32bit (oczywiście ogólnego przeznaczenia), w 32bit do połówkowych. Bardziej skomplikowanie wygląda to w przypadku MMX/SSE. Zanim zabierzesz się za pisanie dezassemblera faktycznie powinieneś manuale Intela przejrzeć, dokładnie. Wielkiej filozofii w wypadku 0x66 nie ma, ale jego mechanika jest opisana w wielu miejscach. Jeżeli chcesz kiedykolwiek wspierać SIMD to zrób to od początku, żebyś się nie przejechał.

BTW, planujesz wspieranie 0x67? Nawet pod Windows można w pewnych warunkach to cudo spotkać.

0

Dzieki za odpowiedz. O address-size prefix tez na razie nie za wiele wiem, wiec tak jak mowisz zbiore wiecej informacji na temat tych dwoch prefiksow. Ogolnie pisze bootowalny kodzik do zrzucania biosow do pliku na pendriv'ie. Teraz jestem dopiero na poczaku pisania dekodera instrukcji. Technologi mmx i sse sie nie spodziewam i na razie nie mysle o tym, ale przyda mi sie taki prosty dizasembler dlatego juz nastawiam sie na kod 16b i 32b, wiec pewnie pozniej mmx i sse tez bede chcial zaimplementowac :) Korzystam z tej tabelki http://ref.x86asm.net/coder32.html#x0F00, moze komus sie przyda.

0

Korzystaj nie z tabelek tylko przeczytaj wreszcie manuale Intela. W pierwszym tomie, głównie we wczesnych rozdziałach ('Intel® 64 and IA-32 Architectures', 'Basic Execution Environment') masz opisane podstawy, jak adresowanie, operandy i wpływ prefiksów 0x66 i 0x67. W dodatkach do manuala 2 (w tomie 2B) masz kodowanie grup instrukcji, z wyszczególnionymi polami bitowymi zmieniającymi kolejność operandów, ich rozmiar itd. Przejrzyj spisy treści bo mam wrażenie, że nie wiesz skąd podstawowe informacje czerpać.

Nie pisz na ślepo, jak teraz, wywal wszystko co masz i dopiero po przeczytaniu specyfikacji zaprojektuj, potem próbuj klepać. BTW, jak rozumiem piszesz w assemblerze?

0
deus napisał(a)

Korzystaj nie z tabelek tylko przeczytaj wreszcie manuale Intela. W pierwszym tomie, głównie we wczesnych rozdziałach ('Intel® 64 and IA-32 Architectures', 'Basic Execution Environment') masz opisane podstawy, jak adresowanie, operandy i wpływ prefiksów 0x66 i 0x67. W dodatkach do manuala 2 (w tomie 2B) masz kodowanie grup instrukcji, z wyszczególnionymi polami bitowymi zmieniającymi kolejność operandów, ich rozmiar itd. Przejrzyj spisy treści bo mam wrażenie, że nie wiesz skąd podstawowe informacje czerpać.

Nie zagladalem do 1 czesci, nie wiem dlaczego, ale rzeczywiscie jest tam to czego potrzebuje i oczywiscie tabelki z 2a i 2b.

deus napisał(a)

Nie pisz na ślepo, jak teraz, wywal wszystko co masz i dopiero po przeczytaniu specyfikacji zaprojektuj, potem próbuj klepać. BTW, jak rozumiem piszesz w assemblerze?

na razie nic praktycznie nie mam, jesli chodzi o ten dizasembler. Pisze w asm tylko kawalek loadera, a reszte w C.

1 użytkowników online, w tym zalogowanych: 0, gości: 1