Чтобы добавить к тому, что до сих пор сказали Джерри и Стивен.
Прежде всего, вы должны быть консервативными с вашими кодами операций / кодировкой инструкций. Вход в него начался с топора, ах, и др. Есть ли добавленная стоимость при переходе к eax для обеспечения доступа на основе байтов к этому верхнему регистру (помимо поворотов или сдвигов, которые уже существуют, чтобы обеспечить это)? Не совсем. Если вы выполняете байтовые операции, почему вы используете 32-битный регистр и почему используете старшие байты? Возможно, оптимизируйте код по-другому, используя преимущества того, что доступно, или допустив то, что доступно, и используя преимущества в других областях.
Я думаю, что есть причина, по которой в большинстве мировых наборов инструкций нет этих четырех имен для одного и того же регистрового элемента. И я не думаю, что дело в патентах. В свое время это была, наверное, крутая функция или дизайн. Вероятно, у него есть корни в переходе людей от 8-битных процессоров к 8/16-битной штуке. В любом случае, я думаю, что al, ah, ax, eax - плохой дизайн, и все извлекли из этого урок. Как упоминал Стивен, у вас есть проблемы с оборудованием, если вы строго реализуете это в прямой логике, это беспорядок, крысиное гнездо мультиплексоров, чтобы все подключить (плохо для скорости и плохо для мощности), тогда вы попадаете в сроки кошмар, который творил Стивен. Но для этого набора инструкций существует история микрокодирования, поэтому вы, по сути, эмулируете эти инструкции с каким-то другим процессором, и таким же образом это усугубляет этот кошмар. Было бы разумно переопределить ax, сделав его 32-битным, и избавиться от ah и al. Мудро с точки зрения дизайна, но неразумно с точки зрения переносимости (хорошо для разработки, плохо для маркетинга, продаж и т. Д.). Я думаю, что причина, по которой этот утомленный старый набор инструкций не ограничивается учебниками по истории и музеями, (среди нескольких других причин) заключается в обратной совместимости.
Я настоятельно рекомендую изучить ряд других наборов инструкций, как новых, так и старых. msp430, ARM, thumb, mips, 6502, z80, PIC (старый, не являющийся mips) и т. д. Просто чтобы назвать несколько. ИМО, очень поучительно видеть различия и сходства между наборами инструкций. И в зависимости от того, насколько глубоко вы углубитесь в понимание (переменная длина слова или фиксированная длина и т. Д.), Понимание того, какие варианты мы доступны для Intel при переходе с 16 на 32 бит, а в последнее время с 32 бит на 64 бит, при попытке сохранить долю рынка .
Я думаю, что решение, которое они выбрали в то время, было правильным: вставить ранее неопределенный код операции перед тем, что обычно декодируется как 16-битный код операции, превращая его в 32-битный код операции. Или, иногда, нет, если нет следующих немедленных значений (требующих знания того, сколько читать). Казалось, что это соответствовало инструкциям, установленным в то время. Итак, это возвращение к ответу Джерри, причина заключается в сочетании конструкции 8/16-битной инструкции, задающей историю, и причин для ее расширения. Конечно, они могли бы с такой же легкостью использовать аналогичное кодирование для обеспечения доступа к старшим 16 битам топором, ах, al, и они могли бы так же легко умножить четыре базовых регистра A, B, C, D на 8 или 16. или 32 регистра общего назначения (A, B, C, D, E, F, G, H, ...), оставаясь при этом обратно совместимыми.
person
old_timer
schedule
16.03.2011
movzx
из al / ah, если вы пишете C, который загружаетuint32_t
из массива, а затем использует сдвиги / AND для извлечения каждого байта для использования в качестве индекса массива. Вместо трех сдвигов на 8 бит вы получите один сдвиг на 16 бит. (Или сuint64_t
в 64-битном режиме, несколько сдвигов на 16 бит.) - person Peter Cordes   schedule 29.06.2016