Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
03.06.2014
Размер:
2.63 Mб
Скачать

ПрограммаNpu1

Приведем пример самой простой программы NPU1(листинг 10.1), которая выполняет вычисления по следующей несложной формуле:

z = x + y;

В этой программе значения x и y задаются в виде констант.

Листинг 10.1. Файлnpu1\npu1.asm

; =====================================================

; Простейшая программа для работы с арифметическим

; сопроцессором

;

; (C) A. Frolov, 1997

;

; E-mail: frolov@glas.apc.org

; WWW: http://www.glasnet.ru/~frolov

; or

; http://www.dials.ccas.ru/frolov

; =====================================================

.model small

.STACK 100h

.DATA

; Здесь находятся константы с одинарной

; точностью x и y

x dd 1.0

y dd 2.0

; Резервируем четыре байта для результата

z dd ?

.CODE

begin:

mov ax, DGROUP

mov ds, ax

; Записываем в стек численных регистров

; значение x

fld x

; Складываем содержимое верхушки стека

; с константой y

fadd y

; Записываем результат в ячейку z

fstp z

; Завершаем работу программы и

; возвращаем управление операционной системе

mov ax, 4C00h

int 21h

END begin

Как убедиться в том, что программа работает правильно?

Для этого мы используем отладчик CodeView, содержащий очень удобные средства отладки программ, работающих с арифметическим сопроцессором.

Запустим отладчик CodeView, передав ему в качестве параметра имя приведенной выше программы:

cv npu1.exe

После того, как отладчик запустится, откройте окно регистров сопроцессора. В нижней части экрана появится окно регистров сопроцессора, показанное на рис. 10.20.

Рис.10.20. Окно регистров сопроцессора

Пусть вас не смущает то, что в этом окне пока не показывается состояние регистров сопроцессора. Нажмите клавишу F8, выполнив один шаг программы.

Теперь вы видите содержимое регистров управления и состояния (cControl, cStatus), регистра тегов (cTag), регистров указателей команд и данных (Instr Ptr, Data Ptr), код выполняемой команды (Opcode). Отображается также содержимое стека численных регистров (Stack), но пока это поле пустое, так как все численные регистры отмечены в регистре тегов как пустые.

Нажмите еще раз клавишу F8, выполнив следующую команду программы. Эта команда запишет в стек численных регистров значение переменной x.

Теперь в области регистров стека показано содержимое регистра cST(0), причем как в двоичном виде, так и с использованием экспоненциальной (научной) нотации. Как и следовало ожидать, регистр ST(0) содержит величину 1.0 (рис. 10.21).

Рис. 10.21. В регистреST(0) находится значение 1.0

Выполним еще одну команду, прибавляющую к содержимому ST(0) значение 2.0 из переменной y. Теперь регистр ST(0) содержит величину 3.0 (рис. 10.22).

Рис. 10.22. Теперь в регистреST(0) находится значение 3.0

Последняя команда выталкивает из стека хранящееся там значение (3.0) и записывает его в переменную z. Теперь стек численных регистров снова пуст.

Обработка особых случаев

В арифметическом сопроцессоре имеются два механизма обработки ошибок, возникающих при выполнении различных команд.

Первый механизм основан на генерации так называемого прерывания особого случая (INT 10h). Это прерывание вырабатывается в том случае, когда происходит какая-нибудь ошибка (например, деление на нуль) при условии, что соответствующие биты масок особых случаев в регистре управления не установлены.

При втором способе обработки ошибок все особые случаи маскируются (соответствующие биты управляющего регистра устанавливаются в единицу) и в случае ошибки сопроцессор в качестве результата возвращает некоторое заранее известное особое значение (нечисло, неопределенность или бесконечность).

Программист может выбирать между этими способами обработки ошибок, маскируя или разрешая прерывание по особому случаю. Если прерывание особого случая замаскировано, можно предложить следующий способ обнаружения ошибки:

  • сбросить флажки особых случаев в регистре сосотояния;

  • выполнить одну или несколько команд сопроцессора;

  • проверить состояние флажков особых случаев в регистре состояния, в частности, бит суммарной ошибки ES;

  • если какой-либо флажок установлен, вызвать программу обработки ошибочной ситуации;

  • в программе обработки ошибочной ситуации можно сбросить флажки особых случаев, записав соответствующее значение в регистр состояния

Кроме того, после выполнения команды полезно проверить получившийся результат на принадлежность к множеству особых значений.

Рассмотрим возможные особые случаи сопроцессора в реальном режиме.

Соседние файлы в папке несколько программ