Сделай Сам Свою Работу на 5

Нотация для описания операций с регистрами





Нам необходим способ для описания операций пересылки информации из одного места в компьютере в другое. Приемниками и источниками информации могут быть память, регистры процессора и регистры подсистемы ввода-вывода. Как правило, мы будем идентифицировать место хранения информации символиче­ским именем, представляющим его аппаратный двоичный адрес. Например, име­нами для адресов в памяти могут быть LOC, PLACE, A, VAR2; регистры процессо­ра могут иметь имена R0, R5, AX, DX, а регистры ввода-вывода — имена DATAIN, OUTSTATUS и т. д. Данные, хранящиеся по указанному адресу, обозначаются именем этого адреса, заключенным в квадратные скобки. Таким образом, выражение

R1 ← [LOC]

обозначает, что содержимое памяти по адресу LOC пересылается в регистр про­цессора R1.

В качестве еще одного примера рассмотрим операцию, которая складывает со­держимое регистров R1 и R2 и помещает полученный результат в регистр R3. Это действие записывается так:

R3 ← [R1] + [R2]

Данный тип записи называется RTN (Register Transfer Notation — нотация ре­гистровых передач). Обратите внимание, что в правой части выражения RTN все­гда стоит значение, а в левой — имя того места в памяти, куда его следует помес­тить, заменив старое содержимое.



Нотация языка ассемблера

Для представления машинных команд и программ нам потребуется другой тип нотации. Для этой цели мы будем использовать формат языка ассемблера. На­пример, команда, выполняющая первую из указанных в предыдущем разделе опе­раций, то есть пересылку данных из памяти по адресу LOC в регистр процессора AX, записывается так:

Move AX,LOC

После выполнения этой команды содержимое памяти по адресу LOC остается неизменным, а старое содержимое регистра AX перезаписывается.

Во втором примере мы складывали два числа, содержащихся в регистрах про­цессора R1 и R2, и помещали результат в регистр R3. На языке ассемблера эта операция записывается так:

Add R3,R1,R2

Базовые типы команд

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

С=А+В

в программе на языке высокого уровня — это команда компьютеру сложить теку­щие значения двух переменных, А и В, и присвоить их сумму третьей перемен­ной, С. При компиляции программы, содержащей эту инструкцию, переменным А, В и С назначаются конкретные адреса памяти. Содержимое памяти по этим ад­ресам представляет значения трех переменных. Поэтому приведенная выше инст­рукция на языке высокого уровня требует выполнения компьютером следующего действия:



С ← [А] + [В]

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

Для начала давайте предположим, что это действие выполняется посредством одной машинной команды. Эта команда содержит адреса трех операндов: А, В и С. Символически такую трехадресную команду можно представить как

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.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.