это то, что выдает компилятор. Чтобы произвести программу уровня команд,
составитель компилятора должен знать, какая модель памяти используется в
компьютере, какие регистры, типы данных и команды имеются в наличии и
т.д.
В связи с этим определением такие вопросы как программируется ли
микроархитектура или нет, конвейеризирован компьютер или нет, является
ли компьютер суперскалярным не относится к уровню архитектуры команд,
однако знания об этом могут повысить эффективность разрабатываемых
компиляторов.
Модели памяти
Большинство машин имеет единое адресное пространство. В некоторых
машинах содержатся отдельные адресные пространства для команд и
данных. Такая система гораздо сложнее, чем единое адресное пространство,
но зато она имеет два преимущества:
• Появляется возможность иметь 2
32
байтов для программы и 2
32
байтов
для данных при размере регистра адреса в 32 разряда;
• Исключается сама возможность интерпретировать код как данные и
наоборот.
Один из аспектов модели памяти – семантика памяти. Естественно
ожидать, что если в программе идет запись по некоторому адресу, а затем
считывание из этого же адреса, то мы получим толь что сохраненное
значение. Но в некоторых машинах микрокоманды переупорядочиваются.
Возникает опасность, что память не будет действовать так, как ожидалось
(сопроцессор). Ситуация усложняется в случае с мультипроцессором, когда
каждый процессор посылает свой запрос в память. Системные разработчики
могут применять различные подходы к решению этих задач. В некоторых
случаях запросы в память делают упорядоченными, в других – возлагают на
разработчиков компиляторов (или даже программистов) заботу о правильном
функционировании памяти. Все эти проблемы затрудняют работу
разработчиков ПО, хотя надо отметить, что существуют модели памяти, в
которых аппаратное обеспечение автоматически блокирует определенные
операции с памятью связанные с зависимостью записи/считывания.
Регистры
Во всех компьютерах имеется несколько регистров, которые видны на
уровне архитектуры команд. Они нужны для хранения промежуточных
результатов, для контроля выполнения программы и для других целей.
Регистры уровня команд можно разделить на две категории:
специальные регистры и регистры общего назначения. Специальные
регистры включают счетчик команд, указатель стека, а также другие
регистры с особой функцией. Регистры общего назначения содержат
ключевые локальные переменные, и промежуточные результаты. Их
48