Препроцессор команд ХММ-расширения
Отыщи всему начало, и ты многое поймешь.
Козьма Прутков
Задачу адаптации транслятора TASM к новым командам микропроцессора, и в частности к ХММ-командам, можно решить двумя способами.
- Можно разработать включаемый файл, в котором для каждой ХММ-команды реализовать макрокоманду, моделирующую на базе существующих к манд нужную ХММ-команду. Кроме этого, фирма Irintel, зная об инерционности процесса разработки новых версий трансляторов ассемблера, вместо подмножеством новых команд разрабатывает соответствующий включаемый файл для их поддержки в ассемблерных программах. Для подмножества ХММ-команд такой файл называется iaxmm.inac. Он ориентирован на транслятор MASM (фирмы Microsoft) и не пригоден (требует доработки") для TASM. Однако при доработке TASM необходимую иметь в виду вопрос об авторских правах. Некоторые проблемы использования файла iaxmm.inc совместно с TASM обсуждены ниже.
- Можно разработать программу-препроцессор, на вход которой подавать исходный файл с программой на ассемблере, содержащей новые команды процессора, а на выходе получать текст, адаптированный для компиляции старым транслятором ассемблера. Этот путь имеет то преимущество, что теперь при появлении новых команд можно, не внося больших корректив в технологию разработки программ, всего лишь определенным образом модифицировать файл-препроцессор, дополнив его i возможностями по обработке новых команд процессора. Более того, дополнив препроцессор средствами распознавания микропроцессора (Intel или AMD), можно разрабатывать программы с использованием расширения 31DNo\v!.
Первый способ был реализован в уроке "ММХ-технология микропроцессоров Intel" учебника для ММХ-команд. Там же были приведены примеры включаемых файлов, полностью пригодных для использования как 16-, так и 32-разрядными приложениями на ассемблере. Поэтому основное внимание мы уделим второму способу организации поддержки ХММ-команд – препроцессорному. Но вначале рассмотрим структуру и содержание включаеемого файла iaxmm.inc. Текст этого файла можно загрузить с официального сайта компании Intel (http://www.intel.com).
Поддержка ХММ-команд в файле iaxmm.inc
С точки зрения структуры включаемый файл iaxmm.inc представляет собой набор макрокоманд двух типов – основных и вспомогательных. Названия основных макрокоманд полностью совпадают с названиями ХММ-команд, и эти макрокоманды обеспечивают моделирование определенных XlMM-команд. Вспомогательные макрокоманды расположены в начале файла и предназначены для обеспечения работы основных макрокоманд. В частности, эти макрокоманды устанавливают тип операндов, указанных при обращении к (основной макрокоманде, причем делают это исходя из режима функционирования транслятора – 16- или 32-разрядного.
Другое важное действие – установление соответствия между названиями ХММ-регистров и регистров общего назначения. Дело в том, что для моделирования ХММ-команд в 16- или 32-разрядном режиме работы ассемблера используются разные регистры общего назначения – 16-разрядные регистры в 16-разрядном режиме, и 32-разрядные в 32-разрядном режиме.
Рассмотрим процесс моделирования ХММ-команд. В качестве основы для моделирования выступает команда основного процессора!. Эта команда должна удовлетворять определенным требованиям. Каковы они? В поисках ответа посмотрим на машинные коды ХММ-команд в литературе [40, 41]. Видно, что общими у них являются два момента:
- поле кода операции ХММ-команд состоит из двух или трех байтов, один из которых равен Ofh;
- большинство ХММ-команд использует форматы адресации с байтами modR/M и sib и соответственно допускает сочетание операндов как обычных двух-операндных команд целочисленного устройства – регистр-регистр или память-регистр.
Для моделирования ХММ-команд нужно подобрать такую команду основного процессора, которая удовлетворяет этим двум условиям. Во включаемом файле iaxmm.inc в качестве таких команды присутствуют две – CMPXCHG и ADD. В процессе моделирования на место нужного байта кода операции этих команд помещаются байты со значениями кода операции соответствующей ХММ-команды. Когда микропроцессор "видит", что очередная команда является ХММ-командой, то он начинает трактовать коды регистров в машинной команде как коды ХММ-регистров и ссылки на память, размерностью соответствующей данной команде.
В машинном формате команды нет символических названий регистров, которыми мы пользуемся при написании исходного текста программы, например АХ или ВХ. В этом формате они определенным образом кодируются. Например, регистр АХ кодируется в поле REG машинной команды как 000. Если заменить код операции команды, в которой одним из операндов является регистр АХ, на код операции некоторой ХММ-команды, то это же значение в поле reg микропроцессор будет трактовать как регистр RXMMO. Таким образом, в ХММ-командах коды регистров воспринимаются соответственно коду операции.