Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.321Idefine 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, следующую команду все равно приходится выполнять (из-за конвейеризации). А почему бы в этом случае не использовать пустую операцию, чтобы передать последний параметр? Даже если этот параметр потребуется самой первой команде вызванной процедуры, он уже будет на своем месте. |