|
Ушел с форума
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,762
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15.11.2013, 04:52 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 13 С помощью условных операторов и логических и арифметических команд теоретически можно организовать сколь угодно сложный алгоритм. Однако на практике при необходимости можно организовать обработку тысяч элементов массива (например, присвоить каждому элементу начальное значение), вручную набирать тысячу операторов присваивания крайне тяжело.ПЕРЕХОДЫ И ЦИКЛЫ (часть 4/5) Команды управления циклом Поэтому в языках программирования имеются средства для организации повторных вычислений, называемые операторами цикла. С помощью команд перехода на языке ассемблера можно реализовать любые разветвления и циклы. Например, за следующими операторами на языках Паскаль, BASIC и Си. Рис. 13.3.1 Рисунок |Паскаль| BASIC |Си, Си++ (a)| if X>0 then S1 else S2;|IF X>0 THEN S1ELSE S2 ENDIF|if (X>0) S1 else S2;(b) |while X>0 do S;| DO WHILE X>0 S LOOP |while (X>0) S;(c) |repeat S until X<0|| do S until (X<0); Где S, S1 и S2 какие-то операторы, а X – знаковая переменная, скрываются следующие ассемблерные команды
Циклы Допустим в вашей программе необходимо решить уравнение (A+B)*C=D. Хорошо, если известно, что A=1, B=5, C=7. Посчитать D – нет никаких проблем. А если эти числа получаются после других восьмиэтажных уравнений? Подойдем к решению задачи творчески (для простоты считаем что размерность A, B и C – байт):
Существует три основных типа цикла: циклы с условием в начале, циклы с условием в конце и циклы с условием в середине. Кроме того, существуют комбинированные циклы, которые имеют несколько условий в разных местах, например в начале и конце одновременно. Циклы с условием в начале – это циклы с предусловием, while-циклы. Цикл с условием в конце – это цикл с пост-условием, do /while или repeat / until – циклы. Блок статического предсказания направлений ветвлений процессоров Pentium оптимизирован под переходы, направленные в область младших адресов (назад). Поэтому циклы с постусловием должны выполняться быстрее циклов с предусловием. Циклы со счетчиком представляют собой синтаксическую разновидность циклов с предусловием. Замена цикла с приращением на цикл с убыванием счетчика делает ненужной команду CMP. Цикл с условием в середине называется break-циклы. Существует целых два основных варианта оператора повторения, причем каждый для своих целей: 1) повторение, управляемое вычисляемым условием, и 2) повторение, управляемое явным счетчиком или списком значений. В первую группу входят два оператора: while b do S Среди циклов на практике часто встречаются циклы с заранее известным числом повторений (for-циклы), поэтому в систему команд многих ЭВМ обычно включают дополнительные команды, упрощающие реализацию подобных циклов.и repeat S until not b Команда LOOP (LOOPW, LOOPD) Синтаксис команды: LOOP <TARGET> Пусть некоторую группу команд (тело цикла) надо повторить N раз (N>0). Когда-то на языке ассемблера этот цикл реализовали по такой схеме:
Действие команды LOOP немного сходно с циклом FOR-NEXT в Бейсике или соответствует паре инструкций REAPET-UNTIL, где инструкция REAPET означает начало блока инструкций цикла. Как и для цикла FORNEXT в Бэйсике, мы должны сообщить LOOP о том, сколько раз запускать цикл. Мы делаем это, помещая счетчик повторений в регистр RCX/ECX/CX. В каждом цикле микропроцессор вычитает единицу из RCX/ECX/CX, и когда RCX/ECX/CX становится равным нулю, LOOP заканчивает цикл. С помощью команды LOOP наш цикл запишется следующим образом:
Необходимо учитывать ряд особенностей команды LOOP:
Если вам необходим бесконечный цикл – воспользуйтесь командой JMP, а если не знаете сколько раз придется запускать цикл, используйте команды условного перехода. Если программа транслируется в 32-разрядном режиме, команда LOOP автоматически использует регистр ECX в качестве счетчика циклов. Команда LOOPW использует регистр CX в качестве счетчика циклов в 32-разрядном режиме. Фактически это та же самая LOOP, предваряемая префиксом 67h. Если программа транслируется в 16-разрядном режиме, команда LOOPD использует регистр ECX в качестве счетчика циклов. Фактически это та же LOOP, предваряемая префиксом 67h. Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ Синтаксис команд:(Цикл по счетчику пока равно/ = “LOOP if Equal” Цикл по счетчику пока ноль = “LOOP if Zero” Цикл по счетчику пока не равно = “LOOP if Not Equal” Цикл по счетчику пока не ноль = “LOOP if Not Zero”) LOOPE <TARGET> Эти команды похожи на команду LOOP, то есть заставляют цикл повториться столько раз, сколько указано в регистре CX/ECX, однако они допускают и досрочный выход из цикла.LOOPZ <TARGET> LOOPNE <TARGET> LOONZ <TARGET> Команда LOOPE используется для организации цикла с известным числом повторений, из которого возможен досрочный выход. До начала цикла в регистр CX/ECX записывается число повторений. Команда LOOPE ставится в конец цикла, а перед ней помещается команда, меняющая флаг ZF – обычно это команда сравнения CMP. Команда LOOPE заставляет цикл повторяться CX/ECX раз, но только если команда CMP фиксирует неравенство сравниваемых величин – происходит выход из цикла. По какой именно причине произошел выход из цикла (по ZF=0 или CX/ECX=0), надо проверять после цикла. Чаще всего команда LOOPE используется для поиска первого элемента некоторой последовательности, отличного от заданной величины. Команда LOOPZ – синоним команды LOOPE. Команда LOOPNE аналогична команде LOOPE, но выход из цикла осуществляется при ZF=1, если предыдущая команде LOOPNE команда CMP зафиксировала равенство или по CX/ECX=0. Команда LOOPNE обычно используется для поиска в некоторой последовательности первого элемента, имеющего заданную величину. Команда LOOPNZ – синоним команды LOOPNE. Пусть ASCII_STR является переменной, ассоциируемой с началом цепочки из L символов, и в цепочке необходимо найти символ пробела. Цикл заканчивается, когда обнаружен пробел или когда просмотрена вся цепочка. Если пробел не найден, осуществляется переход к метке NOT_FOUND:
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
|||
|
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время?
Никакой пенсии. Никакого нового. . .
|
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю
Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы
Кратко. . .
|
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем
**Полевые заметки о двухнедельной совместной работе**. . .
|
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|