Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 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. Теперь стек численных регистров снова пуст. |