Формат команды микропроцессора IA-32
Команды состоят из необязательных префиксов, одного или двух байт главного кода операции, спецификатора адреса, представленного байтами mod r/m и sib, смещения в команде – displacement и непосредственных данных. Из всех полей команды обязательными являются только один или два байта кода операции. Префикс – это байт со специальным кодированием, который модифицирует операцию одной находящейся за ним команды (например: повторение – REPeate, размер операнда – Operand Size, размерность адреса – Address Size, замены сегмента – Segment override). Код операции. Байт "mod r/m" определяет режим адресации, а также иногда дополнительный код операции. Необходимость байта "mod r/m" зависит от типа инструкции. Байт sib (Scale-Index-Base) определяет способ адресации при обращении к памяти в 32-битном режиме. Необходимость байта sib зависит от режима адресации, задаваемого полем "mod r/m".Кроме того, инструкция может содержать непосредственный операнд и/или смещение операнда в сегменте данных. На размер инструкции накладывается ограничение в 15 байт. Инструкция большего размера может получиться при некорректном использовании большого количества префиксов. В IA-32 в таком случае генерируют исключение #13. Если инструкция микропроцессора требует операнды, то они могут задаваться следующими способами: непосредственно в коде инструкции (только операнд-источник); в одном из регистров; через порт ввода-вывода; в памяти. Для совместимости с 16-битными процессорами архитектура IA-32 использует одинаковые коды для инструкций, оперирующих как с 16-битными, так и 32-битными операндами. Адресация Как процессор будет считывать операнд или его адрес, зависит от эффективного размера операнда и эффективного размера адреса для данной команды. Непосредственный режим адресации подразумевает включение операнда-источника в код инструкции. Операнд может быть 8-битовым или 16-битовым, если значение эффективного размера операнда - 16. Операнд может быть 8-битовым или 32-битовым, если значение эффективного размера операнда - 32. Обычно непосредственные операнды используются в арифметических инструкциях. Регистровый режим адресации определят операнд-источник или операнд-приемник в одном из регистров процессора или сопроцессора. В некоторых случаях, (например, в инструкциях DIV и MUL) могут использоваться пары 32-битных регистров (например, EDX:EAX), образуя 64-битный операнд. Адресация через порт ввода-вывода подразумевает получение операнда или сохранение операнда через пространство портов ввода-вывода. Адрес порта ввода-вывода либо непосредственно включается в код инструкции, либо берется из регистра DX. Очень распространенный способ адресации операнда - адресация через память. Таким образом, может быть указан операнд-источник или операнд-приемник. Следует отметить, что процессор не позволяет одновременно задавать оба операнда через память (за исключением некоторых цепочечных команд).
Эффективный адрес. При обращении к памяти (к данным) процессор строит эффективный адрес, который может включать до трех компонентов. Смещение в сегменте (эффективный или исполнительный адрес - EA) может быть вычислено на основе значений регистров общего назначения и/или указанного в коде инструкции относительного смещения, при этом любой или даже несколько из указанных компонентов могут отсутствовать: EA = BASE + (INDEX*SCALE) + DISPLACEMENTЗдесь BASE – базовый адрес массива, INDEX – номер элемента, DISPLACEMENT – смещение внутри элемента. Массив может состоять из байтов, слов, двойных слов и учетверенных слов – это учитывается коэффициентом SCALE (1,2,34 или 8). Такая схема позволяет в языках высокого уровня и на языке Ассемблера легко реализовать работу с массивами.
Преобразование адреса Для получения операнда из памяти процессору необходимо знать селектор сегмента и смещение в сегменте. В некоторых командах селектор может быть указан непосредственно в коде инструкции. В других случаях процессор может явно или неявно использовать значение одного из сегментных регистров. Под неявным использованием сегментных регистров подразумевается то, что в зависимости от предназначения операнда процессор использует определенный сегментный регистр для обращения к памяти: CS -для выборки инструкций; SS - для работы со стеком или обращения к памяти через регистры ESP или EBP; ES - для получения адреса операнда-приемника в цепочечных командах; DS - при всех остальных обращениях к памяти. Явное использование сегментных регистров возможно, если в код инструкции включается префикс смены сегмента. Указание префикса смены сегмента допустимо не для всех команд: нельзя менять сегмент для команд работы со стеком (всегда используется SS); для цепочечных команд можно менять сегмент только операнда-источника (операнд-приемник всегда адресуется через ES).
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|