Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

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


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

Idefine ParamO %oQ /* ParamO - это выходной параметр 0 */

Idefine Paraml %ol /* Paraml - это выходной параметр 1 */

Idefine Param2 %о2 /* Param2 - это выходной параметр 2 */

Idefine Scratch Ш /* в срр комментарии записываются как в С*/

.proc 04 .global towers towers: save ^sp,-112. %sp

cmp N, 1 ! if(n— 1)

bne Else ! if (n != 1) goto Else

sethi %hi(format), ParamO ! printf("Переместить диск с %6 на %й\п", ! i, j)

or ParamO, Я1о(format). ParamO ! ParamO - адрес форматирующей строки

mov I, Paraml ! Paraml = i

call printf ! вызов printf ДО установки параметра 2 (j)

mov J, Param2 ! пустая операция для установки параметра 2

b Done ! завершение

nop ! вставляет пустую операцию

Else: mov 6, К ! начало вычисления к = 6 -i-j

sub K.J.К ! k=6-j

sub K.I.K ! k=6-i-j

add N, -1, Scratch ! начало процедуры towers(n-l, i, k)

mov Scratch, ParamO ! Scratch = n-1

mov I, Paraml ! параметр 1 = i

call towers ! вызов towers ДО установки параметра 2 (k)

mov К, Param2 ! пустая операция после вызова

! процедуры для установки параметра 2

mov 1, ParamO ! начало процедуры towersd, i, j)

mov I, Paraml ! параметр 1 = i

call towers ! вызов towers ДО установки параметра 2 (j)

mov J, Param2 ! параметр 2 = j

mov Scratch, ParamO ! начало процедуры towers(n-1, k, j)

mov K, Paraml ! параметр 1 = k

call towers ! вызов towers ДО установки параметра 2 (j)

mov J. Param2 ! параметр 2 = j

Done: ret ! выход из процедуры

restore ! вставка пустой команды после ret

! для восстановления окон format: .asciz "Переместить диск с %6 на %6\п"

По алгоритму версия UltraSPARC III идентична версии Pentium 4. В обоих случаях сначала проверяется п, и, если n > 1, совершается переход к else. Основные сложности версии UltraSPARC III связаны с некоторыми свойствами архитектуры команд.

Сначала код UltraSPARC III должен передать адрес форматирующей строки в printf, но машина не может просто переместить адрес в регистр, который содержит выходной параметр, поскольку нельзя поместить 32-разрядную константу в регистр одной командой. Для этого требуется выполнить две команды: sethi и ог.

После вызова не нужно делать подстройку стека, поскольку регистровое окно корректируется командой restore в конце процедуры. Возможность помещать выходные параметры в регистры, а не обращаться к памяти, дает значительный выигрыш в производительности.

А теперь рассмотрим команду пор, которая следует за Done. Это пустая операция, которая всегда будет выполняться, даже если она следует за командой ус ловного перехода. Сложность состоит в том, что процессор UltraSPARC III очень конвейеризирован, и к тому моменту, когда аппаратно обнаруживается команда перехода, следующая команда уже практически заканчивает обрабатываться. Добро пожаловать в удивительный мир RISC-программирования!

Эта особенность распространяется и на вызовы процедур. Рассмотрим первый вызов процедуры towers в части el se. Процедура помещает п - 1 в %о0, ai — в %ol, но совершает вызов процедуры towers до того, как поместит последний параметр в нужное место. На компьютере Pentium 4 вы сначала передаете параметры, а затем вызываете процедуру. А здесь вы сначала передаете часть параметров, затем вызываете процедуру, и только после этого передаете последний параметр. К тому моменту, когда машина осознает, что она имеет дело с командой cal 1, следующую команду все равно приходится выполнять (из-за конвейеризации). А почему бы в этом случае не использовать пустую операцию, чтобы передать последний параметр? Даже если этот параметр потребуется самой первой команде вызванной процедуры, он уже будет на своем месте.


⇐ Предыдущая страница| |Следующая страница ⇒

.