- •Министерство образования Российской Федерации
- •Самарский государственный технический университет
- •2. Оформление курсового проекта
- •3. Описание вариантов заданий
- •Перечень операций подлежащих программированию
- •4. Архитектура микропроцессоров
- •4.1. Микрокомпьютер
- •4.2. Структура микропроцессора
- •4.3. Блок управления и синхронизации
- •4.4. Система команд
- •4.4.1. Фаза выборки и дешифрации
- •Обозначения, используемые при описании команд,
- •Команды передач управления
- •Команды обращения к подпрограммам
- •Арифметические и логические команды
- •Команды ввода/вывода
- •Специальные команды
- •4.4.2. Фаза выполнения
- •Команды пересылки
- •Команды с непосредственным адресом
- •Команды обращения к памяти
- •Команды передачи управления
- •Команды обращения к подпрограммам
- •Арифметические и логические команды
- •Команды ввода/вывода
- •Специальные команды
- •4.5. Способы адресации
- •Прямая адресация
- •Непосредственная адресация
- •Индексная адресация
- •Косвенная адресация
- •Относительная адресация
- •Страничная адресация
- •4.6. Некоторые другие команды, специфичные для микропроцессоров
- •Арифметические и логические команды с операндами в главной памяти
- •Команды условных переходов
- •Команды обработки данных
- •5. Программирование для микропроцессоров
- •5.1. Программирование на машинном языке
- •Пример программы: «прибавить константу к числу в памяти и записать результат снова в память»
- •5.2. Разветвления в программах
- •5.3. Программирование циклов
- •Программа вычисления суммы десяти 8-битовых чисел без знаков
- •5.4. Программирование сложных разветвлений
- •Программа сложного разветвления, использующая таблицу переходов
- •5.5. Подпрограммы
- •Вход в подпрограмму и выход из подпрограммы
- •Параметры подпрограммы
- •Пример передачи параметров от главной программы в подпрограмму через общие регистры
- •Сложение с п-кратной точностью
- •Подпрограмма сложения чисел с двойной точностью
- •Умножение
- •5.6. Загрузка программ
- •Подпрограмма умножения целых положительных чисел Распределение общих регистров: r2: счетчик, r3: множимое y, r4: множитель X, r5: ст. Часть произведения Рн, r6:мл. Часть произведения pl
- •80 (Маска)
- •Программа-загрузчик
- •5.7. Программирование на языке ассемблера
- •Ассемблеры
- •Язык ассемблера
- •Программа на языке ассемблера, соответствующая программе табл. 5.3
- •Директивы ассемблера
- •Макрокоманда
- •Список команд иллюстрированного микропроцессора
- •Список команд иллюстративного микропроцессора
- •Условные графические обозначения в схемах
- •Продолжение Приложение п3
- •Продолжение Приложение п3
- •Продолжение Приложение п3
- •Список литературы
- •Содержание и объем курсового проекта …………………………….
- •Оформление курсового проекта ……………………………………...
- •Продолжение Приложение п2
- •Продолжение Приложение п2
- •Продолжение Приложение п2
- •Продолжение Приложение п2
- •Приложение п2
- •Приложение п2
- •Список литературы
5.3. Программирование циклов
Цикл в программе — это средство, позволяющее с помощью одной и той же последовательности команд выполнить какие-то действия много раз. В общем случае цикл — это группа команд, выполнение которых многократно повторяется за счет того, что в этой группе есть команда, возвращающая управление снова и снова на первую команду в группе, пока не выполнится некоторое условие окончания цикла. Способность выполнять циклы является одним из фундаментальных свойств ЭВМ. Благодаря циклам можно пользоваться командами по несколько раз, не дублируя их в памяти, тем самым сокращается размер программы.
Чтобы пояснить основную идею, рассмотрим задачу вычисления суммы N чисел. Для ее решения нужно последовательно прибавлять каждое число к текущей частной сумме. Можно в принципе написать программу, в которой для прибавления каждого числа будет использоваться своя отдельная последовательность команд. Однако, при больших N разумнее написать программу в виде цикла. Вместо того чтобы иметь N последовательностей команд прибавления, в цикле будет одна последовательность, выполнение которой повторится N раз. При этом, конечно, нужно подсчитывать число уже сделанных повторений, для того чтобы процесс своевременно закончился.
В качестве счетчика можно использовать регистр, начальное состояние которого нужно установить до первого повторения (до начала итераций) и затем проверять (тестировать) и модифицировать при каждой новой итерации. Следующая проблема — обеспечить при каждом прохождении цикла выборку следующего прибавляемого числа. Если предположить, что числа размещены в последовательных ячейках главной памяти, требуемую выборку можно осуществить при помощи указателя, который будет изменяться при каждой итерации.
В циклической программе можно выделить инициализирующую часть, предшествующую циклу, его рабочую часть, тест конца цикла и модифицирующую часть. Эти части можно видеть в программе вычисления суммы — табл. 5.3.
Таблица 5.3
Программа вычисления суммы десяти 8-битовых чисел без знаков
Ячейка памяти |
Команда на машинном языке |
Команда в символической форме |
Комментарий |
0000 |
61 |
LRI 1 |
Установка в регистрах Н и L адреса |
0001 |
00 |
00 |
первого числа |
0002 |
62 |
LRI 2 |
|
0003 |
15 |
15 |
|
0004 |
63 |
LRI 3 |
Установка начального значения |
0005 |
0А |
0А |
счетчика цикла равным 10 |
0006 |
64 |
LRI 4 |
Установка частной суммы равной 0 |
0007 |
00 |
00 |
|
0008 |
65 |
LRI 5 |
Загрузка константы 1 для |
0009 |
01 |
01 |
уменьшения счетчика |
000А |
14 |
MOV 0 from 4 |
Прибавление очередного числа |
000В |
8F |
ADD F |
|
000С |
04 |
MOV 0 to 4 |
|
000D |
F5 |
IHL |
Увеличение Н и L |
000Е |
13 |
MOV 0 from 3 |
Уменьшение счетчика |
000F |
А5 |
SUB 5 |
|
0010 |
03 |
MOV 0 to 3 |
|
0011 |
7D |
JAN |
Проверка конца цикла |
0012 |
00 |
00 |
|
0013 |
0А |
0A |
|
0014 |
FA |
HLT |
|
0015 |
|
ЧИСЛО1 |
Суммируемые числа |
0016 |
|
ЧИСЛО2 * |
|
. . .
|
|
. . .
|
|
001Е |
|
ЧИСЛ010 |
|
Суммируется содержимое последовательных ячеек. Первые пять команд составляют инициализирующую часть. Общие регистры Н и L используются в качестве 16-битового указателя, содержащего адрес очередного прибавляемого числа.
Первые две команды заносят в Н и L адрес первого числа. Затем в регистр 3 помещается начальное значение, равное 10. Регистр 3 будет выполнять функции счетчика количества суммируемых чисел, которые программе еще предстоит обработать. Сумма накапливается в общем регистре 4. Четвертая команда в программе устанавливает в нем нулевое начальное значение. Наконец, в общий регистр 5 загружается константа 1, которая будет вычитаться из счетчика в процессе суммирования чисел.
Следующие три команды составляют рабочую часть цикла. Сначала текущая частная сумма передается в аккумулятор из регистра 4. Далее следует команда сложения ADD F, содержащая специальный указатель F, который на самом деле соответствует ячейке главной памяти с адресом в паре регистров Н и L. Содержимое этой ячейки прибавляется к частной сумме в аккумуляторе. После этого результат передается в общий регистр 4.
Остальные команды программы служат для тестирования конца цикла и модификации. Сначала команда IHL модифицирует регистры Н и L, так, чтобы они содержали адрес данных, которые должны обрабатываться при следующей итерации. Затем содержимое счетчика цикла передается в аккумулятор, уменьшается на 1 и снова возвращается в регистр 3. Поскольку значение счетчика осталось также в аккумуляторе, его можно использовать для проверки, нужно ли продолжать итерации или вычисления завершены. Счетчик показывает число еще не прибавленных чисел. Следовательно, когда вычисления завершаются, в аккумуляторе будет 0. Это условие тестируется командой «условный переход при ненулевом аккумуляторе». Если в аккумуляторе 0, тогда переход не происходит, и программа выходит на команду останова, в противном случае выполняется следующая итерация.
Обратите внимание, в описанной программе по команде ADD F вполне можно получить сумму, превышающую емкость аккумулятора, т. е. частная сумма может занять 9 разрядов. Это и есть переполнение, о котором мы уже упоминали. Ясно, что если переполнение может возникнуть, то оно должно детектироваться (в рассматриваемом случае при переполнении после выполнения команды ADD F окажется установленным в 1 триггер переноса), и нужно иметь возможность работать с суммами, занимающими более 1 байта. Обычно в подобных задачах применяется процедура сложения «с двойной», «тройной» или большей «точностью».