Смекни!
smekni.com

Разработка программ преобразования форматов двоичных данных и сортировок в машинных кодах микро- (стр. 2 из 3)

Форма с плавающей точкой использует представление вещественного числа А в виде произведения мантиссы m на основание системы счисления q в некоторой целой степени p, которую называют порядком:

А=m x q^p

Например, число 128 можно записать в виде: 0,0000000128 х 10^10. Здесь m=0,0000000128 – мантисса, p=10 – порядок. Порядок указывает, на какое количество позиций и в каком направлении должна «переплыть», т.е. сместиться десятичная в мантиссе. Отсюда название «плавающая точка». Однако справедливы и следующие равенства:

12,8 х 10 = 1,28 x 10^2 = 0,128 x 10^3 = 1280 x 10^(-1)

Получается, что представление числа в форме с плавающей точкой неоднозначно? Чтобы не было неоднозначности, в ЭВМ используют нормализованное представление числа в форме с плавающей точкой. Мантисса в нормализованном представлении должна удовлетворять условию:

0.1q £m< 1q ,

то есть мантисса меньше единицы и первая значащая цифра - не ноль. Следовательно, для рассмотренного числа нормализованным представлением будет: 0,0000000128 x 10^10.

В разных типах ЭВМ применяются различные варианты представления чисел в форме с плавающей точкой. Для примера рассмотрим один из возможных.

Пусть в памяти компьютера вещественное число представляется в форме с плавающей точкой в двоичной системе счисления (q=2) и занимает ячейку размером 4 байта. В ячейке должна содержаться следующая информация о числе: знак числа, порядок и значащие цифры мантиссы. Вот как эта информация располагается в ячейке:

± маш. порядок МАН ТИС СА
1-й байт 2-й байт 3-й байт 4-й байт

В старшем бите 1-го байта хранится знак числа. В этом разряде 0 обозначает плюс, 1 – минус. Оставшиеся 7 бит первого байта содержат машинный порядок. В следующих трех байтах хранятся значащие цифры мантиссы.

Что такое машинный порядок? В семи двоичных разрядах помещаются двоичные числа в диапазоне от 0000000 до 1111111. В десятичной системе это соответствует диапазону от 0 до 127. Всего 128 значений. Знак порядка в ячейке не хранится. Но порядок, очевидно, может быть как положительным, так и отрицательным. Разумно эти 128 значений разделить поровну между положительными и отрицательными значениями порядка. В таком случае между машинным порядком и истинным (назовем его математическим) устанавливается следующее соответствие:

Машинный порядок 0 1 2 3 64 65 125 126 127
Математический порядок -64 -63 -62 -61 0 1 61 61 63

Если обозначить машинный порядок Мq, а математический q, то связь между ними выразится формулой:

Мq = q + 64

Итак, машинный порядок смещен относительно математического на 64 единицы и имеет только положительные значения. Полученная формула записана в десятичной системе счисления. В двоичной системе счисления формула имеет вид:

Мq = q + 10000002

При выполнении вычислений с плавающей точкой процессор это смещение учитывает.

Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

1) Перевести модуль данного числа в двоичную систему счисления;

2) Записать полученное двоичное число в нормализованном виде;

3) Определить машинный порядок с учетом смещения;

4) Учитывая знак заданного числа (0 – положительное; 1 – отрицательное), записать его представление в памяти ЭВМ.

2 Практическая разработка

2.1Блок-схема алгоритма

Основная программа

2.2 Распределение памяти и листинг программы

Распределение программы

Е – Счетчик цикла

H,L –Текущий байт первого числа

B,C – Текущий байт второго числа

Листинг программы

Адрес 16-ричный код Код Ассемблера Комментарии
4000 30 00 80 LXI SP, 8000h Создание стека
4003 21 00 50 LXI H, 5000h Получение начального адреса чисел
4006 01 00 41 LXI B, 4100h Запись в регистры ВС адреса, по которому записано первое сообщение
4009 CD 4F 00 CALL 4Fh Вывод сообщения «Pervoechislo» на Монитор
400С 1E 05 MVI E, 05h Создание счетчика на 4 шага
400Е 1D DCR E Вычитание единицы из значения счетчика
400F CA 1A 40 JZ 401Ah Выход из цикла
4012 CD 67 00 CALL 67h Ввод одного байта числа в аккумулятор
4015 77 MOV M,A Копирование байта из аккумулятора в соответствующую ячейку памяти
4016 2C INR L Переход к следующему адресу
4017 C3 0E 40 JMP 400Eh Переход на начало цикла
401A CD 49 00 CALL 49h Переход на новую строку
401D 01 25 41 LXI B, 4125h Запись в регистры ВС адреса, по которому записано второе сообщение
4020 CD 4F 00 CALL 4Fh Вывод сообщения «Vtoroechislo» на Монитор
4023 1E 05 MVI E, 05h Создание счетчика на 4 шага
4025 1D DCR E Вычитание единиц из значения счетчика
4026 CA 34 40 JZ 4034h Выход из цикла(2 число введено)
4029 CD 67 00 CALL 67h Ввод одного байта числа в аккумулятор
402C 77 MOV M,A Копирование байта из аккумулятора в соответствующую ячейку памяти
402D 2C INR L Переход к следующему адресу
402E C3 25 40 JMP 4025h Переход на начало цикла
4031 CD 49 00 CALL 49h Переход на новую строку
4034 21 03 50 LXI H, 5003h Запись в пару HL адреса 4 байта 1 константы
4037 01 07 50 LXI B, 5007h Запись в пару HL адреса 4 байта 2 константы
403A 11 03 50 LXI D, 5003h Запись в пару HL адреса 4 байта 1 константы
403D 1A LDAX D Копирование в аккумулятор 4 байта 1 константы
403E E6 7F ANI 7Fh Установка модуля на 1 число (Умножение на 7Fh)
4040 77 MOV M,A Запись измененного 4 байта 1 числа на аккумулятор в память
4041 0A LDAX B Копирование в аккумулятор 4 байта 2 константы
4042 E6 7F ANI 7Fh Установка модуля на 2 число (Умножение на 7Fh)
4044 BE CMP M Сравнение 4 байта двух чисел(вычитание из второго числа первое)
4045 DA 71 40 JC 4071h Переход на адрес 4071h (если байт первого числа больше байта второго(су=1))
4048 C2 82 40 JNZ 4082h Переход на адрес 4082h(если байт второго числа больше байта первого(су=1)),если нет перехода байты равны
404B 2B DCX H Уменьшение адреса байта первого числа
404C 0B DCX B Уменьшение адреса байта второго числа
404D 1E 04 MVI E, 04h Создание цикла на 3 шага
404F 1D DCR E Вычитание единицы из значения счетчика
4050 CA 60 40 JZ 4060h Выход из цикла(числа равны)
4053 0A LDAX B Копирование в аккумулятор байта 2 константы
4054 BE CMP M Сравнение байта двух чисел(вычитание из второго числа первое)
4055 DA 71 40 JC 4071h Переход на адрес 4071h(если байт первого числа больше байта второго)
4058 C2 82 40 JNZ 4082h Переход на адрес 4082h(если байт второго числа больше байта первого),если нет перехода,то байты равны
405B 0B DCX B Уменьшение адреса байта первого числа
405C 2B DCX H Уменьшение адреса байта второго числа
405D C3 4F 40 JMP 404Fh Переход на начало цикла
4060 21 00 60 LXI H, 6000h Занесение в пару HL адрес ячейки, в которой нужно записать результат
4063 36 00 MVI M, 00h Запись в ячейку памяти значения 00h( числа равны)
4065 CD 49 00 CALL 49h Переход на новую строку
4068 01 75 42 LXI B, 4275h Запись в регистры ВС адреса, по которому записано сообщение «Chislaravni»
406B CD 4F 00 CALL 4Fh Вывод сообщения «Chislaravni» на экран
406E C3 93 40 JMP 4093h Переход на конец программы(по адресу 4093h)
4071 21 00 60 LXI B, 6000h Занесение в пару HL адреса ячейки, в которой нужно записать результат
4074 36 01 MVI M, 01h Запись в ячейку памяти значения 01h (первое число больше второго)
4076 CD 49 00 CALL 49h Переход на новую строку
4079 01 75 41 LXI B, 4175h Запись в регистры ВС адреса, по которому записано сообщение «Pervoechislobolshevtorogo»
407C CD 4F 00 CALL 4Fh Выводсообщения «Pervoe chislo bolshe vtorogo» наэкран
407F C3 93 40 JMP 4093h Переход на конец программы(по адресу 4093h)
4082 21 00 60 LXI H, 6000h Занесение в пару HL адреса ячейки, в которой нужно записать результат
4085 36 02 MVI M, 02h Запись в ячейку памяти значение 02h(второе число больше первого)
4087 CD 49 00 CALL 49h Переход на новую строку
408A 01 25 42 LXI B, 4225h Запись в регистры ВС адреса, по которому записано сообщение «Vtoroechislobolshepervogo»
408D CD 4F 00 CALL 4Fh Выводсообщения «Vtoroe chislo bolshe pervogo» наэкран
4090 C3 93 40 JMP 4093h Переход на конец программы(по адресу 4093h)
4093 C3 40 00 JMP 40h Выход в Монитор в режиме ожидания ввода команды
4096 21 00 41 LXI H, 4100h Загрузка в пару HL адреса памяти для работы процедуры ввода TTIO
4099 CD 55 00 CALL 55h Вызов подпрограммы TTIO ввод символа в аккумулятор
409C FE 30 CPI 30h Сравнение введенного с помощью TTIO символа с кодом 30h
409E CA A6 40 JZ 40A6h Проверка на конец ввода текста(введен ли символ 0),если да,то переход на адрес 40А6h
40A1 77 MOV M, A Загрузка кода символа из аккумулятора в ячейку памяти
40A2 23 INX H Переход к следующему адресу(прибавление 1)
40A3 C3 99 40 JMP 4099h Переход на начало цикла
40A6 AF XRA Обнуление аккумулятора
40A7 77 MOV M, A Обнуление содержимого ячейки памяти
40A8 01 00 41 LXI B, 4100h Загрузка в пару ВС начального адреса, по которому записан текст
40AB CD 4F 00 CALL 4Fh Вывод введенного сообщения на экран
40AE C3 40 00 JMP 40H Выход в Монитор в режиме ожидания ввод команды

2.3 Результаты тестирования