Программирование арифметических задач на Ассемблере для микропроцессора К580
Программирование арифметических задач на Ассемблере для микропроцессора К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, познакомились с программированием в машинных кодах и мнемокодах, научились пользоваться средствами управления и клавиатурой устройств.
|