Вопрос про максимальную длину машинной команды

Тема в разделе "WASM.BEGINNERS", создана пользователем Scr1pt_, 22 мар 2007.

  1. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Вот сейчас читаю учебник Юрова, второе издание. Появился вопросик.

    При описании архитектуры микропроцессоров семейства P6 (Pentium Pro/II/III), цитирую:

    Я так понимаю, что эта 32-байтная строка - и есть машинная команда.

    Но через несколько глав в описании формата машинных команд IA-32, вкратце написано:

    Никаких комментариев нет.

    Объясните, какая всё-таки максимальная длина машинной команды, и как объяснить это недоразумение. Всё-таки у меня такое предчувствие, что я туплю, а не Юров :)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я точно не знаю, но длинее 13-15 байт я команды не видел ни разу еще.
    Так что скорее всего 15.
    Тем более, что 32 - слишком много.
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Все правильно - максимальная длина команды - 15 байт, включая все префиксы. Если будет больше - #UD.
    А размер выборки декодера, так же как и размер линейки кеша - это уже архитектурные тонкости, которые к тому же могут различаться у разных процессоров. Для софтописателя это даже вобщем-то и знать не обязательно, если не заниматься изощренной оптимизацией.
     
  4. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Это что такое?

    Смотрю формат команд, описанный у Юрова (максимальные значения):

    префикс - 4 байта (команда может иметь до четырёх префиксов одновременно - каждый префикс однобайтовый)
    код операции - 3 байта
    байт modr/m - 1 байт
    байт sib - 1 байт
    смещение в команде - 4 байта
    непосредственный операнд - 4 байта

    Итого - 17 :)

    А разве мы изучаем ассемблер не для изощрённой оптимизации? :)

    И ещё: получаются, что при выборке декодером машинные команды режутся на части! Как же это так может быть?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    #UD - исключение "недействительный код операции"
    код операции максимум 2 байта

    Да ладно? Никогда не думал.
    а не пох? все равно исполняется одна.
     
  6. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Не может этого быть!

    Хотя в первом издании учебника Юрова написано, что код операции как раз может быть только максимум 2 байта :) Не связано ли это с тем, что во втором издании добавляется описание Pentium IV? Не знаю кому верить...

    Никто не сможет точно сказать и разъяснить эту спорную ситуацию?

    Нет. Не пох :) Просто хочется докопаться до истины.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код операции стопудов два байта. + некоторые биты modrm определяют конкретику команды, но опкод все равно 2 байта.
    обычно опкод 1 байт, если первый байт 0F, D8 или D9 опкод имеет еще один байт. Итого два.
    Я хз как они три насчитали =\
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Слово "может" тут следует заменить на "должна". А может инструкция иметь до 14-ти префиксов.
    Просто имеется 4 группы префиксов и если инструкция будет содержать больше одного префикса из одной конкретной группы, процессор проигнорирует все, кроме последнего.

    p.s. максимальная длина инструкции - 15 байт :)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну это уже не считается за префиксы) команда, которая реально будет выполнена процессором, может иметь только 4 префикса =)
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    А чем же это тогда считается? :)

    Код (Text):
    1. db 66h
    2. db 66h
    3. db 66h
    4. mov eax, eax
    Это одна инструкция с тремя префиксами из одной группы. И не смотря на то, что первые два префикса будут проигнорированы, они все равно являются префиксами и входят в длину инструкции :)
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Тогда я могу понаставить так хоть сто префиксов смены размерядности ) так не честно :P
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    ну 100 не поставишь - #UD - а 13 для mov eax, eax вполне можно.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    все равно так не честно :P
    мы считаем получается сколько байт можно впихнуть в команду чтобы не было #UD или чтобы она имела смысл и не имела ничего лишнего?
     
  14. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Префикс - необязательная часть машинной команды. Поэтому никто ничего не "должен".

    Давай всё же считать эффективный код, а не бессмыслицу, игрорируемую процессором.

    1) префикс замены сегмента
    2) префикс повторения
    3) префикс блокировки шины
    4) префикс размера адреса
    5) префикс размера операнда

    Получается всё-таки пять?

    Объясни
     
  15. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Просто фраза
    на мой взгляд также означает, что больше 4-х префиксов одновременно инструкция иметь не может. А это не так.

    Если игнорируемые префиксы входят в длину инструкции, почему же их не надо считать?

    1. lock, rep, repne (это одна группа, если не ошибаюсь)
    2. segment override и branch hints
    3. 66h (OS)
    4. 67h (AS)

    Что тут объяснять? Это предельная длина любой инструкции. Она ведь определяется не тем, сколько байт ты _можешь_ напихать в инструкцию.
     
  16. Scr1pt_

    Scr1pt_ New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2007
    Сообщения:
    34
    Всё равно с четырьмя префиксами и опкодом, равным 2 байтам, получается 16 байт. (см. схему в предыдущих моих постах).
    И никуда этот шестнадцатый байт не засунуть!
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А все дело в том, что если есть байт SIB, то не могут одновременно стоять смещение в команде и непосредственный операнд. И наоборот - если они указаны, байта SIB нету.
    Как ни крути, больше 15 не получится =)
     
  18. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Люди, вы о чем спорите-то?!!
    Берем мануал (в Intel'овском почему-то этот момент проигнорирован, поэтому берем AMD'шный) итак: AMD64 Architecture Programmer’s Manual, Volume 3., читаем:
    и далее картинка. Вы хотите их переубедить? :):):)
    Правда дальше они лукавят:
    На самом деле я еще не слышал ни про какие случаи "unpredictable"
     
  19. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Great
    в x86-64 получится :) но работать не будет :dntknw:
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ustus
    я про то, что эти части команды вместе быть не могут просто потому, что SIB используется при одних битах в MOD R/M, а immediate offset & immediate operand - при других

    Топикстартеру предлагаю чуток полистать Юрова, там подробно написать про байт Scale-Index-Base и непосредственные смещение и операнд и когда они употребляются