Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Архитектура компьютера - Таненбаун Э.

Таненбаун Э. Архитектура компьютера — Спб.: Питер, 2007. — 844 c.
ISBN 5-469-01274-3
Скачать (прямая ссылка): arhkomputera2007.DjVu
Предыдущая << 1 .. 198 199 200 201 202 203 < 204 > 205 206 207 208 209 210 .. 422 >> Следующая

может указывать на первый элемент массива, а еще один регистр, например
R3, - на первый адрес после массива. Массив содержит 1024 целых числа по
4 байта каждое. Если массив начинается с элемента Л, то первый адрес
после массива будет А + 4096. Типичная программа на ассемблере,
выполняющая это вычисление для двухадресной машины, показана в листинге
5.1.
Листинг 5.1. Программа на ассемблере для вычисления суммы элементов
массива
MOV R1.#0 MOV R2JA MOV R3JA+4096 LOOP: ADD R1.(R2)
ADD R2,#4 CMP R2,R3 BLT LOOP
накопление суммы в Rl, изначально О
R2 = адрес массива А
R3 = адрес первого слова после А
получение операнда через регистр R2
увеличение R2 на одно слово (4 байта)
проверка завершения
если R2 < R3. продолжать цикл
В этой маленькой программе мы использовали несколько режимов адресации. В
первых трех командах выполняется регистровая адресация первого операнда
(целевого) и непосредственная адресация второго (константа, обозначаемая
символом #). Вторая команда помещает в R2 не содержимое элемента А, а
элемент А. Именно это и сообщает ассемблеру знак #. Сходным образом
третья команда помещает в R3 первое слово после массива.
Интересно отметить, что само тело цикла не содержит каких-либо адресов
памяти. В четвертой команде используются регистровая и косвенная
адресация. В пятой команде применяются регистровая и непосредственная
адресация, в шестой - оба раза регистровая. Команда BLT могла бы
использовать адрес памяти, однако более привлекательным является
определение адреса с помощью 8-раз-рядного смещения, связанного с самой
командой BLT. Таким образом, вообще без обращения по адресам памяти, мы
получили короткий и быстрый цикл. Кстати, эта программа предназначена для
Pentium 4, только мы переименовали команды и регистры и для простоты
изменили запись.
Теоретически есть еще один способ выполнения этого фрагмента без
косвенной регистровой адресации. Цикл мог бы содержать команду для
прибавления А к регистру R1, например:
ADD R1, А
Адресация 407
Тогда при каждом шаге команда должна увеличиваться на 4. Таким образом,
после одного шага команда будет выглядеть следующим образом:
ADD R1, А + 4
И далее аналогично до завершения цикла.
Программа, которая сама изменяет себя подобным образом, называется само-
модифицирующейся программой. Идея, предложенная еще Джоном фон Нейманом,
применялась в старых компьютерах, которые не поддерживали режим косвенной
регистровой адресации. В настоящее время самомодифицирующиеся программы
считаются неудобными и трудными для понимания. Кроме того, их нельзя
выполнять совместно несколькими процессорами. Они не могут правильно
выполняться даже на машинах с разделенной кэш-памятыо первого уровня,
если в кэш-памяти команд нет специальной схемы для обратной записи
(поскольку разработчики предполагали, что программы сами себя изменять не
должны).
Индексная адресация
Часто нужно уметь обращаться к словам памяти по известному смещению.
Подобные примеры мы видели в машине IJVM, где локальные переменные
определяются по смещению от регистра LV. Обращение к памяти по регистру и
константе смещения называется индексной адресацией.
В машине IJVM при доступе к локальной переменной используется указатель
ячейки памяти (LV) в регистре плюс небольшое смещение в самой команде,
как показано на рис. 4.14, а. Есть и другой способ: указатель ячейки
памяти в команде и небольшое смещение в регистре. Чтобы показать, как
работает этот механизм, рассмотрим следующий пример. Пусть у нас есть два
одномерных массива A В по 1024 слова в каждом. Нам нужно вычислить Д И В{
для всех пар, а затем соединить все эти 1024 логических произведения
операцией ИЛИ, чтобы узнать, есть ли в этом наборе хотя бы одна пара, не
равная нулю. Один из вариантов - поместить адрес массива А в один
регистр, а адрес массива В - в другой регистр, а затем последовательно
перебирать элементы массивов аналогично тому, как мы делали в предыдущей
программе (см. листинг 5.1). Такая программа, конечно же, будет работать,
но ее молено усовершенствовать, как показано в листинге 5.2.
Листинг 5.2. Программа на ассемблере, выполняющая операцию ИЛИ для 1024
элементов массива
MOV R1,#0 собирает результаты выполнения ИЛИ в R1
изначально 0
MOV R2.#0 R2 = индекс, i от текущего
произведения A[i] И B[i]
MOV R3,#4096 R3 = первое ненужное значение индекса
MOV R4,A(R2) ; ; R4 = A[i]
AND R4.B(R2) ; ; R4 = А[i] И B[i]
OR R1.R4
ADD R2,#4 1=1+4
CMP R2.R3 нужно ли продолжать?
BLT LOOP если R2 < R3. нужно продолжать
408
Глава 5. Уровень архитектуры набора команд
Здесь нам требуется 4 регистра:
+ R1 - содержит результаты суммирования логических произведений;
+ R2 - индекс г, который используется для перебора элементов массива;
+ R3 - константа 4096 (это самое маленькое значение г, которое не
используется);
+ R4 - временный регистр для хранения каждого произведения.
После инициализации регистров мы входим в цикл из шести команд. Команда с
Предыдущая << 1 .. 198 199 200 201 202 203 < 204 > 205 206 207 208 209 210 .. 422 >> Следующая