Форма с плавающей точкой использует представление вещественного числа А в виде произведения мантиссы 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 Результаты тестирования