|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15.11.2013, 04:52 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 13 Структура управления – синтаксическая форма в языке программирования, которая служит для предоставления алгоритма управления. Типичными управляющими структурами являются: if ... then ... else; case;goto; for; while ... do; repeat ... until.ПЕРЕХОДЫ И ЦИКЛЫ (часть 1/5) Любой язык программирования должен обеспечивать реализацию следующих форм управления процессом выполнения программ:
Структура следования Простейший способ как-то организовать используемые в программе инструкции состоит в их последовательном размещении одна за другой. К сожалению, вы не сможете написать любую программу как один большой список инструкций. Если компьютеру необходимо принять какое-то решение, ваша программа должна выбрать один из нескольких вариантов инструкций. Программы, в которых присутствует подобная возможность выбора, называются программами с ветвлением. В других ситуациях вам понадобится, чтобы компьютер выполнял один и тот же набор инструкций, поэтому использование цикла (например, FOR NEXT) оказывается намного проще, чем многократное указание одного и того же набора инструкций.Структура ветвления Структура ветвления (например IF условие THEN действие) позволяет компьютеру выполнять один из нескольких наборов различных инструкций в зависимости от определенного условия. Структура ветвления предполагает два или больше вариантов набора инструкций, один из которых компьютер должен выполнить в той или иной ситуации.Структура повторения Иногда компьютер должен последовательно выполнять одни и те же инструкции. Вместо того чтобы многократно выводить эти инструкции, программист использует цикл. Цикл FOR NEXT выполняется определенное количество раз. Цикл WHILE выполняется до тех пор, пока не прекратит выполняться определенное условие. Таким образом, количество раз, которое выполняется цикл WHILE, изменяется от нуля до бесконечности.Принятие решений с помощью управляющих операторов Основное назначение программы – заставить компьютер вести себя определенным образом. Большинство программ должны принимать данные и изменять свое поведение в зависимости от этих данных. Для того чтобы предоставить программе возможность принимать решения, вы должны использовать управляющие операторы.Когда вы принимаете какое-либо решение, например, что съесть на завтрак, вы задаете себе определенный вопрос: «А хочу ли я яичницу?» Если ответ положительный, вы отправляетесь на кухню или в ресторан. Компьютеры работают приблизительно также, только люди задают вопросы, а компьютер проверяет булевы выражения. Булево выражение – это нечто, принимающее всего два значения – истина и ложь, нуль и «не нуль». Простейшие булевы выражения сравнивают два значения (две переменные или одну переменную и одно фиксированное значение). Символы <, >, =, Если вам требуется вывести на печать сообщение только в том случае, если оба булевых выражения правильны. Вместо того чтобы заставлять компьютер вычислять булевы выражения по одному, вы можете заставить его вычислять сразу несколько булевых выражений, если воспользоваться булевыми операторами. Булев оператор – это не что иное, как объединение двух или нескольких булевых выражений для представления значений true или false. В любом языке программирования используются следующие булевы операторы: AND, OR, XOR, NOT. Проще всего объяснить компьютеру какие действия требуется выполнять – использовать оператор IF THEN. Этот оператор проверяет, выполняется определенное условие или нет. Оператор IF THEN приказывает компьютеру следовать определенным инструкциям только при выполнении какого-то условия. Если условие не выполняется, компьютер просто игнорирует все соответствующие инструкции. Оператор IF THEN ELSE немного отличается от оператора IF THEN, так как приказывает компьютеру выполнить один набор инструкций в случае выполнения условия, и другой набор – в случае его невыполнения. Перечислять несколько условий (более трех) при использовании IF THEN ELSE достаточно утомительная задача, поэтому многие языки программирования используют оператор SELECT CASE. Вообще говоря, программисты стремятся к тому, чтобы компьютер выполнял как можно больше работы, а они – как можно меньше. В идеале, вы должны писать очень небольшие программы не только потому, что их проще отлаживать и при необходимости модифицировать, но и потому, что при их создании вам придется вводить меньше текста. Один из способов сокращения числа символов, которые должны вводить программисты, состоит в использовании циклов. Основная идея цикла – заставить компьютер повторять выполнение с небольшими модификациями одной или нескольких инструкций. Например, попробуем написать программу, которая выводит на экран числа от 1 до 5.
Цикл заставляет компьютер выполнять многократно одни и те же инструкции, однако компьютер должен знать, когда ему остановится. Для того чтобы сообщить компьютеру об этом, вам необходимо указать условие, которое должно представлять значение true или false. Если операторы в программе выполняются в том же порядке, как они записаны в памяти – это структура следования (рис. 13.1а). Но время от времени этот естественный порядок выполнения команд приходится нарушать, например, на рис. 13.1б нам потребовалось после оператора 1 выполнить оператор 4, минуя операторы 2 и 3. Такую возможность обеспечивает структура ветвления. Если после оператора Структура повторения выполняет какую-то часть программы, многократно. Изменение нормального порядка следования операторов осуществляется специальными операторами или операторными структурами. Имеется три основных типа операторов, обеспечивающих выполнение, в зависимости от условия (рис. 13.2): (а) – выполнение при условии: if b then S; (б) – выбор из двух возможностей: if b then S1 else S2; (в) – выбор из многих возможностей (оператор выбора). Заметьте, что (а) – это частный случай (б), то есть: if b then S else <ничего не делать> В случае (б) управляющая переменная должна быть логической, а в случае (в) она должна быть численной.Рис. 13.1 6 а б Рис. 13.2 Существует два вида алгоритмов – безусловные и условные. Порядок действий безусловного алгоритма всегда постоянен и не зависит от входных данных. Например: Обратите внимание на выделенные ключевые слова если, то и иначе, называемые операторами условия или условными операторами. Без них не обходится ни одна программа. В общем виде оператор условия схематично изображается так: IF (условие) THEN (оператор1, оператор2) ELSE (оператор3, оператор4) Задача компилятора – преобразовать эту конструкцию в последовательность машинных команд, выполняющих оператор1, оператор2, если условие истинно и, соответственно – оператор3, оператор4, если оно ложно. Условия делятся на простые (элементарные) и сложные (составные). Пример простого условия – Существуют три основных типа элементарных условий:
Классической условной конструкцией является конструкция if ...then ... endif. В этой конструкции некоторые операторы выполняются только при условии, что содержащееся в конструкции логическое выражение имеет значение TRUE. При построении алгоритмического языка по Маккарти существенен разбор случаев, поэтому необходимо иметь возможность формально выражать выполнение или невыполнение тех или иных условий. Таким образом, должна быть универсально введена вычислительная структура значений истинности {true, false}. В качестве базовых операций используют обычно две двухместные операции конъюкции и дизъюнкции и одноместную операцию отрицания. Начнем с очень простого примера. Напишем программу, подсчитывающую количество букв «а» во фразе «Я программирую на ассемблере!»
Команды управления, часто называемые командами перехода, позволяют выполнять различные действия в соответствии со значением внешних сигналов или выработанных внутри системы условий. Все команды управления делятся на команды безусловного и условного перехода. БЕЗУСЛОВНЫЙ ПЕРЕХОД (JMP) – команда, по которой в EIP/IP записывается содержимое адресного поля команды JMP label, то есть обеспечивается переход в программе по адресу label, указанному в команде, при этом следующая команда или группа команд, расположенных после JMP пропускается. БЕЗУСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ (CALL переход к подпрограмме, комбинация из PUSH адрес_возврата и JMP адрес_подпрограммы, INT номер_прерывания) – команда, по которой в EIP/IP записывается новое содержимое (адрес первой команды подпрограммы), но в отличие от команды JMP в памяти сохраняется состояние программного счетчика и некоторых других регистров. После выполнения подпрограммы по ее последней команде ВОЗВРАТ (RET) восстанавливается содержимое программного счетчика и всех регистров. Команды условной передачи проверяют состояние какого-либо разряда регистра, флагового триггера или другого параметра. От результата проверки зависит, будет выполняться переход или нет. Обычно переход выполняется, если результат проверки соответствует указанному в команде условию. В эту подгруппу команд управления входят команды:
При выполнении программы регистр IP/EIP/RIP содержит адрес текущей машинной команды. При обработке текущей команды значение IP/EIP/RIP автоматически увеличивается на длину команды, и это новое значение становится адресом следующей исполняемой команды. В результате, команды обрабатываются по последовательно возрастающим адресам. Переход от одной последовательности команд к другой выполняется командами передачи управления (jmp, call, ret, jcc, loop), которые принудительно устанавливают значение IP/EIP/RIP. Переходы бывают условными и безусловными. Если переход делается только тогда, когда выполнено некоторое условие, то такой переход называется условным, а если он выполняется независимо от каких-либо условий – безусловный. Команда безусловного перехода JMP(Переход, прыжок =”JUMP”) Компьютер использует несколько команд безусловного перехода, но в языке ассемблера они обозначаются одинаково. Команда JMP передает управление в другую точку программы, не сохраняя какой-либо информации для возврата.Синтаксис команды: JMP <TAGER> Семантика команды: операнд TAGER тем или другим способом указывает адрес перехода, то есть адрес той команды, которая должна быть выполнена следующей. Если команда, на которую делается переход находится в том же сегменте памяти, что и команда jmp – переход называется внутрисегментным или ближним (near jmp) – изменяется только значение в регистре IP/EIP/RIP, если при этом адрес перехода находится в пределах от -128 до +127 байтов от команды jmp – такой переход называется коротким (short jmp). Если команда находится в каком-либо другом сегменте программы – такой переход называется межсегментным или дальним (far jmp) – изменяется значение в регистре IP/EIP /RIP, а также значение CS. Для понимания различий механизмов перехода в реальном и защищенном режимах нужно помнить следующее. В реальном режиме микропроцессор изменяет CS и IP/EIP/RIP в системной памяти в соответствии с положением команды, на которую делается переход. В защищенном режиме микропроцессор предварительно анализирует байт прав доступа AR в дескрипторе, номер которого определяется по содержимому сегментной части указателя. В зависимости от состояния байта AR микропроцессор по команде JMP выполняет либо переход, либо переключение задач – передачу управления другой задаче в многозадачной среде.Прямой переход Синтаксис команды: JMP <TAGER>Возможные варианты команды: jmp rel jmp ptr16:16/32/64 Семантика команды: в случае прямого перехода в качестве операнда TAGER указывается адрес перехода, то есть адрес той команды, на которую надо передать управление. Адрес перехода может быть указан в виде:
IF близкий переход IF 64-разрядный режим THEN IF короткий переход THEN RIP ;в RIP адрес инструкции, следовавшей за JMP IF близкий прямой переход THEN RIP ELSE ;близкий косвенный переход RIP ENDIF ELSE IF 32-разрядный режим IF короткий переход THEN EIP IF близкий прямой переход THEN EIP ELSE ;близкий косвенный переход EIP ENDIF ENDIF
Использование опкода E9 (JMP NEAR) В команде JMP NEAR длина смещения, которая будет складываться со значением в регистре IP/EIP/RIP – четыре байта для 32-битного, либо два байта для 16-битного режима.
При сложении IP/EIP со смещением, перенос из старшего разряда IP/EIP игнорируется, поэтому адрес IP/EIP вычисляется по кольцевому принципу в пределах текущего сегмента кода, то есть: 0FFFFFFFFh+0FFFFFFFFh=0FFFFFFFEh Для перехода на б?льшие расстояния используют команду JMP FAR.Использование опкода EA (JMP FAR) Существует третий способ перехода с указанием не относительного, а действительного адреса. Для этого нам требуется не только знание EIP, на который мы должны перейти, а еще и значение соответствующего CS.
7
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|