
- •Кафедра специализированных компьютерных систем методические указания
- •1 Задание для курсовой работы
- •Формулировка задания
- •Варианты заданий
- •Указания к выполнению курсовой работы
- •Структурное оформление программы
- •Содержание и оформление пояснительной записки
- •Оформление программных документов
- •Краткие сведения о математическом сопроцессоре
- •Общая информация
- •Программная модель сопроцессора
- •Форматы представления вещественных чисел
- •Система команд сопроцессора
- •Использование обратной польской записи
- •Преобразование выражений в формат полиз
- •Алгоритм вычисления выражений
- •Ввод вещественных чисел с клавиатуры и вывод на экран
- •Ввод и преобразование символьной информации
- •Вывод результата вычислений
- •Приложение б
- •Приложение в Программа преобразования вещественного числа короткого формата (32 бита) в символьное представление
Алгоритм вычисления выражений
Методика написания программ для сопроцессора имеет свои особенности. Главная причина здесь в стековой организации сопроцессора. Алгоритм вычисления выражений в постфиксной записи имеет следующий вид:
Выбрать очередной символ записи выражения в форме ПОЛИЗ.
Если очередной выбранный символ — операнд, то поместить его в стек, после чего перейти к шагу 1.
Если очередной выбранный символ — знак операции, то выполнить ее над одним или двумя операндами в вершине стека. Результат операции необходимо поместить обратно в вершину стека.
Если в исходной записи выражения в форме ПОЛИЗ еще остались символы, то перейти к шагу 1, иначе в вершине стека находится результат вычисления выражения.
При разработке программ необходимо учитывать следующие факторы:
ограниченность глубины стека сопроцессора;
несовпадение форматов операндов;
отсутствие поддержки на уровне команд сопроцессора некоторых операций.
Для решения этих проблем придется разрабатывать дополнительный программный код, отклоняясь от последовательной классической обработки арифметических выражений, представленных в виде ПОЛИЗ. Однако стержнем программы будет строка в виде ПОЛИЗ.
В приложении Б приведен исходный текст программы, осуществляющей вычисление рассмотренного выше выражения, для которого получена постфиксная запись.
Ввод вещественных чисел с клавиатуры и вывод на экран
Ввод и преобразование символьной информации
Программа, которую необходимо разработать в процессе выполнения курсовой работы, часть исходных данных должна получать от пользователя с клавиатуры в процессе выполнения. Эти данные представляют собой числовую информацию, в частности, число интервалов разбиения и значение аргумента , для которого необходимо вычислить интерполированное значение функции.
Весь ввод с клавиатуры воспринимается как символьная информация, то есть, в клавиатурный буфер и оттуда в область памяти в сегменте данных при нажатии алфавитно-цифровых клавиш поступают коды соответствующих символов. Поэтому для вводимой числовой информации необходимо преобразование из символьного представления в числовое.
Ввод отдельных символов и целых строк с клавиатуры может быть в 16-разрядном DOS-приложении организован с помощью вызовов функций BIOS (по прерыванию int 16h) или DOS (int 21h). Вся необходимая информация о номерах функций, их назначении, правилах использования, включая примеры, имеется в [4] (глава 5).
Компиляторов с языков высокого уровня освобождают пользователей от необходимости преобразования формы представления данных при числовом вводе-выводе. Язык ассемблера в отличие от языков высокого уровня не обладает средствами такого прозрачного ввода-вывода числовой информации. Но в этом и состоит его достоинство, так как при определенном опыте и квалификации программиста появляется хорошая возможность повышения эффективности конечного кода.
В качестве примера рассмотрим использование функции MS DOS 0Аh, вызываемой по прерыванию 21h, для получения ввода с клавиатуры. Перед вызовом номер функции 0Аh заносится в регистр АН. Пара регистров DS:DX должна содержать адрес буфера, в который заносятся вводимые символы. При этом буфер должен иметь следующую структуру:
первый байт содержит количество символов для ввода с учетом символа 0Dh (перевод каретки), завершающего процесс ввода;
второй байт содержит реальное число введенных символов, но уже без учета завершающего символа 0Dh;
начиная с третьего байта содержится строка введенных с завершающим символом 0Dh, максимальная длина строки – 254 символа.
П
;… buf_0ah
struc
len_buf db 11;
длина буфера
len_in db 0
; действительная длина введенной строки
(без 0dh)
buf_in dn 11
dup
(20h);
буффер для ввода (с учетом 0dh) ends
data buf buf_0h<> adr_buf dd buf
.code
;…
;вводим
10 символов с клавиатуры
lds dx,adr_buf mov ah,0ah int 21h
;…
Листинг 5.1 –
фрагменты программы ввода строки
функцией 0Аh
int
21h
Далее рассмотрим один из возможных алгоритмов преобразования вещественного числа из символьного представления в двоичное. В качестве знаков, разделяющих мантиссу на целую и дробную части, можно использовать как запятую, так и точку. Суть алгоритма преобразования состоит в следующем. Производится ввод с клавиатуры символов вещественного числа. После ввода анализируются символы буфера, куда были помещены символы введенного числа, на предмет выяснения положения плавающей точки. Обнаруженная позиция запоминается. Относительно нее введенные символы подразделяются на символы цифр целой и дробной частей. Используя алгоритм преобразования символьного представления десятичного числа в двоичный эквивалент, преобразуется целая часть вещественного числа. Этот алгоритм основан на том факте, что ASCII – код любой десятичной цифры на 48 больше самого числа.
Дробная часть вещественного числа также преобразуется в двоичный эквивалент. Это преобразование производится с использованием сопроцессора по формуле:
,
где
- числовые значения десятичных цифр
дробной части вещественного числа
,
.
После того, как данное выражение вычислено
(его результат находится в вершине стека
сопроцессора), производится сложение
его результата с преобразованной целой
частью вещественного числа. После этого
в вершине стека сопроцессора находится
вещественное число – эквивалент своего
исходного символьного представления.
При ассемблерной реализации этого
алгоритма желательно предусмотреть
контроль правильности вводимой строки
в смысле ее соответствия символьному
представлению вещественного числа.
После перевода вводимых с клавиатуры числовых значений в машинное представление чисел необходимо также предусмотреть контроль их принадлежности диапазону допустимых значений для вводимых величин. Так для числа интервалов разбиения должно выполняться условие
,
где
выбираются
из соображений целесообразности.
Вводимые промежуточные значения аргумента должны принадлежать заданной области
.
В случае недопустимых значений программа должна выдавать сообщения об ошибках.