
- •Тема 1. Организация ветвлений на языке Ассемблера
- •Тема 2. Организация циклов на языке Ассемблера Условное и безусловное ветвление (переходы)
- •Оператор goto
- •Блок-схемы
- •7.8. Исключение goto и структурное программирование
- •Goto вредны?
- •Жизнь без goto
- •Цикл как аппроксимация
- •Инвариант цикла стратегии "максимум" на шаге I
- •Стратегия цикла
- •Оператор цикла: базисный синтаксис
- •Включение инварианта
- •Оператор цикла: корректность
- •Корректность
- •Корректность
- •Завершение цикла и проблема остановки
- •Определение: Вариант цикл
Практическая работа №8,9
Тема 1. Организация ветвлений на языке Ассемблера
Тема 2. Организация циклов на языке Ассемблера Условное и безусловное ветвление (переходы)
Управляющие механизмы машинных языков (язык ассемблера, система команд компьютера) обычно включают:
Безусловный переход: команду, которая передает управление команде с указанным адресом расположения в памяти. В ниже приведенном примере такая команда появляется как BR Address, где Address — адрес памяти целевой команды;
Условный переход: передает управление по заданному адресу при выполнении условия или следующей команде, если условие не выполняется. В нашем примере проверяется условие равенства двух значений:BEQ Value1 Value2 Address. Мнемоника команды "Branch если EQual".
Для языка ассемблер (примеры приводятся на этом уровне) адреса являются условными. Фактические адреса памяти появляются в процессе загрузки программы.
Понятие команды с указанным адресом расположения в памяти следует из принципа хранимой в памяти программы, справедливого для всех компьютеров, которые хранят в своей памяти и данные, и программы.Команда перехода, которая ошибочно задает адрес памяти, не являющийся командой, служит причиной ошибочной работы, приводящей, как правило, к завершению работы программы.
Рассмотрим составной оператор:
if a = b then
Составной_1
else
Составной_2
End
В машинном коде это может выглядеть так
100 BEQ loc_a loc_b 104
101 …Код для составной_2
102 …
103 BR 106
104 …Код для составной_1…
105 …
106 …Код для продолжения программы…
Здесь loc_a и loc_b задают адреса памяти, хранящие значения. Числа слева задают адреса команд, начиная с адреса 100 (просто в качестве примера). Определение точного расположения в памяти машинного кода, связанного с каждым программным элементом, является непростой задачей. Ее решением занимаются разработчики компиляторов, а не прикладные программисты, специализирующиеся на разработке приложений.
По примеру кода для условного оператора вам придется, выполняя упражнение, построить структуру кода, который компилятор строит для цикла.
Оператор goto
Команды перехода, условные и безусловные, отражают базисные операции, которые может выполнять компьютер: проверять выполнение некоторых условий, таких как равенство двух значений, хранящихся в памяти, передавать управление команде, хранящейся в памяти по определенному адресу. Все языки программирования имели в свое время, а некоторые и до сих пор предлагают оператор goto, чье имя образовано слиянием двух английских слов "go to" (перейти к). В таких языках можно приписать каждому оператору программы метку:
some_label: some_instruction
Здесь some_label — это имя, которое вы даете оператору. Общепринято метку отделять от оператора символом двоеточие, хотя возможны и другие соглашения. При компиляции компилятор отображает метки в условные адреса (100. 101, ...), появляющиеся в нашем примере машинного кода. Языки с goto включают оператор безусловного перехода в форме:
goto label
Эффект выполнения этого оператора состоит в том, что управление передается оператору с меткой, заданной оператором перехода.
Вместо красивого условного оператора if condition then Compound_1 else Compound_2 end старые языки программирования имели более примитивный оператор выбора test condition simple_instruction, выполняющий simple_instruction, если condition истинно, в противном случае выполнялся оператор, следующий за тестом.
Такой оператор легко отображается в команды машинных языков, такие как BEQ. При использовании goto эквивалентным представлением оператора test будет следующий код:
test condition goto else_part
Compound_2
goto continue
else_part: Compound_1
continue:... Продолжение программы...
Это менее ясно, чем условный оператор с его симметричной иерархической структурой, в особенности с учетом вложенности. Игнорируя часть from, цикл можно было бы представить как:
start: test exit_condition goto continue
Body
goto start
сontinue: ...Продолжение программы...
Поток управления включает два оператора перехода — две ветви, идущие в разных направлениях.
Рис. 7.15. Блок-схема цикла