logo
несколько программ / bsp33

Ошибка в процессореPentium

В листинге 10.2 мы привели исходный текст программы PENTERR, с помощью которой можно обнаружить известную ошибку в арифметическом сопроцессоре, встроенном в процессорPentium. Эта ошибка приводит к снижению точности результата при делении некоторых комбинаций чисел.

В нашем случае мы проверяем результат вычислений по следующей формуле:

(4195835 / 3145727) * 3145727

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

Листинг 10.2. Файлpenterr\penterr.asm

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

; Проверка наличия ошибки в сопроцессоре,

; встроенном в процессор Pentium

;

; (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

.286

x dd 4195835.0

y dd 3145727.0

z dd ?

BugMsg db 13,10,"Pentium NPU bug detected!", "$"

OkMsg db 13,10,"Your Pentium NPU is OK", "$"

.CODE

begin:

mov ax, DGROUP

mov ds, ax

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

; значение x

fld x

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

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

fdiv y

; Умножаем содержимое верхушки стека

; на эту же константу

fmul y

; В результате при отсутствии ошибки мы должны

; получить результат, равный x

fcom x

; Сохраняем регистр состояния сопроцессора в AX

fstsw ax

; Переписываем AH в регистр флагов

sahf

; Проверяем равенство нулю

jnz bug

; Ошибки нет

mov ah, 9

mov dx, offset OkMsg

int 21h

jmp next

; Обнаружена ошибка

bug:

mov ah, 9

mov dx, offset BugMsg

int 21h

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

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

next:

mov ax, 4C00h

int 21h

END begin