А. Ю. Каргашина и А. С. Миркотан под редакцией > Ю. М. Баяковского
Вид материала | Книга |
СодержаниеЦелая арифметика повышенной точности ADC устанавливает признаки аналогично команде ADD MPTST и MPCMP |
- Баринова Анна Юрьевна учитель английского языка Как правильно готовить проект к урок, 42.88kb.
- Учебник под редакцией, 9200.03kb.
- Рабочая программа по русскому языку 11 класс По учебно-методическому комплексу под, 152.57kb.
- Рабочая программа По технологии для 5, 7, 8, 9 класса на 70 часов в год, 619.15kb.
- Зинченко П. И. Непроизвольное запоминание / Под редакцией В. П. Зинченко и Б. Г. Мещерякова, 260.23kb.
- Рабочая программа по литературе для 6 классе по программе под редакцией Коровиной, 194.25kb.
- Рабочая программа по русскому языку 9 класс По учебно-методическому комплексу под редакцией, 544.8kb.
- Гарифуллиной Светланы Рафаэльевны 2011-2012 учебный год пояснительная записка, 795.91kb.
- П. А. Сорокина Москва Санкт-Петербург Сыктывкар 4-9 февраля 1999 года Под редакцией, 6816.25kb.
- Н. В. Кузнецова Директор О(с)ош л. И. Лобанова бюджетное муниципальное образовательное, 428.15kb.
Целая арифметика повышенной точности
Даже самые незамысловатые вычисления могут привести к результатам, которые слишком велики, чтобы уместиться в шестнадцать битов машинного слова PDP-11. Поэтому довольно часто оказывается необходимым отводить дополнительные ячейки для записи одного числа. В большинстве случаев бывает достаточно двух слов (двойная точность), однако ненамного сложнее рассмотреть и более общий случай.
Предположим, нам нужно научиться оперировать числами, имеющими до 35 десятичных знаков включительно. Их можно рассматривать как значащие цифры числа в представлении с плавающей десятичной точкой, и в таком случае точность в тридцать пять знаков после запятой безусловно выглядит чрезмерной для большинства прикладных задач. Так как log102≈0.3, то 2117 имеет тот же порядок, что и 1035. Следовательно, для представления чисел в рассматриваемом диапазоне нам требуется около 117 битов. Поскольку восемь машинных слов содержат 128 битов, то это и необходимо, и достаточно.
Представление чисел с повышенной точностью аналогично представлению числа в одном слове — просто увеличивается количество разрядов, отводимых под число. Вообразите себе число, размещенное в восьми ячейках блока, начинающегося с MEM и оканчивающегося в MEM+16 (проверьте правильность конечного адреса!). Если это 1, то все биты слов от MEM до MEM+14, будут равны нулю, а в ячейке MEM+16 нулевой бит будет равен 1, а остальные — нулю. Если число равно 400000, то только семнадцатый бит его отличен от нуля, т.е. первый бит ячейки MEM+14.
Отрицательные числа будут представлены в виде 128-разрядкого двоичного дополнения. Так, числу —1 соответствует 1 во всех битах блока.
Нет никакой существенной причины, почему ячейки с последовательно возрастающими адресами должны содержать убывающие по значимости разряды числа. Такое соглашение принято, скорее, интуитивно, поскольку в приведенном ниже изображении блока
и возрастание адресов его элементов, и убывание значимости разрядов числа оказываются расположенными в их естественном порядке: слева направо. Оно также согласуется с особенностями специальных команд некоторых процессоров серии PDP-11, которые выполняют арифметические действия над числами с двойной точностью в предположении, что в слове с меньшим адресом хранятся старшие биты. Поэтому такого соглашения желательно придерживаться.
Каждая «переменная» повышенной точности будет представлена в нашей программе идентификатором, указывающим на начало блока из восьми слов, в котором хранятся ее «цифры». Допустим, что в программе должно быть заведено десять таких чисел. Под них нужно отвести достаточное место в памяти и установить идентификаторы.
MPBLK: .BLKW 120
MPVAR: .WORD MPBLK
Чтобы объявить, что идентификатор представляет число с повышенной точностью, необходимо поставить ему в соответствие блок из восьми слов в зарезервированном участке памяти с меткой MPBLK. Для этого можно написать макро MP, в результате вызова которой с переменной VAR будет проделана требуемая операция:
MP VAR
Подходящим макроопределением могло бы быть
.MACRO MP X
ADD #20,MPVAR
MOV MPVAR,X
BR .+2
X: .WORD 0
.ENDM
(Почему мы предпочитаем не использовать фиктивную метку в команде перехода?) Обратите внимание на то, что переменная VAR определяется как указатель адреса слова, расположенного сразу после блока из 8 слов. В дальнейшем это позволяет эффективно применять автодекрементную адресацию.
Лучший подход состоит в том, чтобы написать макро для всех арифметических операций, которые могут понадобиться. Так, если нужно, чтобы результатом вызова
MPCLR VAR
было обнуление переменной VAR, то мы должны иметь
.MACRO MPCLR X ?L1
MOV X,R1
MOV #10,R0
L1: CLR -(R1)
SOB R0,L1
.ENDM
УПPАЖНЕНИЕ. Напишите макро, которая вызывается как MPMOV VARA,VARB
Рассмотрим теперь макро MPINC. В ней недостаточно просто увеличить на единицу слово, содержащее младшие разряды числа (имеющие наибольший адрес), потому что во всех его битах могут быть 1, и тогда нужно перенести 1 в следующее слово. Команда INC для этой цели не годится, так как она устанавливает признаки, подразумевая, что операнд — целое число со знаком. В нашем же случае знаковым является 15-й бит слова, в котором хранятся старшие разряды числа (которое имеет наименьший адрес); все же остальные элементы блока просто добавляют к общему представлению числа по шестнадцать разрядов. Однако нашим требованиям прекрасно удовлетворяет команда ADD, поскольку она устанавливает бит C при переносе из старшего разряда. Поэтому макро MPINC начнем с прибавления единицы к младшему слову. Затем, если только бит C оказался равным 1, увеличим следующее слово. Для этого предназначена одноадресная команда ADC: она добавляет значение бита C по соответствующему адресу.
Может случиться, что прибавление бита C вновь приведет к переносу. Поскольку команда ADC устанавливает признаки аналогично команде ADD, достаточно повторить предыдущее действие по отношению к следующему слову и т.д. до старшего элемента блока. Немного усовершенствовав этот алгоритм, получим
.MACRO MPINC X ?L1
MOV X,R1
MOV #10,R0
SEC
L1: ADC -(R1)
SOB R0,L1
.ENDM
УПPАЖНЕНИЯ. 1. Команда SBC вычитает значение бита C из своего операнда, устанавливая при этом признаки так же, как и команда SUB. Напишите макро MPDEC.
2. Напишите макро MPASL и MPASR, правильно выполняющие умножение и деление на 2. (Указание. Используйте бит C в качестве промежуточного звена при сдвиге битов между словами.)
3. Добавьте в те макроопределения, где это необходимо, проверку результата операции на арифметическое переполнение.
4*. Составьте подпрограмму для печати целого числа повышенной точности в восьмеричном формате.
Рассмотрим, как выполняется макро MPINC. Каждый раз после прибавления 1 мы проверяем (используя бит C), помещается ли результат в текущее слово или нет; в последнем случае происходит перенос 1 в следующее слово и т.д. Это в точности совпадает с правилом прибавления 1 к целому числу в обычном позиционном представлении: если результат сложения в текущем столбце слишком велик, цифру этого столбца полагаем равной нулю и «переносим» единицу на один столбец влево. Поэтому можно рассматривать целое число повышенной точности как восьмеричное число. Значение каждой цифры есть содержимое соответствующего слова, т.е. мы имеем позиционное представление с основанием, равным 216=65 536!
Такой взгляд на арифметику повышенной точности делает операцию сложения очень простой. Если результат сложения для данного «столбца» превышает основание, то происходит «перенос» единицы в следующий столбец. Поэтому на каждом этапе, перед тем как применить к текущему слову команду ADD, сначала добавляем к нему значение бита командой ADC. Так же как и в команде MPINC, необходимо учитывать, что добавление переносимой единицы может в свою очередь вызвать перенос и т.д. Это приводит к циклу внутри основного цикла программы. Текст всего макро приведен на рис. Б.1. Заметьте, что если в результате выполнения команды ADC или сложения в старших
.MACRO MPADD X,Y ?L1,?L2
MOV X,R1
MOV Y,R2
MOV #10,R0
CLC
L1: MOV R2,-(SP)
MOV R0,-(SP)
L2: ADC -(R2)
SOB R0,L2
BVS ERROR
MOV (SP)+,R0
MOV (SP)+,R2
ADD -(R1),-(R2)
SOB R0,L1
BVS ERROR
.ENDM
Рис. Б.1. Макро для выполнения операции сложения чисел повышенной точности.
разрядах устанавливается бит V, то конечный результат будет неправильным. Быть может, тогда придется переписать программу, расширив точность представления чисел (т.е. увеличив количество ячеек, отводимых под число).
УПPАЖНЕНИЯ. 1. Напишите макро MPSUB.
2. Напишите макро MPTST и MPCMP так, чтобы любая следующая за ними команда перехода работала корректно. Можно ли изменить макро MPADD и MPSUB, приняв во внимание извлеченный из этого опыт?
Иногда требуется перейти от обычной формы представления числа к числу с повышенной точностью. Непосредственный перенос числа в слово, отведенное под младшие цифры, и засылка 0 в остальные ячейки блока не годится, потому что число может быть отрицательным. Команда расширения знака SXT20 (Sign eXTend) сбрасывает операнд-приемник, если бит N равен нулю, и заносит в него минус единицу, если в знаковом разряде 1. Эта команда не изменяет биты N и C. Итак, чтобы содержимое ячейки MEM перевести в формат целого числа X с повышенной точностью, нужно написать
MOV X,R1
MOV #7,R0
MOV MEM,-(R1)
L1: SXT -(R1)
SOB R0,L1
Читатели, обладающие определенными познаниями в области вычислительной математики, могут пойти дальше и создать собственные макро MPMUL и MPDIV. Для вывода чисел особенно необходима операция деления на десять. Если программа выполняет только такое деление, то для экономии машинного времени целесообразно завести таблицу степеней числа десять. Предположим, что нам нужно выдать на терминал положительное число. Цифра, соответствующая каждой степени десятки, начиная с наибольшей, определяется количеством вычитаний этой степени из данного числа до получения отрицательного результата. Алгоритм очень прост и в то же время довольно эффективен.