Re[8]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 28.09.09 15:39
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну так мы далеко уйдем. Если нет ret, то, наверное, нет и call, так ? Или они есть, но иначе. Если уж на то пошло, то в архитектуре IBM-360/370 не было аппаратного стека, и мое утверждение насчет рекурсии как цикла на стеке там явно неприменимо.


Интересно получается — в одном случае утверждение верно, в другом нет. В то же время, моя интерпретация подходит во всех случаях

PD>Руководство, которое можно бы написать по твоим советам насчет асма, будет не руководством по асму, а руководством по трюкам на асме. Не обижайся.


Не дождётесь И вот почему смешно: в ассемблере континуации — "трюк", а в других языках — "мегафича".

Кстати, вот такой пример на тему циклов (я употребляю это слово, т.к. оно короче, но подразумеваю описанное ранее)

Есть 32 бита в регистре (не конь в вуккуме, а, например, маска пикселей) нужно их как-то обработать по-одному. Как будет решаться задача императивно, циклом? В лоб:
    mov eax, [pixels]  
    mov ecx, 32  
@@: shr eax, 1  ; копируем очередной бит в Carry Flag
    ;
    ; тут что-то делаем с битом
    ;
    dec ecx  ; итерируем цикл
    jnz @b

Если немного подумать, то на ассемблере это делается так:
    mov eax, [pixels]
    stc    ; используем Carry Flag как "маркер" конца битовой последовательности.
@@: rcr eax, 1 ; копируем очередной бит в Carry Flag. за счёт цикличности сдвига, меркер перейдёт в младший бит на первом проходе.
    ;
    ; тут что-то делаем с битом
    ;
    or  eax, eax  ; проверяем, остался ли бит маркера.
    jnz @b
Счётчик цикла убран за не надобностью тратить лишний регистр. Как бы так "императивно" объяснить вышепроисходящее, без упоминаний о битах? С другой стороны, можно сказать что здесь рекурсивный вызов, где параметром передаётся "остаток" последовательности.

GN>>LOOPcc придумана с единственной целью: получить более компактный бинарный код.


PD>По сравнению с чем ? jne и т.п ? Да. Но дело-то не в этом, а в том, что машинные команды включают в себя специальную команду цикла.


В этом именно и дело. Отдельный опкод — для экономии памяти. Отдельное определение для частного случая рекурсии — для кратости изложения.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.