Программирование арифметических задач на Ассемблере для микропроцессора К580
Дон ГТУ
Лабораторная работа № 3
АКГ-05
АУТПТЭК
Программирование арифметических задач на Ассемблере для микропроцессора К580
Цель лабораторной работы - рассмотреть особенности выполнения простейших арифметических операций над целыми числами без знака на микропроцессорных установках МИКРОЛАБ КР580ИК80 и ЭЛЕКТРОНИКА-580, познакомиться с программированием в машинных кодах и мнемокодах, научиться пользоваться средствами управления и клавиатурой устройств.
1 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.1 Представление чисел
При программировании микро ЭВМ на МП БИС КР580ИК80 необходимо пользоваться способом представления чисел с фиксированной десятичной точкой. При этом знак числа и количество разрядов, занятых дробной частью числа, могут быть учтены при подготовке данных или программным путем.
Следует помнить, что коды команд, адреса и данные вводятся в микро ЭВМ числами в шестнадцатеричной системе счисления. Некоторой особенностью в лабораторных установках МИКРОЛАБ и ЭЛЕКТРОНИКА-580 является отображение чисел на дисплее (табл. I).
Для МП БИС КР580ИК80 можно представлять данные в виде двоично-десятичного числа, при этом каждый байт рассматривается как две тетрады (два полубайта), а каждая тетрада кодирует одну десятичную цифру.
Такое представление позволяет закодировать в одном байте десятичные числа от 0 до 99. Обратите внимание на то, что, используя для представления шестнадцатеричную систему счисления, в одном байте можно закодировать число от 0 до FF , что соответствует числам десятичной системы от 0 до 255.
Эти примеры показывают, что такое представление чисел более рационально: используется меньший объем памяти, сокращается программа.
Таблица 1- Представление чисел в различных системах счисления и отображение их на дисплее
Десятичная система счисления |
Восьмеричная система счисления |
Двоичная система счисления (по тетрадам) |
Шестнадцате-ричная система счисления |
Символы на дисплее |
0 |
0 |
0000 |
0 |
0 |
1 |
1 |
0001 |
1 |
1 |
2 |
2 |
0010 |
2 |
2 |
3 |
3 |
0011 |
3 |
3 |
4 |
4 |
0100 |
4 |
4 |
5 |
5 |
0101 |
5 |
5 |
6 |
6 |
0110 |
6 |
6 |
7 |
7 |
0111 |
7 |
7 |
8 |
10 |
1000 |
8 |
8 |
9 |
11 |
1001 |
9 |
9 |
10 |
12 |
1010 |
А |
А |
11 |
13 |
1011 |
В |
B |
12 |
14 |
1100 |
С |
С |
13 |
15 |
1101 |
D |
D |
14 |
16 |
1110 |
Е |
E |
15 |
17 |
1111 |
F |
F |
1.2 Арифметические команды
Основной арифметической функцией является сложение двух чисел. Команда, имеющая мнемокод ADD Rд, складывает данные регистра Rд и аккумулятора (регистра А) и результат сложения запоминает в аккумуляторе.
- CARRY - регистра признаков. Разряд (флаг) переноса играет большую роль при выполнении микропроцессором арифметических операций и работает девятым разрядом аккумулятора. По флагу командами IC и INC можно осуществить переход. Применяется он так же при сложении чисел длиннее восьми разрядов, выполняя функции связи между двумя байтами записи числа.
О состоянии флага переноса, как и других флагов регистра признаков в МИКРОЛАБе может сообщить ячейка памяти с адресом 83ЕА, где флаги записываются в последовательности, приведенной на рисунке 1.1.
В «ЭЛЕКТР0НИКЕ-580» разряд С высвечивается на панели установки.
Рисунок 1.1 - Флаги № ШС КР580ИКБ0
Вычитание содержимого регистра Rд из содержимого аккумулятора производит команда sub> Rд. Например, команда sub> B вычитает из аккумулятора данные регистра В.
Команда вычитания использует флаг переноса как разряд заема. Если флаг переноса устанавливается после команды sub> Rд, значит, число в регистре Rд больше, чем в аккумуляторе.
После выполнения команды sub> Rд результат остается в аккумуляторе, вызов содержимого которого на индикатор регистра данных осуществляется адресом 83ЕВ в "МИКРОЛАБе" и клавишами REC, А в "ЗЛЕКТРОНИКЕ-580".
1.3 Программа сложения двух однобайтных чисел X и У
Задача состоит в том, чтобы, выполнив занесение однобайтных чисел в регистры А и Rд, сложить их и поместить результат сложения в аккумулятор.
Задайтесь числовыми значениями Х = 38, Y = А3 и начальным адресом программы, приняв его равным 8200.
Обратите внимание на то, что все приведенные числа записаны в шестнадцатеричной системе счисления.
Включите лабораторную установку и, пользуясь листингом программы, приведенным в табл. 2, запишите в память ЭВМ по указанным адресам коды команд.
Таблица 1.2 - Программа PRG 1 сложения двух однобайтных чисел
Адрес |
Код команды |
Метка |
Мнемокод |
Комментарий |
8200 |
AF |
PRG 1: |
ХRА А |
Очистить аккумулятор |
8201 |
ЗЕ |
MVI A, 38 |
Записать в аккумулятор |
|
8202 |
38 |
число X |
||
8203 |
06 |
MVI B, A3 |
Записать в регистр В |
|
8204 |
A3 |
число У |
||
8205 |
80 |
ADD 8 |
Сложить X и Y |
|
8206 |
E7 |
RST 7 |
Прервать выполнение программы |
Выполнив запись программы, установите начальный адрес и запустите программу. После её исполнения на дисплее установится запись: 8207 DB_ _, показывающая результат вычисления DB по адресу 8207.
Для получения разности двух чисел X и Y можно использовать программу PRG 1, заменив в ней по адресу 8205 код команды 80 (ADD B) кодом 90 (sub> В) команды вычитания содержимого регистра В из содержимого аккумулятора, разместив предварительно в регистрах В и А соответственно вычитаемое и уменьшаемое. Разность будет записана в аккумуляторе.
1.4 Сложение массива однобайтных чисел
Массив однобайтных шестнадцатеричных чисел, например, 31, АВ, 86, разместите в последовательных адресах памяти, например, 8250, 8251, 8252, 8253.
В качестве входных параметров для выполнения программы необходимо иметь адрес первого слагаемого, например, 8250, записанный в регистрах H, L, и число слагаемых - в регистре С. Выходным параметром будет являться сумма, старший байт которой записан в регистре В, а младший байт - в аккумуляторе.
Таблица 1.3 – Программа PRG 2 сложения массива однобайтных чисел
Адрес |
Код команды |
Метка |
Мнемоника |
Комментарий |
8200 8201 8202 |
21 50 82 |
PRG 2: |
LXI H,8250 |
Загрузить в регистры HL, адрес первого слагаемого |
8203 8204 |
0E 04 |
MVI C, 04 |
Загрузить в регистр С количество слагаемых |
|
8205 |
AF |
XRA A |
Очистить аккумулятор |
|
8206 |
47 |
MOV B, A |
Очистить регистр В |
|
8207 |
86 |
M1: |
ADD M |
Прибавить к содержимому аккумулятора число из массива слагаемых |
8208 8209 820А |
D2 0D 82 |
INC M2 |
Если переноса нет, то идти на М2 |
|
820В 820С |
04 B7 |
INR B ORA A |
Увеличить содержимое регистра В на I Очистить флаг переноса |
|
820D |
23 |
M2: |
INX H |
Указать на следующий адрес слагаемого |
820E |
0D |
DCR C |
Уменьшить содержимое регистра С на I |
|
820F 8210 8211 |
C2 07 82 |
INZ |
Если не все слагаемые, то идти на MI |
|
8212 |
FF |
RST 7 |
Прервать выполнение программы |
Выполнение программы с именем PRG 2 начинается с команды загрузки регистровой пары HL, 16-битным числом 8250 (адрес первого слагаемого). После выполнения второй команды (адреса 820З, 8204) в регистре С запишется число 4 (число слагаемых). Командами 8205 и 8206 производится обнуление регистров А, В и регистра признаков.
Командой 8207 с меткой MI начинается первый цикл этапа суммирования. В результате выполнения этой команды в регистр А заносится первое слагаемое (число 31) по адресу 8250, записанное в регистровой паре HL.
Так как переполнения аккумулятора нет, по команде 8208 осуществляется переход на метку М2 (адрес команды 820С), и к содержимому регистровой пары HL прибавляется I. Теперь здесь записан адрес 8251 второго слагаемого.
После выполнения команды 820Е число слагаемых (содержимое регистра С) становится равным 3 и по команде 820F осуществляется переход на MI- начало следующего цикла этапа суммирования.
Во втором цикле в регистр А записывается сумма DC чисел 31 и АВ, флаг переноса не устанавливается, уменьшается число слагаемых регистра С до 2.
В третьем цикле в аккумулятор записывается 62 (младший байт суммы чисел DC и 86) и устанавливается флаг переноса С. По команде 8208 осуществляется переход по адресу 820В и в регистр В записывается I. Содержимое регистровой пары HL равно 8253, содержимое регистра С – I.
В четвертом цикле после выполнения команды 8207 в аккумулятор записывается 56, флаг переноса установлен, содержимое регистра В равно 2.
По команде 820(Е) содержимое регистра С становится равным 0, и команда 820F передает управление адресу 8212 - конец выполнения программы.
1.5 Вычитание одинаковых по длине чисел
Рассмотрите программу получения разности двух чисел X и Y, имеющих одинаковую длину. Листинг программы приведен в табл. 1.4.
Входными параметрами программы будут являться: длина чисел в байтах, записанная в регистре В, адрес младшего байта вычитаемого - в регистровой паре HL, адрес младшего байта уменьшаемого - в регистровой паре DE . Результат вычисления заносится в область памяти, отведенную под вычитаемое.
Положим X = А304 и Y = 7E2I,
B области памяти записывается по адресам
8250 - 04 (младший байт уменьшаемого);
8251 - A3 (старший байт уменьшаемого);
8252 - 21 (младший байт вычитаемого);
8253 – 7E (старший байт вычитаемого).
В регистре B записано 2 - длина чисел X и Y в байтах.
Таблица 1.4 – Программа PRG 3 вычитание чисел
Адрес |
Код команды |
Метка |
Мнемоника |
Комментарий |
8200 8201 |
06 02 |
PRG 3: |
MVI B, 02 |
Загрузить счетчик длины числа |
8202 8203 8204 |
I I 50 82 |
LXI D, X |
Загрузить в регистры D, E адрес младшего байта уменьшаемого |
|
8205 8206 8207 |
21 52 C2 |
LXI M, V |
Загрузить в регистры H, L адрес младшего байта вычитаемого |
|
8208 |
AF |
XRA A |
Очистить аккумулятор |
|
8209 |
IA |
M1: |
LDAX D |
Загрузить в аккумулятор уменьшаемое |
820A |
9E |
SBB M |
Вычесть из содержимого аккумулятора вычитаемое |
|
820В |
77 |
MOV M, A |
Записать разность на место вычитаемого |
|
820C |
I3 |
INX D |
Указать на следующий байт уменьшаемого |
|
820D |
23 |
INX H |
Указать на следующий байт вычитаемого |
|
820E |
05 |
DCR B |
Уменьшить содержимое счетчика длины числа |
|
820F 8210 8211 |
02 09 82 |
INZ M1 |
Если не последний (старший) байт, то идти на MI |
|
8212 |
FF |
RST 7 |
Прервать выполнение программы |
Обратите внимание на то, что по адресу 820А записана команда SBB. Она отличается от аналогичной команда sub> М тем, что из содержимого аккумулятора вычитается не только число, записанное в ячейке М по адресу, хранящемуся в регистровой паре HL, но и значение займа. Итоговое значение займа в результате выполнения операции фиксируется в разряде переноса регистра признаков.
1.6 Сложение многобайтовых десятичных чисел
В табл. 1.5 приведен листинг программы сложения чисел, представляемых в МП БИС КР580ИК80 в виде двоично-десятичных чисел. Так как такое представление чисел требует от ЭВМ преобразования данных, в программу необходимо ввести оператор DAA, который выполняет коррекцию результата операции по следующим правилам:
если значение младших 4 бит аккумулятора больше девяти или если признак дополнительного переноса АС равен I, то к содержимому аккумулятора добавляется число 6;
если значение старших 4 бит аккумулятора больше девяти или если признак переноса С равен I, то к содержимому старших 4 бит аккумулятора добавляется число 6.
Заметьте, что в предлагаемой программе, как и в предыдущей, рассматриваются числа с длиной больше машинного слова. Поэтому операции с такими числами МП БИС проводят по байтам, начиная с младших байтов.
Рассмотрите программу с именем PRG 4 для слагаемого Х=3045, размещенного побайтно в ячейках памяти 8050 и 8051, и слагаемого Y = 2071 - в ячейки памяти 8052 и 8053. Результат сложения размещается в ячейках, отведенных для второго слагаемого.
После выполнения программы вызовите последовательно ячейки 8053 и 8052 и запишите их содержимое. Это результат решения. Он должен быть равен десятичному числу 5116.
Таблица 1.5 - Программа PRG 4 сложения двух десятичных чисел
Адрес |
Код команды |
Метка |
Мнемоника |
Комментарий |
8200 8201 8202 |
21 50 82 |
PRG 4: |
LXI H, X |
Загрузить в регистры младшие два разряда числа Х |
8203 8204 8205 |
I I 52 80 |
LXI D, Y |
Загрузить в регистры младшие два разряда числа Y |
|
8206 |
AF |
XRA A |
Очистить аккумулятор |
|
8207 8208 |
0E 02 |
MVI C, 02 |
Загрузить счетчик числа байтов |
|
8209 |
IA |
M1: |
LDAX D |
Загрузить в аккумулятор два разряда числа Y |
820A |
8E |
ADC M |
Прибавить к содержимому аккумулятора два разряда числа Х с учетом переноса |
|
820В |
27 |
DAA |
Преобразовать результат в десятичный код |
|
820C |
12 |
STAX D |
Передать результат в ячейку памяти, адресуемой регистровой парой DE |
|
820D |
13 |
INX D |
Указать на адрес следующих двух разрядов числе Y |
|
820E |
23 |
INX H |
Указать на адрес следующих двух разрядов числе Х |
|
820F |
OD |
DCR C |
Уменьшить содержимое счетчика числа байтов |
|
8210 8211 8212 |
C2 09 82 |
INZ M1 |
Если не последний (старший) байт, то идти на MI |
|
8213 |
FF |
RST 7 |
Прервать выполнение программы |
2 ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ
2.1 Выполним программу получения суммы двух чисел
X=A+B, имеющих одинаковую длину. Листинг программы приведен в таблице 2.1.
A= B=
Результат сложения заносится в область памяти, отведенную под второе слагаемое.
В области памяти записывается по адресам
8250 – 87 (младший байт первого слагаемого)
8251 – 35 (старший байт первого слагаемого)
8252 – 87 (младший байт второго слагаемого)
8253 – 02 (старший байт второго слагаемого)
Таблица 2.1 – Программа сложения массива однобайтных чисел
Адрес |
Код команды |
Метка |
Мнемоника |
Комментарий |
8200 8201 8202 |
21 50 82 |
PRG 1: |
LXI H, X |
Загрузить в регистры младшие два разряда числа А |
8203 8204 8205 |
11 52 80 |
LXI D, Y |
Загрузить в регистры младшие два разряда числа В |
|
8206 |
AF |
XRA A |
Очистить аккумулятор |
|
8207 8208 |
OE 02 |
MVI C, 02 |
Загрузить счетчик числа байтов |
|
8209 |
1A |
M1: |
LDAX D |
Загрузить в аккумулятор два разряда числа А |
820А |
8E |
ADC M |
Прибавить к содержимому акумулятора два разряда числа В с учетом переноса |
|
820В |
27 |
DAA |
Преобразовать результат в десятичный код |
|
820C |
12 |
STAX D |
Передать результат в ячейку памяти, адресуемой регистровой парой DE |
|
820D |
13 |
INX D |
Указать на адрес следующих двух разрядов числа В |
|
820E |
23 |
INX H |
Указать на адрес следующих двух разрядов числа А |
|
820F |
OD |
DCR C |
Уменьшить содержимое счетчика числа байтов |
|
8210 8211 8212 |
C2 09 82 |
INZ M1 |
Если не последний (старший) байт, то идти на МI |
|
8213 |
E7 |
RST 7 |
Прервать выполнение программы |
2.2 Выполним программу получения разности двух чисел C и D
Листинг программы приведен в таблице 2.2.
Входными параметрами программы будут являться: длина чисел в байтах, записанная в регистре В, адрес младшего байта вычитаемого – в регистровой паре HL, адрес младшего байта уменьшаемого – в регистровой паре DE. Результат вычисления заносится в область памяти, отведенную под вычитаемое. C=, D=. В регистре В записано 2 – длина чисел C и D в байтах. В области памяти записывается по адресам
8250 – Е1 (младший байт уменьшаемого);
8251 – 37 (старший байт уменьшаемого);
8252 – 75 (младший байт вычитаемого);
8253 – 08 (старший байт вычитаемого);
В регистре В записано 2 – длина чисел C и D в байтах.
Таблица 1.4 – Программа PRG 2 вычитание чисел
Адрес |
Код команды |
Метка |
Мнемоника |
Комментарий |
8200 8201 |
06 02 |
PRG 2: |
MVI B, 02 |
Загрузить счетчик длины числа |
8202 8203 8204 |
I I 50 82 |
LXI D, X |
Загрузить в регистры D, E адрес младшего байта уменьшаемого |
|
8205 8206 8207 |
21 52 C2 |
LXI M, V |
Загрузить в регистры H, L адрес младшего байта вычитаемого |
|
8208 |
AF |
XRA A |
Очистить аккумулятор |
|
8209 |
IA |
M1: |
LDAX D |
Загрузить в аккумулятор уменьшаемое |
820A |
9E |
SBB M |
Вычесть из содержимого аккумулятора вычитаемое |
|
820В |
77 |
MOV M, A |
Записать разность на место вычитаемого |
|
820C |
I3 |
INX D |
Указать на следующий байт уменьшаемого |
|
820D |
23 |
INX H |
Указать на следующий байт вычитаемого |
|
820E |
05 |
DCR B |
Уменьшить содержимое счетчика длины числа |
|
820F 8210 8211 |
02 09 82 |
INZ M1 |
Если не последний (старший) байт, то идти на MI |
|
8212 |
Е7 |
RST 7 |
Прервать выполнение программы |
ВЫВОД
В ходе лабораторной работы рассмотрели особенности выполнения простейших арифметических операций над целыми числами без знака на микропроцессорных установках МИКРОЛАБ КР580ИК80 и ЭЛЕКТРОНИКА -580, познакомились с программированием в машинных кодах и мнемокодах, научились пользоваться средствами управления и клавиатурой устройств.