
- •«Разработка программ преобразования форматов двоичных данных и сортировок в машинных кодах микро-эвм см-1800 с помощью эмулятора на пк»
- •Задание
- •Индивидуальное задание № 17
- •Аналитическая часть.
- •Двоичная система счисления.
- •Восьмеричная система счисления.
- •Шестнадцатеричная система счисления.
- •Правила переводов десятичных чисел в них и обратно.
- •Преобразование дробных десятичных чисел в двоичные
- •Форматы хранения чисел с плавающей точкой.
- •Пример: Вещественный тип
- •Практическая разработка.
- •Описание алгоритма решения задач.
- •Блок схема.
- •2.3 Распределение памяти и листинг программы.
- •2.4 Результаты тестирования программы.
- •Выводы.
- •Список используемой литературы.
Форматы хранения чисел с плавающей точкой.
Типы значений с плавающей точкой Real, Single, Double, Extended и Comp (вещественный, с одинарной точностью, с двойной точностью, с повышенной точностью и сложный) хранятся в виде двоичного представления знака (+ или -), показателя степени и значащей части числа. Представляемое число имеет значение: +/- значащая_часть Х 2^показатель_степени где значащая часть числа представляет собой отдельный бит слева от двоичной десятичной точки (то есть 0 <= значащая часть <= 2).
Пример: Вещественный тип
Шестибайтовое (48-битовое) вещественное число (Real) подразделяется на три поля:
1 39 8
+---+------..-------+--------+
| s | f | e |
+---+------..-------+--------+
msb lsb msb lsb
Значение v числа определяется с помощью выражений:
if 0 < e <= 255, then v = (-1)^s * 2^(e-129)*(l.f).
if e = 0, then v = 0.
В схеме слева расположены старшие значащие биты, а справа - младшие значащие биты. Самое левое значение хранится в самых старших адресах. Например, для значения вещественного типа e сохраняется в первом байте, f - в следующих пяти байтах, а s - в старшем значащем бите последнего байта.
Практическая разработка.
Описание алгоритма решения задач.
Для решения поставленной задачи необходимо сравнить два числа с плавающей точкой, которые представлены в виде четырех байт.
В данной работе необходимо сравнить числа по модулю, знак в данном случае нас не интересует. Для получения модулей чисел. Проделав данную операцию, мы будем располагать двумя положительными числами, сравнение которых будет осуществлять побайтно. Вначале будут сравниваться старшие байты, рассматриваемых чисел, если они равны, будем переходить к сравнению следующих байт и т.д. В случае, когда все до последнего байта равны, то в ячейку 700016 помещаем код 00. Если же числа не равны, тогда в ячейку 700016 формируем код 01 ( левое число больше правого) или же код 02 ( правое число больше левого). В данной работе для избегания повторения одних и тех же действий с разными байтами, я использую счетчик цикла.
Распределение памяти:
L – счетчик цикла
DB,C – содержат текущий байт первого числа
D,E – содержат текущий байт второго числа
H – содержат значение текущего байта второго числа
A – содержат значение текущего байта первого числа
H,L – временное хранение значения адреса старшего байта второго числа, с последующим перемещением в пару D,E.
Блок схема.
2.3 Распределение памяти и листинг программы.
Распределение памяти:
L – счетчик цикла
B,C – содержат текущий байт первого числа
D,E – содержат текущий байт второго числа
H – содержит значение текущего второго числа
A – содержит значение текущего байта первого числа
H,L – временное хранение значения адреса старшего байта второго числа, с последующим перемещением в пару D,E
400016-адрес начала массива исходных чисел
Адрес16 |
Шестнадцатери-чный код |
Код ассемблера |
комментарии |
4000 |
31 00 80 |
LXI SP,8000 h |
Создание стека |
4003 |
01 03 50 |
LXI B,5003 h |
Загрузить в пару B,C значение адреса старшего байта второго числа |
4006 |
21 07 50 |
LXI H,5007 h |
Загрузить H,L значение адреса старшего байта второго числа |
4009 |
EB |
XCHG |
Сохранение значения адреса старшего байта второго числа в D,E |
400A |
1A |
LDAX D |
Загрузка в A значения старшего байта второго числа |
400B |
E6 7F |
ANI 7Fh |
Обнуление старшего бита, отвечающего за знак числа |
400D |
67 |
MOV H,A |
Сохранение получившегося значения в регистре H |
400E |
0A |
LDAX B |
Загрузка в A значения старшего байта первого числа |
400F |
E6 7F |
ANI 7Fh |
Обнуление старшего бита, отвечающего за знак числа |
4011 |
2E 04 |
MVI L, 04h |
Загрузка счетчика цикла значением 4 |
4013 |
BC |
CMP H |
Сравнить байты чисел (содержимое A с содержимым регистра H) |
4014 |
DA 2F 40 |
JC 402Fh |
Если второе число больше создать в регистре B значение 02h |
4017 |
C2 3B 40 |
JNZ 403Bh |
Если второе число больше создать в регистре B значение 01h |
401A |
0B |
DCX B |
Получить в паре B,C значение адреса следующего байта первого числа |
401B |
1B |
DCX D |
Получить в паре D,E значение адреса следующего байта второго числа |
401C |
1A |
LDAX D |
Загрузить в A значение следующего байта второго числа |
401D |
67 |
MOV H,A |
Сохранение значения в регистре H |
401E |
0A |
LDAX B |
Загрузить в A значение следующего байта первого числа |
401F |
2D |
DCR L |
Уменьшить значение счетчика на единицу |
4020 |
C2 13 40 |
JNZ 4013h |
Пока значение счетчика не ноль выполнять цикл |
4023 |
3E 00 |
MVI A,00h |
Числа равны записать в A значение 00h |
4025 |
32 00 70 |
STA 7000h |
Отправляем содержимое аккумулятора в ячейку 7000 |
4028 |
21 7C 30 |
LXI H,307Ch |
Загрузка в H,L адреса, начиная с которого располагается текст : «NUMBERS ARE EQUAL». |
402B |
E5 |
PUSH H |
Запись содержимого регистров H,L в стек |
402C |
C3 44 40 |
JMP 4044h |
Безусловный переход к адресу 4044h, выводу на экран результатов |
402F |
3E 02 |
MVI A,02h |
Записываем 02h в A |
4031 |
32 00 70 |
STA 7000h |
Отправляем содержимое аккумулятора в ячейку 7000h |
4034 |
21 5D 30 |
LXI H,305Dh |
Загрузка в H,L адреса, начиная с которого располагается текст: «THE SECOND MORE THAN THE FIRST». |
4037 |
E5 |
PUSH H |
Запись содержимого регистров H,L в стек |
4038 |
C3 44 40 |
JMP 4044h |
Безусловный переход к адресу 4044h, выводу на экран результатов |
403B |
3E 01 |
MVI A,01h |
Записываем 01h в A |
403D |
32 00 70 |
STA 7000h |
Отправляем содержимое аккумулятора в ячейку 7000h |
4040 |
21 3E 30 |
LXI H, 303Eh |
Загрузка в H,L адреса, начиная с которого располагается текст: «THE FIRST MORE THAN THE SECOND». |
4043 |
E5 |
PUSH H |
Запись содержимого регистров в H,L в стек |
4044 |
01 20 30 |
LXI B, 3020h |
Загрузка в B,C адреса, начиная с которого располагается текст: «INITIAL DATA». |
4047 |
CD 4C 00 |
CALL 4Ch |
Вывод текста на экран. |
404A |
CD 49 00 |
CALL 49h |
Переход на новую строку. |
404D |
21 03 50 |
LXI H, 5003h |
Загрузить в пару H,L значение адреса старшего байта первого числа |
4050 |
CD 00 41 |
CALL 4100h |
Переход к подпрограмме вывода числа на экран |
4053 |
21 07 50 |
LXI H, 5007h |
Загрузить в пару H,L значение адреса старшего байта второго числа |
4056 |
СD 00 41 |
CALL 4100h |
Переход к подпрограмме вывода числа на экран |
4059 |
С1 |
POP B |
Извлечение из стека значений в регистры B,C |
405A |
CD 4C 00 |
CALL 4Ch |
Вывод текста на экран |
405D |
CD 49 00 |
CALL 49h |
Переход на новую строку. |
4060 |
01 8E 30 |
LXI B,308Eh |
Загрузка в B,С адреса начиная с которого располагается текст: CHANGE NUMBERS? (Y/N) |
4063 |
CD 4C 00 |
CALL 4Ch |
Вывод текста на экран |
4066 |
CD 55 00 |
CALL 55h |
Ввод кода символа в A с эхом на консоль |
4069 |
D6 4E |
SUI 4Eh |
Вычитание 4Eh (Код клавиши N) из аккумулятора |
406B |
CD 49 00 |
CALL 49h |
Переход на новую строку |
406E |
CA 90 40 |
JZ 4090h |
Переход по условию Z=1, т.е нажата клавиша N |
4071 |
01 A6 30 |
LXI B,30A6h |
Загрузка в B,C адреса начиная с которого располагается текст: ENTER NUMBERS :. |
4074 |
CD 4C 00 |
CALL 4Ch |
Вывод текста на экран |
4077 |
16 08 |
MVI D,08h |
Создание счетчика D |
4079 |
21 00 50 |
LXI H, 5000h |
Загрузка в H,L адреса начиная с которого располагаются исходные числа. |
407C |
CD 67 00 |
CALL 67h |
Ввод двух шестнадцатеричных цифр в A |
407F |
77 |
MOV A, M |
Пересылка содержимого M в A |
4080 |
23 |
INX H |
Положительное приращение H,L |
4081 |
15 |
DCR D |
Отрицательное приращение регистра D |
4082 |
3E 20 |
MVI A, 20h |
Пересылка 20h (код клавиши пробел) в регистр A |
4084 |
CD 58 00 |
CALL 58h |
Вывод пробела на экран |
4087 |
C2 7C 40 |
JNZ 407Ch |
Переход по условию: Z=0, т.е не все константы введены |
408A |
CD 49 00 |
CALL 49h |
Переход на новую строку |
408D |
C3 00 40 |
JMP 4000h |
Безусловный переход кначалу программы |
4090 |
CD 40 00 |
CALL 40h |
Вход в режим ожидания ввода команды монитора. |
Подпрограмма вывода числа на экран.
4100 |
1E 04 |
MVI E,20h |
Создание счетчика в E |
4102 |
7E |
MOV A,M |
Пересылка содержимого M в А. |
4103 |
CD 61 00 |
CALL 61h |
Вывод на кран бита числа. |
4106 |
2D |
DCR L |
Отрицательное приращение регистра L , получение адресов следующего бита числа. |
4107 |
3E 20 |
MVI A,20h |
Пересылка 20h в регистр A |
4109 |
CD 58 00 |
CALL 58h |
Вывод пробела на экран |
410С |
1D |
DCR E |
Отрицательное приращение регистра E |
410D |
C2 02 41 |
JNZ 4102h |
Переход по условию Z=0 то есть не все константы введены |
4110 |
CD 49 00 |
CALL 49h |
Переход на новую строку |
4113 |
C9 |
RET |
Выход из подпрограммы |