КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Базовые типы командСложение двух чисел относится к числу фундаментальных операций любого компьютера. Инструкция С=А+В в программе на языке высокого уровня — это команда компьютеру сложить текущие значения двух переменных, А и В, и присвоить их сумму третьей переменной, С. При компиляции программы, содержащей эту инструкцию, переменным А, В и С назначаются конкретные адреса памяти. Содержимое памяти по этим адресам представляет значения трех переменных. Поэтому приведенная выше инструкция на языке высокого уровня требует выполнения компьютером следующего действия: С ← [А] + [В] Для выполнения этого действия содержимое памяти по адресам А и В должно быть переслано в процессор, где будет вычислена сумма. Полученная сумма должна быть отправлена обратно в память и записана по адресу С. Для начала давайте предположим, что это действие выполняется посредством одной машинной команды. Эта команда содержит адреса трех операндов: А, В и С. Символически такую трехадресную команду можно представить как Add C,A,B Команда Add образована от слова Addition (сложение). Операнды А и В называются исходными операндами, а С — операндом назначения или результирующим операндом. В общем случае команда этого типа имеет такой формат: Операция МестоНазначения,Источник1,Источник2 Если для указания адреса одного операнда в памяти необходимо k бит, в закодированной форме данной инструкции для адресов должно быть отведено 3k бит и еще сколько-то бит для кода самой операции Add. В случае современного процессора с 32-разрядным адресным пространством трехадресная команда слишком громоздка для одного слова разумной длины. Поэтому для представления команд такого типа обычно используется формат длиной в несколько слов. Для выполнения этой же задачи в качестве альтернативы можно использовать несколько более простых команд, с одним-двумя операндами. Предположим, что процессором поддерживаются двухадресные команды в виде: Операция МестоНазначения,Источник Команда Add такого типа Add A,B будет выполнять операцию A ← [А] + [В]. После вычисления суммы результат будет переслан обратно в память и сохранен по адресу A с заменой исходных данных, хранившихся по этому адресу. Это означает, что A является и исходным, и результирующим операндом команды. В случае двухадресных команд для решения нашей задачи одной двухадресной команды недостаточно. Потребуется еще одна двухадресная команда, которая копирует значение из одного места памяти в другое. Вот она: Mov С,A Эта команда выполняет операцию C ← [A], оставляя содержимое памяти по адресу A неизменным. Команда образована от слова Move, означающего «перемещение», использовано здесь не совсем точно: более уместно было бы назвать эту команду Copy (копирование). Однако именно это, первое, название команды давно закрепилось в компьютерном мире. Операция С ← [А] + [В] может быть выполнена помощью двух команд и в такой последовательности: Mov C,B Add C,A Во всех приведенных выше командах первым задается операнд назначения, а исходные операнды после него. Этот порядок характерен для выражений на языке ассемблера, используемых в машинных командах многих компьютеров, например, персональные компьютеры на базе процессора Intel.. Но существует достаточно много компьютеров, в которых порядок операндов обратный. К сожалению, единого соглашения, принятого всеми производителями, не существует. Даже в языке ассемблера одного компьютера могут использоваться команды с разным порядком операндов. В процессоре Intel только двухадресные и одноадресные команды и результирующий операнд всегда задается первым. Следует отметить одно очень важное обстоятельство. Если делать арифметические операции с данными, которые находятся в памяти, то время выполнения таких операций будет очень большим, а процессор будет работать с остановками на то время, пока не отработает память по пересылке исходных данных из памяти и результата в память. Поэтому в некоторых современных процессорах арифметические операции выполняются с данными, которые находятся в регистрах процессора, а для пересылки данных в регистры и назад в память используются команды Load и Store. Команда Mov тоже может использоваться для пересылки данных из памяти в регистр процессора и из регистра процессора в память, поскольку направление пересылки в ней задается просто порядком операндов. Поэтому команда Mov A,Ri означает то же, что и команда Store A,Ri, а команда Mov Ri,A — то же, что и команда Load Ri,A В процессоре Intel нет команд Load и Store, вместо них используется команда Mov. В тех процессорах, которые производят арифметические операции только над содержимым регистров, задача С = А + В может быть выполнена путем применения такой последовательности команд: Mov Ri,A Mov Rj,B Add Ri,Rj Mov C,Ri, Если процессор позволяет использовать операнды, из которых один находится в памяти, а все остальные в регистрах (например Intel), то эту же задачу можно реализовать и по-другому: Mov Ri,A Add Ri,B Mov C,Ri Время выполнения конкретной задачи зависит от того, насколько быстро команды пересылаются из памяти в процессор и насколько быстро осуществляется доступ к операндам этих команд. Операции, в которых участвует память, выполняются гораздо медленнее, чем операции с участием регистров. Поэтому значительного ускорения работы можно добиться в тех случаях, когда несколько операций подряд выполняются над хранящимися в регистрах данными без обращения к памяти. При компиляции программ, написанных на языке высокого уровня, в машинный язык важно минимизировать частоту перемещений данных между памятью и регистрами процессора. Итак, теперь вы имеете представление об одно-, двух- и трехадресных командах и знаете о возможности использовать команды, в которых все операнды задаются неявно. Такие команды применяются в машинах, хранящих операнды в структуре, которая называется стеком. А сами команды называются ноль-адресными. Концепция стека вводится в разделе 5.10.
|