Система команд ЭВМ общего назначения

 

Методы адресации

 

В машинах с регистрами общего назначения метод (или режим) адресации объектов, с которыми манипулирует команда, может задавать константу, регистр или ячейку памяти. Для обращения к ячейке памяти процессор прежде всего должен вычислить действительный или эффективный адрес памяти, который определяется заданным в команде методом адресации.

Система команд 32-разрядных процессоров предусматривает 11 режимов адреса­ции. При этом только в двух случаях операнды не связаны с памятью. Это операнд-содержимое регистра, которое берется из любого 8-, 16- или 32-битного регистра процессора, и непосредственный операнд (8, 16 или 32 бит), который содержится в самой команде. Остальные девять режимов так или иначе обращаются к памяти.

При обращении к памяти эффективный адрес вычисляется с использованием следующих компонентов.

Смещение (Displacement или Disp) – 8-, 16- или 32-битное число, включенное в команду.

База (Base) – содержимое базового регистра. Обычно используется для указа­ния на начало некоторого массива.

Индекс (Index) – содержимое индексного регистра. Обычно используется для выбора элемента массива.

Масштаб (Scale) – множитель (1, 2, 4 или 8), указанный в коде инструкции. Этот элемент используется для указания размера элемента массива, доступен только при 32-битной адресации.

Эффективный адрес вычисляется по формуле:

EA=Base + Index  Scale + Disp.

Отдельные слагаемые в этой формуле могут отсутствовать. Возможные режимы адресации приведены ниже:

 

 

Использование сложных методов адресации позволяет существенно сократить количество команд в программе, но при этом значительно увеличивается сложность аппаратуры. Важным вопросом построения любой системы команд является оптимальное кодирование команд. Оно определяется количеством регистров и применяемых методов адресации, а также сложностью аппаратуры, необходимой для декодирования. Именно поэтому в современных RISC архитектурах используются достаточно простые методы адресации, позволяющие резко упростить декодирование команд. Более сложные и редко встречающиеся в реальных программах методы адресации реализуются с помощью дополнительных команд, что приводит к увеличению размера программного кода. Однако такое увеличение длины программы с лихвой окупается возможностью простого увеличения тактовой частоты RISC-процессоров.

 

Типы команд

 

Команды 32-разрядных процессоров содержат одно- или двухбайтный код инструкции, за ко­торым могут следовать несколько байт, определяющих режим исполнения коман­ды, и операнды. Команды могут использовать до трех операндов (или ни одного). Операнды могут находиться в памяти, регистрах процессора или непосредственно в команде. Для 32-разрядных процессоров разрядность слова (word) по умолчанию может составлять 32 бит. Это распространяется на многие инструкции, включая и строковые. В реальном режиме и режиме виртуального процессора 8086 по умолчанию используется 16-битная адресация и 16-битные операнды-слова. В защищенном режиме режим адресации и разрядность слова по умолчанию оп­ределяются дескриптором кодового сегмента. Перед любой инструкцией может быть использован префикс переключения разрядности адреса или слова.

В системе команд насчитывается несколько сотен инструкций, которые можно группировать по разным признакам. Для удобства здесь все инструк­ции сгруппированы по функциональной общности.

1.Инструкции пересылки данных позволя­ют передавать константы или переменные между регистрами и памятью, а также портами ввода/вывода в различных комбинациях, но в памяти может находиться не более одного операнда. В эту группу отнесены и инструкции преобразования форматов – расширений и перестановки байт. Операции со стеком выполняются словами с разрядностью, определяемой текущим режимом.

2.Инструкции двоичной арифметики выполняют все арифметические действия с байтами, словами и двойными словами, кодирующи­ми знаковые или беззнаковые целые числа.

3.Инструкции десятичной арифметики являются дополнением к предыдущим. Они позволяют оперировать с неупакованными (биты 7–4 равны нулю, биты 3–0 содер­жат десятичную цифру 0–9) или упакованными (биты 7–4 содержат старшую, биты 3–0 – младшую десятичную цифру 0–9) двоично-десятичными числами. Арифметические операции над этими числами требуют применения инструкций коррекции форматов.

4.Инструкции логических операций выполняют все функции булевой алгебры над байтами, словами или двойными словами.

5.Сдвиги и вращения (циклические сдвиги) выполняются над регистром или операндом в памяти. При сдвигах влево и простом сдвиге вправо осво­бождающиеся биты заполняются нулями. При арифметическом сдвиге вправо старший бит (знак) сохраняет свое значение. При циклических сдвигах выталкиваемые биты попадают в осво­бождающиеся позиции.

6.Инструкции обработки бит и байт позволяют проверять и устанавливать значение указанного операнда, а также искать установленный бит. Битовые операции выполняются над 16- или 32-битными словами. Инструкция тестирования может выполняться над байтом, словом или двойным словом.

7.Передача управления осуществляется с помощью инструкций безусловных и условных переходов, вызовов процедур и прерываний (исключений). Безусловный переход (JMP) может быть как внутрисегментным (ближним или коротким), так и межсегментным (дальним). Адрес перехода может непосредственно указываться в команде, а при косвенной адресации он находится в регистре или памяти и может иметь дополнительные слагае­мые. Короткий переход (short) может передавать управление только на адрес на­значения, удаленный от текущего в пределах -128...+127 байт, ближний (near) – в пределах сегмента. При дальнем (far) переходе адрес назначения (непосредствен­ный или косвенный) включает новое значение указателя инструкций и значение (или селектор) сегмента кода, обеспечивая доступ к любой точке памяти (в преде­лах, разрешенных защитой).

Условные переходы в 8086 и 80286 возможны только короткие (8-байтное смеще­ние), процессоры 386+ допускают переход в пределах 16- или 32-байтного смеще­ния, в зависимости от режима адресации.

Инструкция вызова процедуры сохраняет адрес следующей за ней инст­рукции в стеке и передает управление в заданную точку.

8.Строковые операции выполняются с операн­дами в памяти. Операции могут использоваться с префиксами условно­го или безусловного повтора. Строковые инструкции ввода/вывода с префиксами повтора позволяют достигать высоких скоростей обмена с портами при условии полной загрузки процессора.

9.Операции с флагами позволяют изменять значе­ния отдельных флагов, а также сохранять их значение в стеке и восстанавливать сохраненные значения.

10.Инструкции загрузки указателей позволяют за­гружать дальние указатели из памяти в регистр общего назначения и соответствую­щий сегментный регистр.

11.К системным инструкциям относятся инструк­ции управления защитой – загрузки и сохранения регистров дескрипторов и ре­гистра задачи; проверки и выравнивания привилегий; обмена с управляющими, отладочными и модельно-специфическими (включая тестовые) регистрами; уп­равления кэшированием, захвата шины и остановки процессора. Для прикладных программ использование этих инструкций нехарактерно.

 

Типы и размеры операндов

 

Имеется два альтернативных метода определения типа операнда. В первом из них тип операнда может задаваться кодом операции в команде. Это наиболее употребительный способ задания типа операнда. Второй метод предполагает указание типа операнда с помощью тега, который хранится вместе с данными и интерпретируется аппаратурой во время выполнения операций над данными. Этот метод в настоящее время практически не применяется и все современные процессоры пользуются первым методом.

Обычно тип операнда (например, целый, вещественный с одинарной точностью или символ) определяет и его размер. Однако часто процессоры работают с целыми числами длиною 8, 16, 32 или 64 бит. Как правило, целые числа представляются в дополнительном коде. Для задания символов (1 байт = 8 бит) в машинах компании IBM используется код EBCDIC, но в машинах других производителей почти повсеместно применяется кодировка ASCII. Еще до сравнительно недавнего времени каждый производитель процессоров пользовался своим собственным представлением вещественных чисел (чисел с плавающей точкой). Однако за последние несколько лет ситуация изменилась. Большинство поставщиков процессоров в настоящее время для представления вещественных чисел с одинарной и двойной точностью придерживаются стандарта IEEE 754.

В некоторых процессорах используются двоично-кодированные десятичные числа, которые представляются в упакованном и неупакованном форматах. Упакованный формат предполагает, что для кодирования цифр 0–9 используются 4 разряда и что две десятичные цифры упаковываются в каждый байт. В неупакованном формате байт содержит одну десятичную цифру, которая обычно изображается в символьном коде ASCII.

В большинстве процессоров, кроме того, реализуются операции над цепочками (строками) бит, байт, слов и двойных слов.