К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 43
Текст из файла (страница 43)
Системы команд процессоров АЯМ, Могого!а и !п1е! Поскольку операнд назначения А1 представляет собой младший байт регистра ЕАХ, ассемблер выберет код той операции пересылки, которая предназначена для пересылки байтов. Наиболее гибкой из всех адресаций является базовая индексная со смещением. Пример ее использования приведен на рис. 3.39, б, где функции базового и индексного регистров выполняют регистры ЕВР и Е81.
Этот пример показывает, как обратиться к операнду, который является одним из элементов списка двойных слов. Список начинается со смещением 200 относительно базового адреса 1000. С использованием коэффициента масштабирования 4 для доступа к двойным словам по адресам 1200, 1204, 1208, ...
можно обращаться при помощи последовательности индексов О, 1, 2, ... в индексном регистре Е51. В нашем случае в индексном регистре содержится значение 40 и при этом выполняется обращение к двойному слову по адресу 1360 (то есть 1000 з- 200 ~ 4 н 40). Данный операнд загружается в регистр ЕАХ командой МОЪ' ЕАХ,[ЕВРз-Е81*4з-200[ Использование коэффициента масштабирования облегчает доступ к последовательным двойным словам списка в программном цикле, поскольку в этом случае на каждом шаге цикла достаточно увеличивать значение индексного регистра на 1.
Мы подробно обсудили два способа адресации, и теперь вы сможете понять, как функционируют сходные режимы адресации — индексная со смещением и базовая индексная. Напоследок хотелось бы высказать одно замечание. Может показаться, что режим базовой адресации со смещением (табл. 3.3) является излишним, поскольку тот же результат можно получить при помогпи индексной адресации со смещением с коэффициентом масштабирования 1.
Однако команда с использованием первого режима на один байт короче. Кроме того, величина смещения во втором случае может задаваться только 32-разрядным числом. В следующем разделе рассказывается о том, как описанные режимы адресации кодируются в машинных командах. Более подробная информация по данной теме приведена в приложении Г. 3.17. Команды 1А-32 Набор команд архитектуры 1А-32 очень обширен. Машинные команды имеют переменную длину и не всегда однотипный формат, о чем будет рассказано в разделе 3.17.1.
В большинстве команд 1А-32 задаются один нли лва операнда. Если операндов два, только один их ннх может храниться в памяти, а другой должен находиться в регистре процессора. Наряду с обычными командами для пересылки данных между памятью и регистрами процессора, выполнения арифметических операций в наборе команд 1А-32 имеется множество команд для реализации логических операций, операций сдвига и циклического сдвига, а также для манипулирования стеком процессора. Для обработки нечисловых данных предусмотрены команды, оперирующие строками байтов.
3.17. Команды 1А-32 189 Мы начнем с рассмотрения небольшого набора команд и покажем, как они могут использоваться в сравнительно небольшой программе. Команда А1И) йг,згс выполняет операцию сЬг +- (йт) '- (згс) а команда МОЪ' згс йг как вы уже знаете, — операцию йв +- (згс) Предположим, что операнды хранятся в регистрах ЕАХ и ЕВХ. Следующие две команды вычисляют сумму операндов в регистре ЕАХ и сохраняют ее в памяти по адресу Я~М: А1Н) ЕАХ,ЕВХ МОЪ' ЯПМ,ЕАХ Поскольку в памяти может располагаться только один из операндов команды, для реализации операции С «- (А) «- (В) с тремя операндами в памяти потребуется целых три команды: МОЧ ЕАХ,А АЭП ЕАХ,В МОЧ С,ЕАХ Команда вычитания Я1В бзг,згс выполняет операцию <Ьт +- (гЬг) — (згс) Для увеличения и уменьшения операнда на 1 предназначены команды авто- увеличения (инкремента) и автоуменьшения (декремента), 1ХС и 1)ЕС.
Прежде чем мы перейдем к рассмотрению программы, выполняющей сложение чисел, вам нужно познакомиться еще с двумя командами. Первая из них — команда перехода Если результат последней арифметической операции был больше нуля, команда 50 ЕООРЯТАКТ осуществляет переход по адресу ЕООРЯТАКТ. Все команды условного перехода начинаются с буквы), соответствующей слову )шпр (переход), за которой следуют буквы, обозначающие условие.
В данном примере буква С обозначает «больше нулям О других командах условного перехода будет рассказано чуть позже. 190 Глава 3. Системы команд процессоров АЯМ, Мо1ого!а и !п1е! Чтобы получить возможность при косвенной регистровой адресации использовать регистр общего назначения, нужно сначала загрузить в такой регистр адрес операнда команды. Это можно сделать двумя способами. Если для нужного адреса в программе явно определена адресная метка, скажем 1.0САТ1ОХ, этот адрес можно загрузить в регистр при помощи команды Моче и с применением непосредственной адресации, вот так: МОУ ЕВХ,ОРРБЕТ ?.ОСАТ?ОХ Данная команда загружает в регистр ЕВХ адрес, представленный меткой ?.0- САТ?ОХ. В качестве альтернативы можно задействовать команду ?.оаг? Е??ест?че Аг?йгезз (загрузка исполнительного адреса) с мнемоническим обозначением ЕЕА Команда ?.ЕА ЕВХ,? ОСАТ?ОХ выполняет ту же операцию, что и приведенная выше команда.
При помощи команды ЕЕА можно загружать в регистры адреса, динамически вычисляемые во время выполнения программы. Предположим, нам нужно загрузить в регистр ЕВХ адрес операнда, для доступа к которому применяется базовая адресация со смещением. Команда 1.ЕА ЕВХ,?ЕВР+121 загрузит в регистр ЕВХ адрес операнда, расположенного по адресу ?ЕВР?+12. Ад- рес зависит от содержимого регистра ЕВХ в момент выполнения команды. Программа для сложения чисел Используя только что описанные команды, мы можем создать программу для сложения чисел при помощи цикла.
Предположим, что в памяти по адресу Х содержится набор 32-разрядных чисел, расположенных последовательно начиная с адреса ХПМ1. На рис. ЗАО, а приведена программа на языке ассемблера, складывающая эти числа и помещающая результат в память по адресу ЗПМ. В регистр ЕВХ загружается значение адреса Х??М1. Он используется как базовый регистр при базовой индексной адресации в первой команде цикла, расположенной по адресу 8ТАКТАРР. Индексным регистром здесь является ЕР?. Перед началом цикла он очищается путем записи в него значения О.
На первой итерации цикла к содержимому регистра ЕАХ, первоначально установленному в О, прибавляется первое число из списка, хранящееся по адресу ?ЕВХ? - ХПМ1. Затем значение индексного регистра увеличивается на 1. На второй итерации цикла к содержимому регистра ЕАХ прибавляется второе 32-разрядное число, расположенное по адресу Х??М1 + 4, поскольку в команде Аг?г? задан коэффициент масштабирования 4. На следующих итерациях к сумме прибавляются числа, находящиеся по адресам ХПМ1 - 8, ХПМ1 — 12, .... В качестве счетчика используется регистр ЕСХ. Сначала вторая команда программы загружает в него значение, хранящееся в памяти по адресу Х.
Далее на каждой итерации цикла значение в этом регистре уменьшается на 1. Команда условного перехода ? С выполняет переход к началу цикла по адресу ВТАКТАРР, если [ЕСХ~ > О. Когда содержимое 3.17. Команды (Я-32 191 регистра ЕСХ становится равным нулю, это означает, что все числа списка сложе- ны. В таком случае переход не осуществляется и следующая команда пересылки сохраняет содержимое регистра ЕАХ в памяти по адресу 31)М. РЕС „(С МОЧ ЕСХ 3ТАКТАРР 3()М,ЕАХ 1.ЕА 31) В ЕВХ,(к(()М1 ЕВХД МОЧ МОЧ 3ТАКТАРР: АРР 1.О ОР ЕСХ,(4 ЕАХ,О ЕАХ (ЕВХч.
ЕСХк4] БТАКТАРР МОЧ 5()М,ЕАХ Рис. 3.40. Программа для процессоров (Я-З2, выполняющая сложение списка чисел; простая программа (а); усовершенствованная версия программы (б) Приведенную на рис. 3.40, а программу можно переписать более компактно. Обратите внимание на команды РЕС ЕСХ ) О ЗТАКТАРР з конце программного цикла. Онн очень часто выполняются в конце циклов. Поэтому в набор команд процессора 1А-32 включена команда, объединяющая их функции. Команда (.ООР 3ТАКТАРР сначала уменьшает содержимое регистра ЕСХ, а затем выполняет переход по адресу ЗТАКТАР Р, если значение ЕСХ не равно нулю.
Вторая возможность сократить размер программы связана с двумя регистрами, ЕР1 и ЕСХ, которые использовались в качестве счетчиков. Если мы будем сканировать список складываемых ЕЕА МОЧ МОЧ МОЧ БТАКТАРР: АРР 1(,)С Е ВХ,(к(() М1 ЕСХ,(к( ЕАХ,0 ЕР1,() ЕАХ,(ЕВХч-ЕР1*41 ЕР1 Инициализация регистров базы (ЕВХ) и счетчика (ЕСХ) Очистка регистров суммы (ЕАХ) и индекса (ЕР1) Прибавление очередного числа к ЕАХ Увеличение значения индексного регистра Уменьшение значения регистра счетчика Если [ЕСХ( > О, переход на начало цикла Сохранение суммы в памяти Инициализация регистра базы ЕВХ и вычитание значения 4, чтобы в нем содержалось (к((ЗМ1 — 4 Инициализация счетчика ЕСХ Очистка регистров суммы (ЕАХ) Прибавление очередного числа к ЕАХ Уменьшение значения регистра ЕСХ и, если ЕСХ( > О, переход на начало цикла Сохранение суммы з памяти 192 Глава 3.
Системы команд процессоров АЯМ, Мо1ого!а и!п1е! чисел в обратном направлении, то есть от конца к началу, то нам потребуется только один счетчик. Воспользуемся регистром ЕСХ, поскольку он неявно применяется в команде ЕООР, Так как ()ч) = и, последовательные значения регистра ЕР1 в первой программе равны О, 1, 2, ..., и, и программа считывает числа по адресам )ч()М1, )ч()М1 + 4, г(()М1 + 8, ..., (ч()М1 + 4(п — 1). Новая программа считывает чисгга по адресам (1ч() М1 — 4) + 4л, ((ч(1М1 — 4) г 4(п — 1), ..., (ЬПЗМ1 — 4) ~ 4(1), а регистр ЕСХ в ней принимает значения и, и — 1, ..., 1 (рис. 3.40, б).