|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
20.01.2010, 21:41
|
#1
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Циклы
Выделяют три вида циклов:
1. цикл с предусловием
2. цикл с постусловием
3. цикл с известным количеством шагов(цикл с параметром)
Вопрос: почему выделяют 3 вид цикла, если он выражается через цикл с предусловием?
Есть предположение что 3 вид цикла выделяют лишь потому что в Ассемблере присутствует инструкция loop которая непосредственно осуществляет декремент значения счетчика(регистр ecx, если ошибаюсь поправьте) и его проверку на ноль (как условие завершения цикла).
Т.е. если первые два вида релизуются в asm через условные конструкции, то 3 вид имеет вполне обосбленную для этого инструкцию.
Хотя может быть все намного глубже.
|
(Offline)
|
|
20.01.2010, 21:54
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Циклы
помоему третий вид это частный случай улучшающий жизнь разработчика.
|
(Offline)
|
|
21.01.2010, 12:32
|
#3
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Ответ: Циклы
И вопрос номер 2 уже более практический стороны:
Кто разбирался с гостом 19.701? Как трактовать символ "Подготовка" и корректно ли его применять в изображении циклов с известным количеством шагов?
|
(Offline)
|
|
21.01.2010, 12:54
|
#4
|
|
Ответ: Циклы
ZanoZa
а циклов физически нету в процессоре, есть compare и jump (if и goto), вот так тебе циклы и делают
судя по описанию госта тут http://cert.obninsk.ru/gost/282/282.html то подготовку использовать тебе не нужно, там внизу примеры есть
|
|
|
21.01.2010, 15:01
|
#5
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Ответ: Циклы
я так понял compare (или же cmp), есть инструкция которая используется для организации ветвления, но не осуществляет ветвление.
тут есть описание loop, по сути и есть цикл с заданным количеством шагов.
http://www.mini-soft.ru/soft/vba/kart/image039.gif пример цикла с использованием символа "подготовка".
И там же на сайте описан этот символ: http://www.mini-soft.ru/soft/vba/r_2.php
Как трактовать этот символ?
|
(Offline)
|
|
21.01.2010, 17:57
|
#6
|
|
Ответ: Циклы
ZanoZa
как обычный for
|
|
|
21.01.2010, 22:52
|
#7
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Циклы
Сообщение от jimon
ZanoZa
а циклов физически нету в процессоре
|
Если речь о x86, то fail:
MOV ECX,100 mylabel: ;Main code block goes here. LOOP mylabel
Будучи справедливым, в некоторых специфических микроконтроллерах действительно нету циклов. Но сейчас такое бывает очень редко.
|
(Offline)
|
|
21.01.2010, 23:30
|
#8
|
|
Ответ: Циклы
Tronix
я говорил физически, а не программно, современные x86 процессоры это RISC ядро с CISC обёрткой, большинство x86 команд и остальные делаются через микрокод
команда loop это по-сути dec, cmp и jmp, я не вижу смысла чтобы такие три команды реализовывали в железе как одну команду, потому считаю что она реализована в микрокоде процессора, возможно ошибаюсь
|
|
|
22.01.2010, 00:09
|
#9
|
Элита
Регистрация: 02.10.2005
Сообщений: 1,789
Написано 132 полезных сообщений (для 252 пользователей)
|
Ответ: Циклы
Скорее всего так и есть. Однако, первый вопрос остается открытым.
|
(Offline)
|
|
22.01.2010, 00:38
|
#10
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Циклы
Сообщение от jimon
Tronix
я говорил физически, а не программно, современные x86 процессоры это RISC ядро с CISC обёрткой, большинство x86 команд и остальные делаются через микрокод
команда loop это по-сути dec, cmp и jmp, я не вижу смысла чтобы такие три команды реализовывали в железе как одну команду, потому считаю что она реализована в микрокоде процессора, возможно ошибаюсь
|
Если уж на то пошло, то команда loop по сути это dec cx и jnz. Но даже на уровне микроядра реализованна отдельно. Как известно, на 8088 и 8086 она выполнялась быстрее чем аналогичные dec/jnz, одна со времен 386 наблюдается обратная ситуации - loop выполняется дольше. Поэтому во всяких тру-хацкерских манах по оптимизации советуют не использовать loop для циклов на современных процах. Из этого собственно и сделан вывод - что и на уровне микроядра эти команды реализованы по-разному во всей линейке процессоров x86.
PS: Хотя возможно тоже ошибаюсь, потому что эта ситуация может происходить из-за спаривания/не спаривания, ветвлений и прочих свистоперделок. Сейчас с этим черт ногу сломит, и пока не произведешь ряд тестов - хрен разберешься что в том или ином случае будет быстрее. С 88/286/386/486 было все куда более понятно....
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:17.
|