К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 19
Текст из файла (страница 19)
Оно будет изменено только последней командой А<И, предназначенной для перехода от одной записи к другой в конце очередного шага цикла. Можно сказать, что индексная адресация предназначена для доступа к операнду, расположение которого определено относительно некоторой базовой точки в структуре данных, где хранится этот операнд. В только что рассмотренном нами примере такой базовой точкой служит адрес кода очередной записи о студенте, а оценки по тестам являются операндами, доступ к которым осуществляется в режиме индексной адресации. Мы обсудили основную форму индексной адресации.
Для наиболее эффективного доступа к операндам в памяти в разных ситуациях применяются различные вариации этой базовой формы. Так, смещение Х может содержаться во втором регистре. В этом случае для представления операнда используется такая запись: (Иж) Исполнительный адрес вычисляется как сумма содержимого регистров И и В). Второй регистр обычно называют базовым, а содержащееся в нем значение — базой. Данная форма индексной адресации характеризуется большей гибкостью, поскольку позволяет изменять значения обоих компонентов исполнительного адреса. Чтобы показать, в каких ситуациях может понадобиться такая дополнительная гибкость, мы еще раз обратимся к примеру с данными о студентах, приведенному на рис. 2.14. В программе, представленной на рис.
2.15, в трех командах А<Ы в начале цикла использовались разные значения индекса. Предположим, что каждая запись содержит большое количество элементов — гораздо больше, чем оценок по трем тестам. В таком случае было бы очень хорошо заменить все три команды АсЫ одной командой, выполняемой во втором, вложенном цикле.
Подобно тому как для хранения адреса очередной записи используется регистр гс0, для хранения смещения очередного элемента записи относительно значения регистра 80 Глава 2. Машинные команды и программы КО может быть задействован еще один регистр. На каждом шаге вложенного цикла значение второго регистра будет увеличиваться (см. упражнение 2.9). Еше одна разновидность индексного режима адресации основывается на использовании двух регистров и константы.
Она обозначается так: Х(КйК1) В данном случае исполнительный адрес является суммой константы Х и содержимого регистров К1 и К1 Этот еще более гибкий способ адресации используется для доступа к нескольким компонентам каждого элемента записи, когда начало элемента записи определяется частью (ККРМ), а Х задает смещение компонента относительного начала элемента.
Иными словами, этот режим используется для работы с трехмерными массивами. 2.5.4. Относительная адресация Итак, мы определили режим индексной адресации операндов с использованием регистров процессора обшего назначения. Еще одна интересная разновидность индексного режима адресации связана с использованием вместо регистра общего назначения счетчика команд. Запись Х(РС) означает, что исполнительный адрес смещен на Х байтов относительно адреса, заданного в счетчике команд.
Этот режим называется относительной адресацией. Относительная адресация — это способ адресации, при котором исполнительный адрес определяется так же, как в индексном режиме, но вместо регистра общего назначения используется счетчик команд. Указанный режим часто используется для доступа к операндам-данным, но более типичным его предназначением является определение целевого адреса в команде перехода. Например, команда ВгапсЬ>0 1.ООР приводит к передаче управления по целевому адресу, определяемому именем 1.ООР, в том случае, если удовлетворяется условие перехода. Целевой адрес можно не задавать жестко, а вычислять как смещение относительно текущего значения счетчика команд.
А поскольку целевой адрес может находиться как выше, так и ниже команды перехода, смещение задается в виде целого числа со знаком. Вспомните, что в ходе выполнения команды процессор увеличивает значение счетчика, чтобы он указывал на следующую команду программы. В большинстве компьютеров зто обновленное значение используется для определения исполнительного адреса в режиме относительной адресации. Предположим, что для задания целевого адреса команды перехода в программе, представленной на рис.
2.12, используется относительная адресация. А еще мы предположим, что четыре команды в теле цикла, начиная с метки ЕООР, располагаются в памяти по адресам 1000, 1004, 1008 и 10012. Поэтому на момент, когда генерируется целевой адрес перехода, текущее, уже обновленное, значение в регистре РС равно 1016. Чтобы перейти по адресу 1ООР (1000), нужно использовать смещение Х - -16.
2.5. Режимы адресации 81 В языке ассемблера в командах перехода для указания целевого адреса используются метки (рис. 2.12). Когда компилятор при обработке ассемблерной программы встречает такую команду, он вычисляет значение смещения, в данном случае -16, и генерирует соответствующую машинную команду, используя относительную адресацию, то есть — 16(РС). 2.5.5. Дополнительные режимы адресации Вы уже имеете представление о пяти базовых режимах адресации, поддерживаемых большинством компьютеров, а именно о непосредственной, регистровой, абсолютной, косвенной и индексной адресации, а также о нескольких распространенных разновидностях индексного режима, которые используются липп отдельными компьютерами. И хотя этих режимов вполне достаточно для выполнения любых операций, некоторые компьютеры поддерживают еще и дополнительные режимы, облегчающие решение программных задач.
Два таких режима, полезных для доступа к элементам данных, расположенным последовательно в памяти, мы рассмотрим ниже. Автоинкрементпная адресация — это режим адресации, при котором исполнительный адрес содержится в указанном в команде регистре. После обращения к операнду значение в этом регистре автоматически увеличивается таким образом, чтобы он указывал на следующий элемент списка.
В команде на языке ассемблера автоинкрементная адресация обозначается так: имя регистра заключается в скобки, показывая тем самым, что данный регистр содержит исполнительный адрес, а за ним следует знак «+», указывающий, что после обращения к операнду значение в регистре должно быть увеличено: (В1)+ Если режим адресации задается в такой форме, то есть неявно, значит, значение в регистре увеличивается на 1.
Однако в случае памяти с побайтовой адресацией такой режим полезен лишь для доступа к последовательным байтам списка, Если же вам требуется получить доступ к последовательным словам, а длина слова составляет 32 разряда, приращение должно быть равным 4. Компьютеры, поддерживающие автоинкрементную адресацию, автоматически увеличивают содержимое регистра на значение, соответствующее размеру операнда. Таким образом, для операнда размером в 1 байт приращение равняется 1, для 16-разрядного операнда — 2, для 32-разрядного операнда — 4. Поскольку размер операнда команды обычно определяется как часть кода операции, в самой команде для указания автоинкрементного режима достаточно обозначения (Вз)+.
Если компьютером поддерживается автоинкрементный режим, он может использоваться в первой команде А<Ы (рис. 2.12), тогда отпадет надобность во второй команде А<Ы. Измененная подобным образом программа приведена на рис. 2.16. В дополнение к автоинкрементному режиму адресации компьютером может поддерживаться аналогичный ему режим, предназначенный для доступа к элементам списка в обратном порядке. Авподекрементная адресация — это режим адресации, при котором содержимое указанного в команде регистра сначала автоматически уменьшается, а затем используется в качестве исполнительного адреса операнда. 82 Глава 2. Машинные команды и программы вл113М1,К2 Инициализация КО Моче Моче С1еаг à — в-1„0ОР А,Ы 1)есгетевг Вгапсй>О Моче (К2)+,КО К1 1.ООР КО,о11М Рис.
2.16. Автоннкрементнал адресацнв в программе, представленной на рис. 2Л 2 При автодекрементном режиме имя регистра заключается в скобки, перед которыми ставится знак в — а, указывающий, что сначала из хранящегося в регистре значения должна быть вычтена некоторая константа: — (К1) В таком режиме доступ к операндам осуществляется в порядке уменьшения значений адресов. Читатель наверняка заинтересуется, почему адрес уменьшается до использования в команде, а не после, как в случае автоинкрементного режима. Об этом рассказывается в разделе 2.8. Там же мы покажем, как посредством совместного использования этих двух режимов можно реализовать важную структуру данных, называемую стеком.
Операции, выполняемые с помощью автоинкрементного и автодекрементного режимов, можно осуществить и с применением двух команд, одна из которых осуществляет доступ к операнду, а другая увеличивает или уменьшает значение регистра, содержащего адрес операнда. Объединение двух таких операций в одну просто сокращает количество команд, необходимых для выполнения задачи, Однако, как будет показано в главе 8, объединение двух операций в одной команде не всегда является приемлемым решением. 2.6. Язык ассемблера Машинные команды — это не что иное, как последовательности нулей и единиц. При подготовке программы работать с такими командами, мягко говоря, неудобно.
Поэтому для их представления используются символические имена. Как видите, до сих пор для определения команд мы применяли обычные слова английского языка, такие как Моче, АгЫ, 1псгешепг и ВгапсЬ, представляющие соответствующие двоичные коды. При написании программ для конкретных компьютеров зти слова обычно заменяются мнемоническими обозначениями, такими как МОЧ, А1Н), Пт(С и ВК.
Аналогичным образом для ссылки на регистр 3 мы используем обозначение КЗ, а для ссылки, скажем, на адрес в памяти — обозначение 1.ОС. Полный набор символических имен и правил их применения составляет язык программирования, обычно называемый языком ассемблера. Набор правил использования мнемонических обозначений для формирования команд определяет атнглакптс языка. 2.6. Язык ассемблера 83 Программы, написанные на языке ассемблера, могут автоматически транслироваться в последовательность машинных команд с помощью программы, называемой ассемблером. Ассемблер — это одна из служебных программ, входящих в состав системного программного обеспечения. Как и любая другая программа, ассемблер хранится в памяти компьютера в виде последовательности машинных команд.