Анимация
JavaScript
|
Главная Библионтека
На практике в языке ассемблера удобно иметь ряд расширенных мнемоник", похожих на макросы, которые обычно выполняются как одна команда. Некоторые из них представлены в табл. 1.4. Таблица 1.4. Расширенные мнемоники
Команда загрузки непосредственно заданного значения расширяется до одной или двух команд, в зависимости от непосредственного значения I. Например, если 0<1 <2", можно применить команду ori с использованием регистра R0. Если -2*51 <0, можно обойтись командой addi с регистром R0. Если младшие 16 битов I - нулевые, используем команду addis. Для остальных значений I выполняются две команды: например, после команды ori вьшолняется addis. (Иначе говоря, в последнем случае вьшолняется загрузка из памяти, но при оценке времени и места, которое требуется на выполнение этой макрокоманды, будем считать, что выполняются две элементарные арифметические команды.) Существуют разные мнения о том, к какому набору RISC-команд следует отнести ту или иную команду - к базовому или к расширенному. Команды беззнакового деления и получения остатка от деления вполне можно было бы включить в расширенный набор RISC-команд. Команда знакового сдвига вправо - еще одна команда, редко используемая в тестах SPEC. Причина в том, что в С очень легко случайно использовать эти команды неправильно, например выполнив беззнаковое деление там, где используются знаковые операнды, или выполнить сдвиг вправо на величину со знаком (int), которая на самом деле является беззнаковой. Кстати, не следует выполнять деление целого знакового числа на степень 2 при помощи знакового сдвига вправо; так, вы должны добавить к результату 1, если делимое отрицательно и был выполнен сдвиг нескольких ненулевых битов. Различия между основным и расширенным набором RISC-команд приводят ко множеству подобных спорных моментов, но не будем подробно останавливаться на этой теме. Действие команд ограничивается двумя входными регистрами и одним выходным, что упрощает работу компьютера. Упрощается также работа оптимизирующего компилятора - ему не приходится обрабатывать инструкции с несколькими целевыми регистрами. Однако за такое упрощение приходится платить: если в программе требуется вычислить и частное, и остаток от деления двух чисел, то приходится выполнять две команды (деление и получение остатка). Стандартный алгоритм деления вместе с частным вычисляет и остаток от деления, поэтому на многих машинах и частное и остаток получаются в результате выполнения одной команды деления. Аналогичные замечания применимы и к случаю, когда при умножении двух слов получается двойное слово-произведение. Создается впечатление, что команда условной пересылки (moveq) имеет только два входных операнда, хотя на самом деле их три. Поскольку результат выполнения этой команды зависит от содержимого регистров RT, RA и RB, при неупорядоченном выполнении команд RT следует интерпретировать и как используемый, и как устанавливаемый ре- гистр одновременно. Представьте ситуацию, когда за командой, устанавливающей значение RT, следует команда условной пересылки и при этом нельзя потерять результат первой команды. Таким образом, разработчик машины может убрать команду условной пересылки из набора допустимых команд, тем самым исключив обработку команд с тремя (логическими) входными операндами. С другой стороны, команда условной пересылки снижает количество ветвлений в программе. В данной книге формат команд не шрает большой реши. Полное множество RISC-команд, описанное выше, вместе с командами для работы с числами с плавающей точкой и рядом команд супервизора может быть реализовано при помощи 32-битовых команд на компьютере с 32 регистрами общего назначения (5-битовые поля регистров). Если размер непосредственно заданных полей в командах сравнения, загрузки, сохранения и прерывания снизить до 14 бит, то это же множество команд может быть реализовано на компьютере с 64 регистрами общего назначения (с использованием 6-бшовых полей регистров). Время выполнения Предполагается, что все команды выполняются за один такт процессора, за исключением команд умножения, деления и получения остатка от деления, для которых невозможно точно определить время выполнения. Команды перехода занимают один такт, независимо от того, был выполнен переход или нет. Команда загрузки непосредственного значения выполняется за один или два такта, в зависимости от того, сколько элементарных арифметических команд требуется для формирования константы в регистре. Команды загрузки и сохранения не часто упоминаются в данной книге, но будем считать, что они выполняются за один такт, пренебрегая при этом задержкой при загрузке (промежутком времени между моментом завершения команды в арифметическом модуле и моментом, когда данные становятся доступны следующей команде). Однако зачастую одних только знаний о количестве тактов, используемых всеми арифметическими и логическими командами, недостаточно для правильной оценки времени выполнения программы. Выполнение программы часто замедляется вследствие задержек, возникающих при загрузке и выборке данных. Задержки такого рода не обсуждаются в книге, хотя и могут существенно влиять на скорость выполнения программ (причем это влиянце постоянно возрастает). Другим источником сокращения времени выполнения является возможность распараллеливания вычислений на уровне команд, которая реализована практически на всех современных RISC-компьютерах, особенно на специализированных быстродействующих машинах. В таких машинах имеется несколько исполнительных модулей и возможность диспетчеризации команд, что позволяет параллельное выполнение независимых команд (независимыми команды считаются тогда, когда ни одна из них не использует результаты других команд, команды не заносят значения в один и тот же регистр или бит состояния). Поскольку такие возможности компьютеров теперь уже не редкость, в книге много внимания уделяется независимым командам. Так, можно сказать, что некая формула может быть закодирована таким образом, что для вычисления потребуется выполнение восьми инструкций за пять тактов на машине с неограниченными возможностями распараллеливания вычислений на уровне команд. Это означает: если команды расположены в правильном порядке и машина имеет достаточное количество регистров и арифметических модулей, то она в принципе способна выполнить такую программу за пять тактов. 0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |