|
Ушел с форума
16381 / 7693 / 1080
Регистрация: 11.11.2010
Сообщений: 13,779
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|