1 Изучить приемы программирования последовательных и циклических вычислительных процессов в микропроцессорных системах (МПС), построенных на микропроцессоре (МП) К1821ВМ85А.
2 Приобрести практические навыки составления линейных и циклических программ на языке Ассемблер для МП К1821ВМ85А.
Подготовка к выполнению работы
1 Повторить по [4] систему команд микропроцессора К1821ВМ85А, форматы данных и команд, способы адресации.
2 Изучить по [4] примеры составления линейной программы инвертирования содержимого ячейки памяти и циклической программы суммирования однобайтных двоичных чисел на языке Ассемблер.
3 Подготовить ответы на вопросы для самоконтроля.
Вопросы для самоконтроля
1 Поясните, как формируется адрес следующей команды в линейных программах?
2 Поясните, как формируется адрес следующей команды в циклических программах при выполнении команд условных переходов на примере команды JC 0A10H, если условие перехода выполняется либо не выполняется?
Программирование циклических алгоритмов
3 Поясните, что понимают под способом адресации? Укажите, какие способы адресации используются в МП К1821ВМ85А и поясните их сущность?
4 Укажите выполняемую операцию, способы адресации, формат, число циклов и тактов, машинный код, а также действия МП в каждом машинном цикле для следующих команд:
а) MOV C,D; б) ANA M; в) SUB 10H;
г) MVI A, 10H; д) JNZ 0B50H; е) CALL 0950H;
е) CALL 0950H; ж) RET; з) CNC 0900H;
Порядок выполнения работы
1 Проверка подготовки учащихся к занятию по вопросам для самоконтроля в виде фронтального или программированного опроса.
2 Выполнить индивидуальное задание № 1. Составить схему алгоритма и программу линейного вычислительного процесса на языке Ассемблер для МП К1821ВМ85А, которая реализует последовательности арифметических или логических операций согласно варианту, заданному в таблице 1 (номер варианта выбирается в зависимости от номера учащегося в списке учебного журнала группы).
Таблица 1 – Исходные данные к индивидуальному заданию № 1
№ варианта | Последовательность операций | Значения операндов (P = 16) | |||||
(A) | (B) | (C) | (D) | (E) | (M1) | (M2) | |
M2 = 2((C) + (D)) – (M1) | – | – | 1A | – | – | ||
M1 = () (A) (M2) | – | – | – | – | F0 | ||
M2 = ((M1) – (A)): 2 + 05H | 15H | – | – | – | – | 25H | – |
M1 = (() (M2)) (A) | 2D | – | E1 | – | – | – | |
M2 = (D) – 2 (M1) + 10 H | – | – | – | – | – | ||
M1 = () (A) () | – | – | – | 1F | – | ||
M2 = ((C) – (A)): 4 – (M1) | – | 2D | – | – | – | ||
M1 = () ((A) (M2)) | 1E | – | – | – | – | A0 | |
M2 = 4((D) – (M1)) + (A) | 10H | – | – | 0A | – | – | |
M1 = ((B) ()) () | – | – | – | – | 2F | ||
Примечания 1 M1 – ячейка памяти по адресу 09XXH, где XX – номер по списку в учебном журнале в шестнадцатеричной системе счисления. 2 M2 – ячейка памяти по адресу 0AXXH. 3 Начальный адрес программы 08XXH. |
Паскаль с нуля [ч6]. Циклы. While, repeat-until, for.
2.1 Составить алгоритм решения задачи с учетом программной загрузки исходных данных. При составлении алгоритма следует помнить, что в МП КР51821ВМ85А умножение и деление на 2 выполняется с помощью команд циклического сдвига влево RLC и вправо RRC соответственно.
2.2 Составить программу на языке Ассемблер в виде таблицы (таблица 2).
Таблица 2 – Линейная программа на языке Ассемблер
Адрес | Метка | Команда | Операнд | Машинный код | Комментарий |
2.3 Определить ожидаемый результат вычисления. Для этого при выполнении арифметических операций следует подставить в заданное уравнение значения переменных в десятичной системе счисления и выполнить указанные арифметические операции в десятичной системе счисления. Порядок расчета и ожидаемый результат записать в отчет в десятичной и шестнадцатеричной системах счисления.
Логические операции следует выполнять в двоичной системе счисления поразрядно, при этом следует помнить, что логические операции обладают приоритетом. Порядок расчета и ожидаемый результат записать в отчет в двоичной и шестнадцатеричной системах счисления.
3 Выполнить индивидуальное задание № 2. Составить программу циклического вычислительного процесса на языке Ассемблер для МП К1821ВМ85А, которая реализует умножение двух восьмиразрядных двоичных чисел без учета знака (кодовое умножение) согласно варианту, заданному в таблице 3.
Таблица 3 – Исходные данные к индивидуальному заданию № 2
Номер варианта | Значения операндов (P = 16) | Начальный адрес программы |
(DE) | (A) | |
00A3 | B2 | |
00B4 | C3 | |
00D5 | ||
00E6 | ||
00F1 | DA | |
00D4 | ||
00B2 | ||
00C3 | 5B | |
00B3 | ||
00D2 | A3 | 080A |
Пусть множимое хранится в паре регистров DE, где оно занимает младший регистр E, старший регистр D пары регистров установлен в нуль. Множитель хранится в аккумуляторе A. 16-разрядное произведение будем формировать в паре регистров HL. Счетчик числа повторений цикла организуем на регистре B.
Процесс умножения организуем следующим образом. Будем анализировать разряды множителя, начиная с его старшего разряда. Поэтому частичные произведения будут формироваться, начиная со старшего частичного произведения. Накопление суммы частичных произведений будем производить в паре регистров HL, т.е. к содержимому предварительно сброшенной в нуль пары регистров HL вначале прибавим восьмое частичное произведение. Затем, сдвинув на один разряд влево содержимое пары регистров HL, прибавим седьмое частичное произведение и так далее, пока не будут просуммированы все частичные произведения.
Таким образом, процесс умножения носит циклический характер. Цикл, содержащий операции сдвига влево содержимого пары регистров HL, формирования и прибавления к содержимому пары регистров HL очередного частичного произведения, должен быть повторен восемь раз.
Алгоритм решения задачи представлен на рисунке 1.
Блок 1(рисунок 1) производит загрузку множимого в пару регистров DE и множителя в регистр A. Блок 2 производит загрузку нулевого значения в пару регистров HL. Блок 3 устанавливает в регистре B (счетчике циклов) начальное значение 8. Блок 4 производит сдвиг на один разряд влево содержимого пары регистров HL. Эта операция выполняется путем удвоения содержимого пары регистров: HL (HL) + (HL).
Блок 5 предназначен для анализа очередного разряда множителя. Для этого содержимое аккумулятора сдвигается влево, в результате чего очередной разряд множителя пересылается в триггер TC регистра признаков. Блок 6 производит разветвление (условный переход) по содержимому триггера TC.
При (TC) = 1 в блоке 7 выполняется операция суммирования множимого к сумме предыдущих частичных произведений в паре регистров HL. При (TC) = 0 операция суммирования не выполняется, по команде условного перехода JNC M1 осуществляется переход к команде блока 8. Блок 8 производит вычитание единицы из содержимого регистра B, после чего блок 9 выполняет условный переход по содержимому триггера TZ регистра признаков. Если (TZ) = 0 (содержимое регистра B не равно нулю), то команда условного перехода JNZ M2 производит переход к команде блока 4, вызывая очередное повторение выполнения тела цикла. Если (TZ) = 1 (содержимое регистра B равно нулю), то происходит выход из цикла и переход к очередной команде.
Рисунок 1 – Схема алгоритма кодового умножения восьмиразрядных двоичных чисел
3.1 Составить циклическую программу умножения восьмиразрядных двоичных чисел на языке Ассемблер в форме таблицы 2.
3.2 Определить время выполнения операции умножения для тактовой частоты равной 2 МГц. Для этого определить количество тактов, требуемое для однократного прохождения цикла алгоритма и полученный результат умножить на восемь. Суммарное число тактов умножить на длительность тактового периода (0,5 мкс).
4 Ответить на контрольные вопросы.
5 Оформить отчет и сдать зачет.
Содержание отчета
Отчет должен содержать:
1 Наименование и цель лабораторной работы.
2 Выполненные индивидуальные задания № 1, 2 (условия, алгоритмы и программы).
3 Расчет ожидаемого результата выполнения линейной программы.
4 Расчет времени выполнения операции умножения двух восьмиразрядных двоичных чисел.
5 Ответы на контрольные вопросы.
Контрольные вопросы
1 Поясните, как проверить переполнение разрядной сетки при выполнении операции суммирования в МП К1821ВМ85А?
2 Поясните, как умножить на два в К1821ВМ85А?
3 Поясните, как выполнить суммирование двух 16-разрядных двоичных чисел в МП К1821ВМ85А? Укажите необходимую команду и ее особенности.
Требования к знаниям и умениям учащихся
В результате выполнения лабораторной работы учащийся должен знать:
– систему команд МП К1821ВМ85А;
– приемы составления линейных и циклических программ.
Должен уметь:
– составлять линейные и циклические программы на языке Ассемблер;
– расшифровывать команды МП К1821ВМ85А;
– определять время выполнения программы.
ЛАБОРОТОРНАЯ РАБОТА № 13
Источник: cyberpedia.su
7.3. Программирование циклических структур алгоритмов
Циклическая программа – частный случай разветвляющейся программы, в которой одна из ветвей многократно повторяется. В цикл входят операторы повторяющейся ветви, составляющие тело цикла , и операторы, управляющие повторениями. В Паскале организовать циклы можно с помощью операторов If и Goto . Однако это неэффективно. В языке имеются специальные операторы, служащие для организации циклов. Это операторы For, Repeat, While .
7.3.1. Оператор цикла с параметром (оператор For)
Используется для программирования циклов с известным числом повторений. Параметром цикла называется переменная, служащая для проверки условия выполнения из цикла. Оператор For имеет формат, который представляет рисунок 7.7. 151
<Оператор_For>::= For
:=
To
Downto
Do
Рисунок 7.7 – Синтаксическая диаграмма оператора For Служебные слова в переводе с английского означают следующее: For – для, To – до в сторону увеличения, Downto – до в сторону уменьшения, Do – делать. На синтаксической диаграмме (см. рисунок 7.7) – это имя параметра цикла.
В качестве параметра может быть использована переменная любого скалярного типа, кроме вещественного (т. е переменная перенумерованного типа). – это выражения того же типа, что и параметр цикла. вычисляются один раз перед первым выполнением тела цикла. Телом цикла является . В теле цикла может быть задан только один оператор.
Если в цикле необходимо выполнить последовательность действий, используется составной оператор. указывает начальное значение параметра цикла, – конечное значение параметра цикла. Если в операторе For используется служебное слово To , то значение параметра автоматически возрастает при каждом прогоне цикла ( после выполнения тела цикла).
Возрастающее значение параметра вычисляется автоматически с помощью встроенной функции Succ , т.е. параметр принимает следующее значение типа параметра. В этом случае для выполнения тела цикла необходимо, чтобы значение было меньше или равно значению . В противном случае тело цикла не выполнится ни разу. Если в операторе For используется служебное слово Downto , то значение параметра автоматически убывает при каждом прогоне цикла ( после выполнения тела цикла). Убывающее значение параметра вычисляется автоматически с помощью встроенной функции Pred , т.е. параметр цикла принимает предыдущее значение типа параметра. В этом случае для выполнения тела цикла необходимо, чтобы значение было 152
больше или равно значению <Выражения_2>. В противном случае тело цикла не выполнится ни разу. Перед каждым выполнением тела цикла происходит сравнение текущего значения параметра с его предельным значением, определяемым . Если текущее значение меньше либо равно (в случае To ) предельного значения или больше либо равно (в случае Downto ) предельного значения, тело цикла выполняется.
Операторы тела цикла не должны изменять значение параметра цикла. При стандартном завершении выполнения цикла значение параметра цикла равно конечному значению, увеличенному на единицу, иначе – не определено. Пример 7.12. Цикл с известным количеством повторений. Вычислить для N = 10 N S = ∑ i 2 . i = 1 Program S1; Const N = 10; Var S, I: Integer; Begin S := 0; For I := 1 To N Do S := S + I * I; Writeln (S) End . Пример 7.13. Та же задача, что и в примере 7.12, но с использованием Downto в операторе For . Program S2; Const N = 10; Var S, I: Integer; 153
Begin S := 0; For I := N Downto 1 Do S := S + I * I; Writeln (S) End .
7.3.2. Оператор цикла с постусловием
Используется для программирования цикла с заранее неизвестным числом повторений, окончание которого зависит от какого-либо условия. Формат оператора представляет рисунок 7.8. На данном рисунке: Repeat – повторять, Until – до.
Тело цикла составляют операторы между Repeat и Until . Тело цикла выполняется до тех пор, пока <Логическое_выражение>принимает значение False . Как только после очередного выполнения цикла <Логическое_выражение>станет равным True, выполнение цикла прекращается. Проверка условия осуществляется каждый раз после выполнения тела цикла. Поэтому тело цикла будет выполнено по крайней мере один раз . ::= Repeat
;
< Логическое_выражение >
Рисунок 7.8 – Синтаксическая диаграмма оператора цикла с постусловием Пример 7.14. Вычислить значение функции Y = sin X через разложение функции в бесконечный ряд 154
Y = sin X = X − X 3 / 3! + X 5 / 5! − X 7 / 7! + . с точностью Eps = 0,0001 . Алгоритм решения данной задачи рассмотрен в п. 2.3.3 (см. пример 2.5). Program Sin1; Const eps = 0.0001; Var y, x : real; n : integer; vs : real; Begin Readln (x); y := x; <Начальные установки>n := 2; vs := x; Repeat vs := –vs * x * x / (2 * n – 1) / (2 * n — 2); n := n + 1; y := y + vs Until abs(vs) < eps; Writeln (x, y, eps) End. В данном примере vs – вспомогательная ячейка, служащая для вычисления очередного слагаемого, n – вспомогательная переменная для вычисления знаменателя. Цикл выполняется до первого выполнения условия abs(vs) < eps . С помощью оператора Repeat можно программировать и циклы с заданным числом повторений. Пример 7.15. Вычислить для N = 10 N S = ∑ i 2 . i = 1 Program S3; Const 155
Источник: studfile.net
Циклы for, while и do-while в С++ для новичков: 6-я часть гайда по языку программирования
Разбираемся, как сократить повторяющийся код в C++ и сэкономить время.
Евгений Кучерявый
Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Это шестая часть из серии статей «Глубокое погружение в C++». В прошлый раз мы узнали, как использовать функции и процедуры. Сейчас поговорим о циклах while, do-while и for.
Циклы — это разновидность условных конструкций. Они позволяют выполнять команды несколько раз, если определённое утверждение верно. Например, с помощью циклов можно пять раз вывести на экран какую-нибудь надпись или посчитать сумму всех чисел.
Цикл while в C++
Запись цикла while выглядит так:
Этот код выполняется следующим образом:
- Программа проверяет, верно ли утверждение.
- Выполняются инструкции в теле цикла.
- Программа возвращается к пункту 1.
То есть пока утверждение верно (i < 100),цикл будет повторять одни и те же действия. Цикл, который пять раз выводит сообщение «Hello, World!»:
Обратите внимание на переменную i — она играет роль счётчика, к которому в каждом шаге цикла прибавляется единица. Это нужно, чтобы инструкции выполнялись только определённое количество раз.
Один шаг цикла называется итерацией, а счётчик — итератором. Поэтому чаще всего для счётчика создаётся переменная i.
Важно! Следите за тем, чтобы выход из цикла был возможен, иначе он будет выполняться бесконечно.
Если внутри цикла складываются числа или что-то выводится, то нагрузка будет минимальной. Если же это какие-то ресурсозатратные вычисления, то выполнение такого цикла может заставить компьютер зависнуть.
Когда нам нужно вмешаться в работу цикла, мы используем операторы break и continue.
Оператор break
Оператор break прерывает выполнение цикла:
Компилятор умеет отличать оператор break в конструкции switch от оператора break, который прерывает циклы. Поэтому можно спокойно писать вот такой код:
Важно! Оператор break внутри конструкции switch не может прервать цикл.
Оператор continue
Иногда нам нужно пропустить одну итерацию и перейти к следующей. Для этого используем оператор continue.
Цикл do-while в C++
Цикл do-while похож на while, но он сначала выполняет одну итерацию и только потом проверяет верность утверждения:
Цикл for в C++
Если для работы цикла нужен счётчик, то его запись можно сократить с помощью цикла for, записав логику в скобки:
Вот пример такого цикла:
Вложенные циклы
Циклы, как и другие конструкции, можно размещать внутри других циклов. Вот, например, как вывести сетку с помощью for:
Важно! Операторы break и continue влияют на тот цикл, в котором они находятся, а не на родительский.
Заключение
Циклы — одни из самых часто используемых конструкций в программировании. Они нужны при чтении данных из файлов, сортировке, отрисовке графики и так далее. Одно из самых полезных применений циклов связано с массивами, о работе с которыми будет отдельная статья.
- ООП умерло? Да здравствует ООП!
- Чужой код: краткий ликбез по использованию
- Язык программирования R: ничего лишнего, только работа с данными
Источник: skillbox.ru