Автор работы: Пользователь скрыл имя, 27 Декабря 2011 в 20:21, курсовая работа
Требуется составить программу, расположенную в памяти с ячейки 400016, формирующую следующие четыре числа:
«Знак числа» в ячейке 600016 (однобайтное целое число «+» - 00 и «-» - 01),
«Знак порядка» в ячейке 600116 (однобайтное целое число «+» - 00 и «-» - 01),
Модуль порядка в ячейке 600216 (однобайтное целое число),
Мантисса как трёхбайтное целое число в ячейках 600316-600516.
Введение…...…………………………………………………………………………..3
Аналитический обзор….…………………………………………………………….3
Описание выбранной программы-эмулятора……………………………………8
Практическая разработка…………………………………………………………..9
Описание использованных средств вычислительной техники………………13
Выводы……………………………………………………………………………………..13
Использованная литература………………………………………………………14
Не все двоичные комбинации в форматах, регламентированных стандартом, интерпретируются обычным способом. Крайние значения порядка – все нули (значение 0) и все единицы (значение 255 в формате обычной точности и 2047 в формате удвоенной точности) – представляют особые величины. Стандартом предусматривается представление в заданном формате следующих классов величин.
Представление величин в формате с плавающей точкой в соответствии со стандартом IEEE 754.
Обычная точность (32 бит) | Удвоенная точность (64 бит) | |||||||
Знак мантиссы | Смещённый порядок | Мантисса | Значение | Знак мантиссы | Смещённый порядок | Мантисса | Значение | |
Положительный ноль | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Отрицательный ноль | 1 | 0 | 0 | -0 | 1 | 0 | 0 | -0 |
Плюс бесконеч-ность | 0 | 255 | 0 | +∞ | 0 | 2047 | 0 | +∞ |
Минус бесконечность | 1 | 255 | 0 | -∞ | 1 | 2047 | 0 | -∞ |
Простое значение типа NaN | 0 или 1 | 255 | ≠0 | NaN | 0 или 1 | 2047 | ≠0 | NaN |
Сигнализиру-ющее значение типа NaN | 0 или 1 | 255 | ≠0 | NaN | 0 или 1 | 2047 | ≠0 | NaN |
Положительное нормализован-ное число | 0 | 0<e<255 | f | 2e-127∙(1.f) | 0 | 0<e<2047 | f | 2e-1023∙(1.f) |
Отрицательное нормализован-ное число | 1 | 0<e<255 | f | -2e-127∙(1.f) | 1 | 0<e<2047 | f | -2e-1023∙(1.f) |
Положительное ненормализо-ванное число | 0 | 0 | f≠0 | 2e-126∙(0.f) | 0 | 0 | f≠0 | 2e-1022∙(1.f) |
Отрицательное ненормализо-ванное число | 1 | 0 | f≠0 | -2e-126∙(0.f) | 1 | 0 | f≠0 | -2e-1022∙(1.f) |
Описание выбранной программы-эмулятора.
Для решения поставленной задачи воспользуемся эмулятором Смирнова.
Основной
причиной выбора этого эмулятора
было то, что из-за некорректного отображения
обоих эмуляторов на ПК с процессором
Intel Pentium–IV их размеры окон эмуляторов
превышают разрешение монитора пользователя
и работа с ними просто невозможна. К тому
же у эмулятора Дёмина-Пушкина как бы «срезается»
правая часть главного окна программы,
и доступ к кнопкам становится невозможен.
Отображение эмуляторов Дёмина-Пушкина и Смирнова на ПК с процессором P-IV.
Однако,
из-за того, что эмулятор Смирнова состоит
из нескольких окон, «привязанных» друг
к другу, и на них доступны все необходимые
кнопки управления, то, отменив привязку
и удалив окно клавиатуры, можно более-менее
комфортно работать с эмулятором.
Работа
с Эмулятором Смирнова.
Практическая разработка программы.
Для решения поставленной задачи необходимо представить число с плавающей точкой в виде четырёх байт, хранящихся в обратном порядке.
В 4-м байте, хранящемся по адресу 5003h, находится бит знака числа и 6 бит смещённого порядка числа, а последний (младший) бит смещённого порядка хранится в предыдущем, третьем байте, располагающемся в ячейке 5002h.
Следовательно, сначала необходимо загрузить в аккумулятор третий байт числа, а затем, сдвинув байт, записать в аккумулятор 4-й байт числа, содержащий бит знака числа. При этом младший бит смещённого порядка будет располагаться в результате сдвига во флажковом регистре в бите, отвечающем за переполнение.
Сдвинув 4-й байт числа, скопированный в аккумулятор, в аккумуляторе мы получим значение смещённого порядка, а во флажке CY – бит знака числа. В зависимости от состояния CY в ячейку 6000h записываем 0h (знак числа – «+») или 1h (знак числа – «-»).
Далее необходимо получить значение порядка числа. Так как смещённый порядок в нашем случае равен 12810 и порядок числа лежит на отрезке [-128; 127], то из полученного значения в аккумуляторе необходимо вычесть это смещение, равно 8016. Однако, если порядок отрицателен, мы не получим нужного нам значения в результате заёма в аккумуляторе при вычитании (значение CY равно 1).
Например:
–
То есть полученное значение даже больше возможного!
Следовательно, если после вычитания значение CY равно 1, необходимо записать в ячейку 6001h значение 1h (знак порядка – «-») из числа 80h вычесть значение смещённого порядка:
–
Таким образом, после получения смещённого порядка в аккумуляторе после второго сдвига необходимо сохранить это значение для последующих вычислений, например, в регистре B.
После
определения знака числа, знака порядка
числа и значения самого порядка, сохраняемого
в ячейке по адресу 6002h, необходимо проверить,
нужно ли восстанавливать старшую единицу
мантиссы в третьем байте числа. Если число
больше, чем 80h, то старшую единицу восстанавливать
не надо, иначе – нужно прибавить к этому
байту значение 80h (восстановление старшей
единицы). Полученное значение сохраняем
по адресу 6005h, а второй и первый байты
числа необходимо сохранить по адресу
6004h и 6003h, так как мантисса числа должна
храниться в обратном порядке.
Перед началом выполнения алгоритма в ячейки 6000h и 6001h записываются значения 00h для того, чтобы упростить алгоритм программы.
Для
организации диалога с
Блок-схема программы.
Листинг
программы.
Ячейка
4000 4003 4006 4009 400C 400E 4011 4013 4016 4018 401B 401D 4020 4021 4024 4025 4026 4027 402A 402D 4030 4033 4034 4037 4038 4039 403C 403D 403E 4041 4042 4043 4044 4045 4046 4047 4048 4049 404A 404D 404F 4052 4053 4055 4058 405A 405D 405F 4060 4063 4064 4065 4067 406A 406C 406F 4070 4071 4074 4075 4076 4079 407C 407F 4082 4085 4086 4089 408A 408B 408E 408F 4090 4093 4094 4097 4098 4099 409A 409D 409E 409F 40A2 40A5 40A8 40AB 40AE 40B0 40B3 |
16-й
код.
31 00 50 01 00 41 CD 4C 00 CD 52 00 3E 1B CD 58 00 3E 48 CD 58 00 3E 1B CD 58 00 3E 4A CD 58 00 AF 21 00 60 77 2C 77 01 00 46 CD 4C 00 21 00 50 CD 67 00 77 CD 67 00 2C 77 CD 67 00 2C 77 CD 67 00 2C 77 2D 7E 17 2С 7E 17 47 D2 53 40 3E 01 32 00 60 78 D6 80 D2 60 40 3E 01 32 01 60 3E 80 90 32 02 60 2D 7E FE 80 D2 6C 40 C6 80 32 05 60 2D 7E 32 04 60 2D 7E 32 03 60 CD 49 00 01 20 46 CD 4C 00 21 00 60 7E CD 61 00 2C 7E CD 61 00 2C 7E CD 61 00 2C 7E CD 61 00 2C 7E CD 61 00 2C 7E CD 61 00 CD 49 00 01 40 46 CD 4C 00 CD 55 00 FE 59 CA 0C 40 C3 40 00 |
Код
ассемблера.
LXI SP, 5000h; LXI B, 4100h; CALL 4Ch; CALL 52h; MVI A, 1Bh; CALL 58h; MVI A, 48h; CALL 58h; MVI A, 1Bh; CALL 58h; MVI A, 4A; CALL 58h; XRA A; LXI H, 6000h; MOV M, A; INR L; MOV M, A; LXI B, 4600h; CALL 4Ch; LXI H, 5000h; CALL 67h; MOV M, A; CALL 67h; INR L; MOV M, A; CALL 67h; INR L; MOV M, A; CALL 67h; INR L; MOV M, A; DCR L; MOV A, M; RAL; INR L; MOV A, M; RAL; MOV B, A; JNC 4053h; MVI A, 1h; STA 6000; MOV A, B; SUI 80h; JNC 4060h; MVI A, 1h; STA 6001h; MVI A, 80h; SUB B; STA 6002; DCR L; MOV A, M; CPI 80h; JNC 406Ch; ADI 80h; STA 6005h; DCR L; MOV A, M; STA 6004h; DCR L; MOV A, M; STA 6003h; CALL 49h; LXI B, 4620h; CALL 4Ch; LXI H, 6000h; MOV A, M; CALL 61h; INR L; MOV A, M; CALL 61h; INR L; MOV A, M; CALL 61h; INR L; MOV A, M; CALL 61h; INR L; MOV A, M; CALL 61h; INR L; MOV A, M; CALL 61h; CALL 49h; LXI B, 4640h; CALL 4Ch; CALL 55h; CPI 59h; JZ 400Ch; CALL 40h; |
Комментарий
к команде.
Создание стека программы по адресу 5000h; Вывод заставки
на ВТА; Очистка экрана
и перевод курсора в начало
экрана; Очистка аккумулятора; Получение адреса знака числа; Засылка в память значения 0h; Получение адреса
знака порядка числа; Вывод приглашения
для ввода 16-го числа; Ввод 1-го байта числа; Сохранение 1-го байта по адресу 5000h; Ввод 2-го байта
числа; Сохранение 2-го байта по адресу 5001h; Ввод 3-го байта
числа; Сохранение 3-го байта по адресу 5002h; Ввод 4-го байта
числа; Сохранение 4-го байта по адресу 5003h; Получение адреса 3-го байта (5002h); Копирование 3-го байта в аккумулятор; Высвобождение младшего бита порядка числа в CY; Получение адреса 4-го байта; Копирование 4-го байта в аккумулятор; Сдвиг 4-го байта (получение знака числа в CY, порядка числа в аккумуляторе); Сохранение значения смещённого порядка в регистре B; Переход на 4053h, если CY=0 (знак числа - плюс); Запись в аккумулятор 1h (минус числа); Сохранение минуса числа в ячейку 6000h; Восстановление значения смещённого порядка числа; Вычитание из аккумулятора порядка смещения (80h); Переход на 4060h, если CY=0 (знак порядка - плюс); Запись в аккумулятор1h (минус порядка); Сохранение 1h в ячейке 6001 (сохранение знака числа «-»); Запись в аккумулятор порядка смещения (80h); Вычитание значения смещённого порядка, хранящегося в B; Сохранение порядка числа в ячейке 6002; Получение адреса 3-го байта (5002h); Копирование 3-го байта в аккумулятор; Сравнение 3-го байта с 80h (проверка старшего бита на единицу); Переход на 406Ch, если результат больше нуля (единицу восстанавливать не надо); Добавление 80h (восстановление старшей единицы мантиссы); Сохранение 3-го байта числа с восстановленной единицей; Получение адреса 2-го байта числа (5001h); Копирование 2-го байта в аккумулятор; Сохранение 2-го байта числа в ячейке 6004h; Получение адреса 1-го байта числа (5000h); Копирование 1-го байта числа в аккумулятор; Сохранение 1-го байта числа в ячейке 6003h; Перевод курсора на новую строку ВТА; Вывод строки результата
преобразования; Получение адреса знака числа; Вывод знака
числа на дисплей; Получение адреса знака порядка числа; Вывод знака
числа на дисплей; Получение адреса порядка числа; Вывод порядка
числа на дисплей; Получение адреса 3-го байта мантиссы; Вывод 3-го байта
мантиссы на дисплей; Получение адреса 2-го байта мантиссы; Вывод 2-го байта
мантиссы на дисплей; Получение адреса 1-го байта мантиссы; Вывод 1-го байта
мантиссы на дисплей; Перевод курсора на новую строку ВТА; Вывод строки подтверждения
повтора программы; Ожидание нажатия клавиши; Сравнение нажатой клавиши с “Y”; Переход на 400Ch если нажата клавиша “Y” (повтор программы); Выход в монитор, ожидание команды; |
Контрольный пример.
Для проверки правильности работы программы приведём контрольный пример.
В диалоге ввода числа наберём константу 79A35E71. Представим это шестнадцатеричное число в двоичном виде:
Содержимое памяти: 01111001b 10100011b 01011110b 01110001b
Ячейка памяти: 5000h 5001h 5002h 5003h
Так как число хранится в обратном порядке, то бит, отвечающий за знак числа – старший бит в ячейке 5003h. Это «0», следовательно, знак числа – «+».
Следующие семь бит и старший бит в ячейке 5002h составляют значение смещённого порядка. В данном случае это 11100010b. При вычитании из этого значения порядка смещения мы получим: – = 01100010b=62h. Знак порядка числа – «+».
В ячейке 5002h хранится первый байт мантиссы числа. Так как его старший бит не содержит старшей единицы, необходимо восстановить её. При этом мы получим значение 11011110b=DEh.
Два
оставшихся байта должны быть скопированы
без изменения.
В результате выполнения программы получим следующий результат:
Содержимое памяти: 00h 00h 62h 79h A3h DEh
Ячейка
памяти:
6000h 6001h 6002h 6003h 6004h 6005h
Чего
и следовало ожидать. Следовательно,
программа работает верно.
Использованные средства вычислительной техники.
При
разработке программы был использован
персональный компьютер со следующими
техническими характеристиками.
Процессор: Intel Pentium IV, 1.5 GHz.
Оперативная память: 256 MB.
Жёсткий диск: 40GB.
Видеокарта: 1024x768, 32-Bit Color, Radeon 7500/7500LE.
Операционная
система: Windows
Millennium Edition.
Выводы по работе.
В
результате разработки создана программа,
позволяющая наиболее быстро решить
поставленную задачу. Данный алгоритм
преобразования числа с плавающей точкой,
по моему мнению, является самым быстрым
в работе, несмотря на то, что дополнительно
используется регистр B. Единственным
недостатком программы можно считать
большой размер текстовых констант, использованных
в программе. Однако использование диалога
значительно упрощает работу с программой,
она становится понятной на интуитивном
уровне, а анализ результата на ошибки
происходит гораздо быстрее.