Всем здрасти. Написал дизассемблерную библиотеку для AMD64, собираюсь добавить поддержку наборов инструкций спецефичных для Intel64, но в ноутбуке процессор Athlon и соответвенно нет возможности по тестировать в отладчике эти инструкции. Но и это ещё не самое сложное. Также существует большая путаница в описании общих наборов инструкций. Например в мануале Intel64 говорится, что существует дальний косвенный вызов REX.W call [16-бит сегмент:64-бита аддресс], а в AMD64 ограничились 48-битными дальними указателями. И еще большее отличие c xlat`oм. AMD64 XLAT mem8 D7 Set AL to the contents of DS:[rBX + unsigned AL]. XLATB D7 Set AL to the contents of DS:[rBX + unsigned AL]. Intel64 D7 XLAT m8 A Valid Valid Set AL to memory byte DS:[(E)BX + unsigned AL]. D7 XLATB A Valid Valid Set AL to memory byte DS:[(E)BX + unsigned AL]. REX.W + D7 XLATB A Valid N.E. Set AL to memory byte [RBX + unsigned AL]. Особенно сильно меня смущает последний REX.W + D7 XLATB. Получается для Intel64 D7 xlat byte ptr [ebx] 48D7 xlat byte ptr [rbx] Для AMD64 67D7 xlat byte ptr [ebx] D7 xlat byte ptr [rbx] Собственно главный мой вопрос, насколько можно доверять тому, что написано в интеловских мануалах? В амдешных ранее замечал несколько мелких ошибок. За ранее спасибо.
У интела много... не, не так - МНОГО косяков в манулах. Что касается xlatb - читаем предисловие ко всем командам - REX.W влияет на размер операнда, поэтому на ebx/rbx (размер адреса) он не может влиять. Вывод - верна версия от АМД. В плане вызовов - там сам черт ногу сломит. Более всего интересны call near relative, которые у интела жестко прибиты как 64 бита, а у АМД вроде могут быть 64 бита и 16 бит (66h). В любом случае для call far [] могут быть 3 варианта: 1. 66 FF /3 = call far dword [] ;m16:16 2. FF /3 = call far pword [] ;m16:32 3. 48 FF /3 = call far tbyte [] ;m16:64 (48) В 3 случае по-любому из памяти будет выбрано 8 байт, сколько их там задействуется - для дизассемблера, имхо, не суть столь важно.
s_d_f У обоих горе-мануфактеров ДО ХРЕНА ошибок в мануалах. Поэтому лучше использовать что-то типа http://sandpile.org/ http://ref.x86asm.net/