Э. Таненбаум - Архитектура компьютера (1127755), страница 191
Текст из файла (страница 191)
Что это за ситуацияу 8. Некоторые микросхемы для обработки команд с плавающей точкой имеют встроенную команду извлечения квадратного корня. Возможно применение итерационного алгоритма (например, метода Ньютона — Рафсона). Итерационные алгоритмы дают последовательные приближения решения. Как можно быстро получить приближенный квадратный корень от числа с плавающей точкой? 9. Напишите процедуру сложения двух чисел одинарной точности с плавающей точкой.
Каждое число представлено 32-элементным логическим массивом. 10. Напишите процедуру сложения двух чисел с плавающей точкой одинарной точности, в которых для экспоненты используется основание системы счисления 16, а для мантиссы — основание системы счисления 2, кроме того, числа не содержат неявного бита 1 слева от двоичной точки. В нормализованном числе крайние левые 4 бита мантиссы могут быть равны 0001, 0010, ..., 1111, но не 0000. Число нормализуется путем сдвига мантиссы влево на 4 бита и прибавления 1 к экспоненте. Приложение В Программирование на языке ассемблера (Эверт Ваттель, Свободный университет Амстердама, Голландия) В каждом компьютере есть уровень архитектуры набора команд (1пзггпсбоп Бег Агс)1йес~пге, 1ЯА), который представляет собой совокупность регистров, команд н других элементов, доступных программистам, пишущим на языках низкого уровня.
Уровень 1ЯА часто называют машинным языком, но это не совсем точное определение. Программа, написанная на машинном языке, являет собой длинный список двоичных чисел, описывающих исполняемые команды и их операндьь в котором одно число соответствует одной команде. Писать программы с операторами в виде двоичных чисел очень сложно, поэтому во всех машинах предусмотрен язык ассемблера — символическое представление архитектуры набора команд, в котором двоичные числа заменены именами наподобие А00, 50В и М0С В этом приложении содержится краткое руководство по программированию на языке ассемблера процессора 8088 компании 1пге1. Этот язык был реализован в первых машинах 1ВМ РС, и именно на его основе развился современный язык ассемблера Репг1пш.
Помимо прочего, в приложении описываются некоторые инструментальные средства, доступные в Интернете и способные помочь в процессе обучения программированию на языке ассемблера. Назначение этого приложения не в том, чтобы готовить профессиональных программистов, пишущих на ассемблере, а в том, чтобы помочь читателю освоить архитектуру вычислительных систем через практические примеры. Именно по этой причине в качестве основы для изложения материала выбрана такая простая машина, как 8088 производства 1пге1. Сами по себе модели 8088 встречаются сейчас очень редко, но программы, написанные для них, можно выполнять и на современных системах Репйшп, что позволяет читателю воочию наблюдать результаты своей работы.
Скажем больше — значительная часть команд ядра Репг1пш совпадает с аналогичными командами 8088; различие между ними сводится лишь к разрядности регистров (32 и 16 бит соответственно). Таким образом, это приложение можно рассматривать как введение в курс программирования на языке ассемблера Репг1нш. Чтобы программировать любую машину на ее ассемблере, программист должен хорошо разбираться в уровне архитектуры набора команд такой машины.
По этой причине разделы «Основные понятия», «Процессор 8088», «Память н адресация» н «Набор команд 8088» посвящеяы детальному рассмотрению архитектуры, организации памяти, режимам адресации и командам 8088. В разделе «Ассемблер» содержится описание программного обеспечения, предназначенного для программирования на ассемблере.
К атому программному обеспечению, которое Основные понятия 755 распространяется совершенно бесплатно, мы будем обращаться впоследствии при изучении примеров программ. Следует учесть, что в ассемблерах других процессоров могут применяться оригинальные нотации, и к этому нужно быть готовым. В разделе «Трассер» рассматриваются программные средства интерпретации (трассировки, отладки), помогающие начинающим программистам устранять ошибки в программах. Раздел «Подготовительные действия» посвящен установке программного обеспечения и базовым приемам работы с ним. Наконец, в разделе «Примеры» содержатся готовые программы, примеры, задачи и их решения. Основные понятия Наш обзор программирования на ассемблере мы начнем с краткого описания са- мого языка ассемблера, после чего приведем неболыпой пример.
Язык ассемблера Калсдый язык ассемблера, или просто ассемблер, основывается на мнемониках— кратких осмысленных с точки зрения программиста обозначениях машинных команд (сложения, вычитания, умножения и других) наподобие А00, 500 и ИОС Вместе с тем, ассемблеры допускают применение символических имен для обозначения констант и меток для обозначения команд и адресов памяти.
Кроме того, большинство языков ассемблера поддерживают некоторое количество псевдокоманд, которые не относятся к уровню архитектуры набора команд, но регулируют процесс ассемблирования. При ассемблировании программы, написанной на языке ассемблера, с помощью специальной программы (она так и называется — ассемблер) получается двоичная программа, готовая непосредственно к выполнению в реальной аппаратной среде. Здесь следует отметить, что начинающие программисты, составляющие текст программы на языке ассемблера, часто допускают ошибки, при обнаружении которых выполнение двоичной программы останавливается без указания причин. Чтобы упростить задачу программиста, двоичную программу можно запустить не в реальной аппаратной среде, а в симуляторе, который в каждый отдельный момент времени выполняет только одну команду и выводит детальный отчет о своих действиях.
В этом случае отлаживать программы становится значительно проще. В среде симулятора программы выполняются значительно медленнее, чем в реальных условиях, но цель — научиться программировать на языке ассемблера — в данном случае оправдывает средства. При дальнейшем изложении материала мы подразумеваем применение такого симулятора (называемого также интерпретатором, или трассером), который интерпретирует и отслеживает выполнение каждой команды двоичной программы.
Термины «симулятор», «интерпретатор» и «трассер», таким образом, употребляются в нашем тексте в одинаковом значении. Как правило, говоря об выполнении программы в среде симулятора, эту среду называют «интерпретатором»; если же речь идет о ее применении в качестве инструмента отладки, используется термин «трассер»; в любом случае, имеется в виду одна и та же программа. 756 Приложение В. Программирование на языке ассемблера Небольшая программа на языке ассемблера Переходя от теории к практике, рассмотрим короткую программу на языке ассемблера и вывод ее текста в интерпретаторе.
На рис. В.1, а представлена программа на языке ассемблера 8088. Числа, следующие за восклицательными знаками, обозначают номера строк; они введены с единственной целью — упростить построчный анализ программы. Текст этой программы также размещен на сопроводительном компакт-диске (файл Н(10(П)гЫ.П) в папке ехагпр(ек Расширение этой программы (з), как и всех других, к которым мы будем обращаться, указывает на то, что она написана на языке ассемблера и не преобразована в двоичную форму. В окне трассера, показанном на рис. В.1, б, располагаются семь дочерних окон. В кахсдом из них указываются те или иные сведения о состоянии исполняемой двоичной программы. СЗ: 00 ОЗ=ЗЗ=ЕЗ: 002 АН:00 АПзос АХ: 12 вн:оо в!лоо вх: о СН:оо СыОс СХ: тг ОН;ОО ОЫОО ОХ: О ЗР: 7!б8 ЗР ОО82С ВР: 0000 СС - Р!Р:оооо:РС О!.
ОООО 41ег! МОЧ СХ,б -Ьи РОЗН СХ РОЗН НЧЧ РОЗН ЗТОООТ РОЗН ЧЧН!ТЕ ЗЧЗ АОО ЗР,В ЗОВ СХ,АХ РОЗН СХ ! 7 ! 8 ! 9 ! 1О ! 11 ! 1г ! 1З 1 14 =е0004 ООО! оооо оооо Пи > пеле И!ег!01п Рис. В.1. Исходный текст программы иа языке ассемблера (а); окно трзссера с информацией о ходе выполнения программы (б) Теперь вкратце рассмотрим содержимое семи дочерних окон, изображенных на рис.
В.1, б. В верхнем ряду расположены три окна — два больших и одно поменьше. В верхнем левом окне показано содержимое процессора, а именно — текущие значения сегментных (С5, 05, 55 и 85), арифметических (АН, А(., АХ) и других регистров. В среднем окне в верхнем ряду указывается содержимое стека — области памяти, предназначенной для хранения временных значений. В верхнем правом окне выводится фрагмент программы на языке ассемблера; стрелка указывает на команду, которая выполняется в данный момент. По мере выполнения программы эта стрелка, естественно, перемещается от одной команды к другой. Интерпретатор может работать в таком режиме, при котором однократное нажатие клавиши Еп1ег приводит к выполнению одной команды и соответствующему обновлению всех окон. Таким образом, программу, написанную на языке ассемблера, в среде симулятора можно выполнять с той скоростью, которая позволяет разобраться в происходящем.