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

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

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

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

Ошибка в процессоре 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
[Назад] [Содеожание] [Дальше]