forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Циклы (http://forum.boolean.name/showthread.php?t=11766)

ZanoZa 20.01.2010 21:41

Циклы
 
Выделяют три вида циклов:
1. цикл с предусловием
2. цикл с постусловием
3. цикл с известным количеством шагов(цикл с параметром)

Вопрос: почему выделяют 3 вид цикла, если он выражается через цикл с предусловием?
Есть предположение что 3 вид цикла выделяют лишь потому что в Ассемблере присутствует инструкция loop которая непосредственно осуществляет декремент значения счетчика(регистр ecx, если ошибаюсь поправьте) и его проверку на ноль (как условие завершения цикла).
Т.е. если первые два вида релизуются в asm через условные конструкции, то 3 вид имеет вполне обосбленную для этого инструкцию.
Хотя может быть все намного глубже.

H@NON 20.01.2010 21:54

Ответ: Циклы
 
помоему третий вид это частный случай улучшающий жизнь разработчика.

ZanoZa 21.01.2010 12:32

Ответ: Циклы
 
И вопрос номер 2 уже более практический стороны:
Кто разбирался с гостом 19.701? Как трактовать символ "Подготовка" и корректно ли его применять в изображении циклов с известным количеством шагов?

jimon 21.01.2010 12:54

Ответ: Циклы
 
ZanoZa
а циклов физически нету в процессоре, есть compare и jump (if и goto), вот так тебе циклы и делают

судя по описанию госта тут http://cert.obninsk.ru/gost/282/282.html то подготовку использовать тебе не нужно, там внизу примеры есть

ZanoZa 21.01.2010 15:01

Ответ: Циклы
 
я так понял compare (или же cmp), есть инструкция которая используется для организации ветвления, но не осуществляет ветвление.
тут есть описание loop, по сути и есть цикл с заданным количеством шагов.

http://www.mini-soft.ru/soft/vba/kart/image039.gif пример цикла с использованием символа "подготовка".
И там же на сайте описан этот символ: http://www.mini-soft.ru/soft/vba/r_2.php
Как трактовать этот символ?

jimon 21.01.2010 17:57

Ответ: Циклы
 
ZanoZa
как обычный for

Tronix 21.01.2010 22:52

Ответ: Циклы
 
Цитата:

Сообщение от jimon (Сообщение 134236)
ZanoZa
а циклов физически нету в процессоре

Если речь о x86, то fail:

PHP код:

MOV ECX,100
mylabel
:
   ;
Main code block goes here.
LOOP mylabel 

Будучи справедливым, в некоторых специфических микроконтроллерах действительно нету циклов. Но сейчас такое бывает очень редко.

jimon 21.01.2010 23:30

Ответ: Циклы
 
Tronix
я говорил физически, а не программно, современные x86 процессоры это RISC ядро с CISC обёрткой, большинство x86 команд и остальные делаются через микрокод

команда loop это по-сути dec, cmp и jmp, я не вижу смысла чтобы такие три команды реализовывали в железе как одну команду, потому считаю что она реализована в микрокоде процессора, возможно ошибаюсь :)

ZanoZa 22.01.2010 00:09

Ответ: Циклы
 
Скорее всего так и есть. Однако, первый вопрос остается открытым.

Tronix 22.01.2010 00:38

Ответ: Циклы
 
Цитата:

Сообщение от jimon (Сообщение 134344)
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 было все куда более понятно....


Часовой пояс GMT +4, время: 12:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot