Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3.Курсовое проектирование -учебное пособие.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
757 Кб
Скачать
☆

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)

Следует обратить внимание в приведенном выше примере на использование стековой памяти для временного сохранения текущего значения счетчика, зарезервированного в аккумуляторе, на период работы подпрограммы. Данный приём используется часто для сохранения значения и других регистров общего назначения при их "нехватке" по ходу реализации сложного алгоритма.