2012-03-25 4 views
1

У меня проблема с fdiv !!!! Я пытаюсь разделить 1/3 так это то, что я делаюраздел 8086/8087 1/3 = 3?

.model small 
.stack 100h 
.data 

var1 dd 1 
var2 dd 3 
var3 dd 2 
resultado dt 0.0 

.code 

mov ax,@data 
mov ds,ax 
finit 
fild var1 
fild var2 
fdiv 
fstp resultado 
ffree 

.exit 

Как вы можете видеть, я двигаю результат resultado, потому что я не могу видеть результат в st(0) (я использую TASM, так что я просто не могу см. переменные в отладчике), результат должен быть 3EAAAA3A, но я получаю 40400000 ... это 3 !!! как это возможно?? Я пытался обменять переменные и ничего! Вы можете мне помочь?? = (

+0

Покажите нам код или смонтируйте и увяжите реальный код. В конце показанного кода отсутствует 'END'. Если 'END' не находится в вашем ASM-файле, TASM, вероятно, не сможет выпустить новый .OBJ-файл из этого .ASM-файла, и поэтому вы можете связывать, выполнять и отлаживать программу, которую вы собрали некоторое время в прошлом, когда она имел в нем 'END'. Кроме того, 'FSTP' в этом коде хранит 10 байтов, а не 4. Это может быть объяснено той же проблемой с' END'. –

ответ

5

Если FPU так же стар, как 8087 вы должны поставить fwait команды после fdiv. В противном случае вы можете прочитать результат с ФПОМ, а ФП по-прежнему выполняется деление и результата вы пишете Спин не определено.

Это «особенность» была удалена в 80287 FPU.

+0

TASM автоматически вставляет 'FWAIT' при компиляции вышеуказанного кода. –

+0

спасибо !!! У меня есть правильный результат сейчас !!! –

+0

@AlvaroFallas: отметьте ответ, который помог как ** ** ответить. –

1

представленный код не показывает указанную проблему. он рассчитывает 0,3 (3) с FDIV (это на самом деле FDIVP ST(1), ST, поэтому он делит ST (1) = 1,0 по ST (0) = 3,0), а затем сохраняет его как последовательность из 10 байтов (AB AA AA AA AA AA AA AA AA FD 3F) в resultado.