- •Оглавление
- •Введение
- •Задание на выполнение курсового проекта
- •Необходимая справочная информация
- •1 Программирование в кодах для микроЭвм см-1800
- •1.1 Обозначения, используемые при описании команд
- •1.2 Список команд
- •1.3 Кратное описание команд
- •1.4 Коды операций команд (в порядке возрастания)
- •2 Некоторые приемы программирования в кодах
- •2.1 Перемещение данных
- •2.2 Организация цикла
- •2.3 Использование подпрограмм
- •2.4 Перекодирование информации
- •3 Эмулятор микроЭвм см-1800
- •3.1 Постановка задачи эмуляции
- •3.2 Технические данные
- •3.3 Описание программы
- •3.3.1 Главное меню
- •3.3.2 Основные окна
- •3.3.3 Дополнительные окна
- •3.4 Сообщения эмулятора
- •3.5 Характерные особенности эмулятора
- •3.6 Порядок установки и подготовка к работе
- •3.7 Системные требования
- •3.8 Справочная информация и тестирование
- •1) Соответствие клавиш стандартной клавиатуры ibm pc и оригинальной клавиатуры см-1800.
- •Пример выполнения курсового проекта
- •Задание
- •Индивидуальное задание № 28
- •Содержание
- •1 Аналитическая часть
- •1.1 Двоично-десятичное кодирование
- •1.2 Операции двоично-десятичной арифметики
- •1.3 Кодирование текстовых данных
- •2 Практическая разработка
- •2.1 Блок – схема алгоритма
- •2.2 Распределение памяти и листинг программы с комментарием
- •2.3 Результаты тестирования программы
- •3 Описание использованных при проектировании средств вычислительной техники
- •Список литературы
- •Приложение а
- •«Разработка программ преобразования форматов двоичных данных и сортировок в машинных кодах микро-эвм см-1800 с помощью эмулятора на пк»
- •Приложение б
- •Задание
- •Приложение в
- •190013, Г. Санкт-Петербург, Московский пр., д. 26
2 Некоторые приемы программирования в кодах
Ниже будут рассмотрены фрагменты программ, реализующие наиболее распространенные, часто встречающиеся приемы обработки данных. Хотя речь идет о программах в машинных кодах, мы будем пользоваться записью команд в мнемоническом изображении, принятом на языке ассемблера для данного типа микропроцессора. Кроме мнемоники кодов операций для упрощения записи вместо конкретных числовых адресов команд мы воспользуемся метками (также принятыми в языке ассемблера).
2.1 Перемещение данных
В системе машинных команд (раздел 1) отсутствуют команды перемещения байта непосредственно из одной ячейки памяти в другую. Такую пересылку приходится реализовывать несколькими командами. Усложним эту задачу условием – поменять местами содержимое двух различных ячеек памяти. Для определенности адреса обменивающихся ячеек возьмем равными 5000H и 5001H. (Буква Н здесь и далее обозначает шестнадцатеричную систему счисления, принятую для нумерации ячеек).
…
LXI H, 5000H; |
засылка адреса первого числа в пару HL |
LXI B, 5001H; |
засылка адреса второго числа в пару BC |
MOV D,M; |
копирование первого числа в регистр D |
LDAX B; |
копирование второго числа в аккумулятор |
MOV M,A; |
перемещение второго числа в ячейку 5000H |
MOV A,D; |
перезапись первого числа в аккумулятор |
STAX B; ... |
запись содержимого аккумулятора в ячейку 5001H
|
2.2 Организация цикла
Наиболее рациональный способ организации цикла (многократного повтора одного участка программы) – это создание в одном из регистров процессов счетчика, работающего на вычитание
Перед «телом» цикла счетчик загружается константой числа шагов, а в конце «тела» производится вычитание единицы (декремент) и проверка флага нулевого результата командой условного перехода. Пусть требуется просуммировать массив из 10 целых однобайтных чисел без знака записанных с адреса 5100Н.
MVI B, 0AH ; начальная загрузка счетчика В числом 10
ХRА А ; «очистка» (обнуление) аккумулятора
LXI Н, 5100Н ; засылка в пару НL адреса 1-го числа
М1: АDD М ; A + ячейка [HL] → A
INX H ; продвижение адреса HL + 1 → HL
DCR B ; уменьшение содержимого счетчика
JNZ M1 ; переход к метке М1 по флагу Z=0
HLT ; останов
2.3 Использование подпрограмм
Если в какой-либо программе требуется многократно и на разных ее участках выполнить одни и те же действия, целесообразно оформить их в виде подпрограммы. Пусть необходимо просуммировать соответствующие элементы двух массивов из пяти двухбайтных целых чисел без знака. (В младшем байте содержатся младшие разряда числа). Начальные адреса массивов слагаемых 5000Н и 5001Н, а массив сумм располагается с ячейки 5300Н.
Подпрограмма:
SB: PUSH PSW ; сохранение в стеке содержимого аккумулятора и флагов
LDАХ В ; загрузка в А младшего байта 1-го слагаемого (адрес в паре ВС)
АDD М ; сложение А с младшим байтом 2-го слагаемого (адрес в паре
;НL)
SТАХ В ; запись результата в ОЗУ по адресу из пары DЕ
INХ В ; переход по адресам
INХ Н ; к старшим частям слагаемых
INX D ; и результата
STAХ D ; загрузка в А старшего байта второго слагаемого
АDС М ; сложение старших байтов с учетом флага переноса СY
SТАХ D ; запись старшего байта результата
РОР РSW ; восстановление аккумулятора и флагов
RET ; возврат
Основная программа:
LXI SP,8000Н ; создание стека программы
LXI В,5000Н ; адрес массива 1-х слагаемых в пару ВС
LXI H,5100Н ; адрес массива 2-х слагаемых в пару НL
LXI D,5300Н ; адрес массива результатов в пару DE
МVI А,05 ; создание счетчика в А на 5 шагов
М1: САLL SВ ; вызов подпрограммы сложения
INX В ; продвижение адресов
INX H ; на следующую пару слагаемых
INX D ; и ячейку результата
DCR А ; уменьшение счётчика на 1
JNZ M1 ; возврат на М1 до исчерпания счетчика
HLT ; останов (рекомендуется выход в Монитор JMP 40h)
Следует обратить внимание в приведенном выше примере на использование стековой памяти для временного сохранения текущего значения счетчика, зарезервированного в аккумуляторе, на период работы подпрограммы. Данный приём используется часто для сохранения значения и других регистров общего назначения при их "нехватке" по ходу реализации сложного алгоритма.
