Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

[Назад] [Содеожание] [Дальше]

Программа 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. Теперь стек численных регистров снова пуст.

[Назад] [Содеожание] [Дальше]