Всем привет. Вопрос вроде простой, но внятного обьяснения нигде не нашел. Для чего существуют "сокращенные" варианты опкодов, которые позволяют делать тоже самое, что и обычные, только без байта mod r/m? Например: Код (Text): 00000000: 8B0544332211 mov eax,[011223344] 00000006: A144332211 mov eax,[011223344] Т.е. я не пойму какой в этом смысл. Или они чем-то различаются (например скоростью)? Еще вопрос в том, всегда ли HLL компиляторы генерят "сокращенные" опкоды?
1. Нужно смотреть как с исторической перспективы так и с точки зрения какие возможности даёт сам формат. Сам формат уж если используется в конкретном варианте modrm позволяет в частности закодировать в качестве контейнера любой из регистров общего назначения которые входят в кодировку трёх битного поля в купе с префиксами(66) и переключателем множества полные\неполные регистры (w). Т.е. дешифратор уже декодирует modrm как - то и если поле закодировано по его правилам, есть или нет ещё другая возможность (опкод) он тупо декодирует. А с точки исторической перспективы - важна была очень память, поэтому подход отличался от нынешного универсального (в смысле что сейчас уже мы адресовать можем любыми регистрами, и цепочками пользуемся не так часто), преобладали цепочки, ax\al\ah имели большую нагрузку чем при универсальном подходе. Поэтому для них вводили альтернативные инструкции, они работали побыстрее и были покороче. Можно было кодировать и обычным способом (см. выше про логику дешифратора) но рекомендовалось для ax (акумулятора) использовать альтернативные. Сейчас - не скажу быстрее они или медленне, скороее всего всё едино, ну ты очень общЁ спрашиваешь. Непонятно про какие модели x86, поэтому точно ответить невозможно. По поводу второго вопроса - тоже слишком общЁ, не думаю что существует человек который видел\пробывал\стал специалистом по всем компиляторам. Можно говорить как о тенденции лишь, что, например, ассемблеры для x86 в большинстве (т.е. не все) стараются выбрать более компактный опкод если есть альтернативы в кодировании. А про HLL - там от многого может зависить. В частности и от опций компиляции, процессора для которого оптимизируется и ещё черте чего.
The Svin Спасибо. Я так и думал что дело в совместимости. Вопрос задал потому, что мне надо написать небольшой ассемблер (с поддержкой 15-20 мнемоник и mod r/m) и меня удивила нелогичность кодирования некоторых команд. А по поводу HLL вопрос отпал, потому что я нашел тулзу pe_stat