К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 25
Текст из файла (страница 25)
Первым делом каждая подпрограмма устанавливает указатель фрейма (предварительно записав в стек его исходное содержимое) и сохраняет значения 104 Глава 2. Машинные команды и программы тех регистров, которыми она собирается оперировать. Например, Б(1В1 исполь- зует четыре регистра, от КО до КЗ, а Б(1В2 — два регистра, КО и К1. Все указанные регистры, а также указатель стека восстанавливаются перед выходом из подпро- граммы. Адрес в памяти Команды Комментарии Главная программа (Мщп) Помещение парзметров в стек Сохранение результата Восстановление указателя стека Первая подпрограмма (Б1)В() 2100 Я)В1 Моче РР,-(БР) 2104 Моче БР,РР 2108 МочеМп!11р1е КО-КЗ,-(БР) 2112 Моче 8(ЕР),КО Моче 12(ЕР),К1 Моче РАКАМЗ,— (БР) 2160 Са(1 Я)В2 2164 Моче (БР)<-,К2 Помещение параметра в стек Выталкивание результата работы подпрограммы Я)В2 в К2 Моче К3,8(РР) МочеМпРЗр1е (БР)ь,КΠ— ЙЗ Моче (БР)+,ЕР Кетпгп Вторая подпрограмма (Бь)В2) 3000 БПВ2 Моче РР,-(БР) Моче БР,ЕР МочеМп111р1е КО-К1,— (БР) Моче 8(РР),КО Моче К1,8(РР) МочеМпрпр1е (БР)+,КΠ— К1 Моче (БР)ч.,ЕР Кето гп Рис.
2.28. Вложенные подпрограммы 2000 2004 гОО8 2012 2016 2020 Моче Моче Са1! Моче А<И Следующая команда РАКАМ2,-(БР) РАКАМ1,-(БР) Я)В1 (БР),КЕЯЛ Т Ф8,БР Сохранение указателя фрейма Загрузка указателя фрейма Сохранение регистров Считывание первого параметра Считывание второго параметра Помещение ответа в стек Восстановление регистров Восстановление указателя фрейма Возвращение управления главной программе Сохранение указателя фрейма Загрузка указателя фрейма Сохранение регистров КО и К1 Считывание параметра Помещение в стек результата работы подпрограммы Я.гВ2 Восстановление регистров КО и К1 Восстановление указателя фрейма Возвращение управления подпрограмме Я) В1 2.10. Дополнительные команды 105 Стеков ый фрейм второй подпрограммы ГР— я~ Стековый фрейм первой подпрограммы -- Старая вершина стека Рис. 2.29.
Стековые фреймы программы, приведенной на рис. 2.28 2.10. Дополнительные команды Итак, в этой главе вы познакомились с командами Моче, 1лаг1, Вгоге, С1еаг, Аоо, ЯиЬ1тасс, 1псгешепд Весгешепс, ВгапсЬ, ТеэГЬ1Ц Сонате, Са11 и Кетпгп. Эти 13 команд в сочетании с приведенными в табл.
2.1 адресными режимами позволили нам написать ряд подпрограмм, демонстрирующих последовательность выполнения машинных команд, а также таких структур, как, например, ветвления. Кроме того, мы проиллюстрировали выполнение базовых операций ввода-вывода. Но даже в таком маленьком наборе команд наблюдается избыточность. Так, команды Есаул и Роге можно было бы заменить командой Моче, а команды 1псгетепг н Ресгешепт — соответственно командами Аос1 и ЯиЪггасп Команду С!еаг также можно было бы заменить командой Моче с непосредственно задаваемым операндом О. Таким образом, нам вполне достаточно было бы восьми команд. Но Для загрузки параметров из стека и помещения результатов обратно в таковой используется индексный режим адресации с использованием указателя фрейма РР.
В этих операциях, как и в случае стека, показанного на рис. 2.27, задается байтовое смещение 6, 12 и т. д. Обратите внимание на тот факт, что за удаление параметров из стека всегда отвечает вызывающая программа. Эту операцию выполняет команда АИ в главной программе и команда Моче, расположенная по адресу 2164 в подпрограмме ЯЗВ1.
106 Глава 2. Машинные команды и программы в системах реальных компьютеров избыточность встречается довольно часто. Многие из простых операций можно выполнить несколькими способами, правда, с разной эффективностью. В этом разделе вы познакомитесь еще с рядом важных команд, поддерживаемых большинством компьютеров, 2.10.1. Логические команды Базовые строительные блоки логических схем (см.
приложение А) реализуют такие выполняемые над отдельными битами логические операции, как И, ИЛИ и НЕ. Наряду с этим полезно иметь воэможность производить указанные операции и программным путем, для чего используются команды, способные выполнять их над всеми битами слова или байта по отдельности и параллельно. Так, команда Ной озй дополняет все биты операнда, заменяя нули единицами, а единицы нулями. В разделе 2.1.1 было показано, что в результате добавления 1 к дополнению положительного числа со знаком до единицы получается отрицательная версия дополнения этого же числа до двух. Например, число +3 (0011) путем прибавления 1 к его дополнению до единицы преобразуется (рис. 2.1) в -3 (1101).
Если число 3 содержится в регистре КО, данное преобразование выполняют команды Хог КО АгЫ №1,КО Во многих компьютерах эту же задачу выполняет одна команда Хейа1е КО Теперь рассмотрим, как применяется логическая команда Апг(, выполняющая побитовую операцию И над исходным и результирующим операндами. Предположим, что в 32-разрядном регистре КО содержатся четыре символа АЯСП.
Нам требуется определить, является ли первый слева символ буквой У.. Если да, будет выполнен условный переход по адресу УЕВ. В приложении Д указано, что АБСП-код буквы Х равен 01011010 или 5А в шестнадцатеричном формате. Нужное нам действие выполняют следующие три команды: Апй №ЗРРОООООО,КО Сошраге №$5АОООООО,КО Вгапсй-0 УЕЯ Команда Апб очищает все биты трех расположенных справа символов, оставляя крайний слева символ нетронутым. Это результат использования непосредственно заданного исходного операцда, состоящего из восьми единиц слева и 24 нулей справа.
Команда Сонате сравнивает оставшийся символ с левого края регистра КО с двоичным представлением символа Х. Если они совпадают, команда ВгапсЬ выполняет переход по адресу УЕ5. Следует отметить, что команда Апг) часто используется при необходимости очистить все разряды операнда, за исключением заданных разрядов.
В нашем примере нужно оставить нетронутыми восемь крайних слева битов регистра КО. 2.10. Дополнительные команды 107 2.10.2. Команды сдвига Еще одна типичная задача программирования требует сдвига всех битов операнда вправо или влево на заданное количество разрядов. Процесс выполнения сдвига зависит от того, содержит ли операнд знак или какую-нибудь другую двоично-кодированную информацию.
В общем случае, используется логический сдвиг. Для чисел производится арифметический сдвиг, при котором сохраняется знак числа. Логический сдвиг Для поддержки операции логического сдвига необходимы две команды: одна для выполнения сдвига влево (МЫМИ).), а другая — вправо (ЫЬ!Йк). Эти команды сдвигают операнд на заданное количество разрядов, определяемое операндом соппп Общий синтаксис команды, выполняющей логический сдвиг влево, таков: 15Ь1й1.
сопит,йг Операнд сопит может быть задан непосредственно или содержаться в регистре процессора. Освобождающиеся в результате сдвига разряды устанавливаются в О, а сдвигаемые за границу операнда разряды отмечаются с помощью флага переноса С, а затем удаляются. Устанавливать флаг С особенно удобно при выполнении арифметических операций с большими числаьги, занимающими больше одного слова На рис.
2.30, а показан пример сдвига содержимого регистра КО влево на два разряда. Команда логического сдвига вправо работает точно так же (рис. 2.30, б). Пример упаковки цифр Давайте рассмотрим пример, иллюстрирующий использование обеих операций сдвига и логических операций, Предположим, что в памяти по байтовым адресам ЕОС и ЕОС+1 расположены две десятичные цифры, записанные с использованием кодов АБСП. Нам нужно представить каждую из них в 4-разрядном двоично-десятичном формате и сохранить обеих в одном байте по адресу РАСКЕП. Результат, который мы получим, называется упакованным двоично-десятичным форматом. Из табл.
Д.1 и Д.2 приложения Д видно, что четыре крайних справа бита АБСП-кода десятичной цифры соответствуют ее двоично-десятичному коду. Поэтому для выполнения нашей задачи достаточно извлечь четыре младших разряда из байтов, расположенных по адресам 1.ОС и 1ОС+1, и объединить их в один байт по адресу РАСКЕП, Эту задачу выполняет представленная на рис. 2.31 последовательность команд, в которой для ссылки на АБСП-символы в памяти используется регистр ЕО, а для формирования двоично-десятичных кодов — регистры К1 и К2.
Мы предполагаем, что байт, пересланный командой МочеВуге из памяти в 32-разрядный регистр процессора, помещается у его правого края. Команда Апд используется для очистки всех разрядов регистра Е2, за исключением четырех крайних справа. Обратите внимание, что промежуточный исходный операнд команды Апд задан как ЗК Команда интерпретирует его как 32-разрядное двоичное число, содержащее 28 нулей в старших разрядах. 108 Глава 2. Машинные команды и программы КО Д: До После: Д1) КО ДО До: Д1 После: До До: После: Рис. 2.30.
Команды логического и арифметического сдвига: логический сдвиг влево, (Вл(й(. №2,НО (а); логический сдвиг вправо, (.8Л(йй №2,НО (б1; арифметический сдвиг вправо, АЗЫйн №2,ИО (в] Рис. 2.31. Подпрограмма, упаковывающая два двоично-десятичиых числа Моче Моче Вуте ПЗь1Й1. МочеВуте Апб Ог МочеВуте №1.ОС,КО (КО)ч-,К1 (КО),К2 №ЗЕ,К2 К1,К2 К2,РАСКНЭ КО указывает на данные Загрузка первого байта в К1 Сдвиг первого байта влево на 4 разряда Загрузка второго байта в К2 Очищение старших разрядов Объединение двоично-десятичных кодов цифр Сохранение резулътата 2.10, Дополнительные команды 109 Арифметический сдвиг Внимательно рассмотрев представление двоичного числа в форме дополнения до двух (рис. 2.1), вы поймете, что сдвиг числа на один разряд влево зквивалентен его умножению на 2, а сдвиг на один разряд вправо — его делению на 2.
Конечно, при сдвиге влево может произойти переполнение, а при сдвиге вправо может потеряться конец числа. Еще одно важное наблюдение заключается в том, что при сдвиге вправо в освободившемся разряде должен быть повторен знаковый бит. Этим арифметический сдвиг вправо отличается от логического, в котором освобождающиеся разряды всегда заполняются нулями. Пример арифметического сдвига вправо (АЯЬ|ЙК) приведен на рис. 2.30, в.