различия Intel64 vs AMD64

Тема в разделе "WASM.X64", создана пользователем s_d_f, 20 июл 2010.

  1. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Всем здрасти.

    Написал дизассемблерную библиотеку для 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]

    Собственно главный мой вопрос, насколько можно доверять тому, что написано в интеловских мануалах?
    В амдешных ранее замечал несколько мелких ошибок.

    За ранее спасибо.
     
  2. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    У интела много... не, не так - МНОГО косяков в манулах.
    Что касается 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 байт, сколько их там задействуется - для дизассемблера, имхо, не суть столь важно.
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    s_d_f
    У обоих горе-мануфактеров ДО ХРЕНА ошибок в мануалах.
    Поэтому лучше использовать что-то типа
    http://sandpile.org/
    http://ref.x86asm.net/
     
  4. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Vic3Dexe
    Именно так всё и обстоит, по крайне мере у меня.