Я не уверен, что правильно понял ваш вопрос, но, по крайней мере, 2-й бит кода кажется верным.Делает ли он то, что вы хотите, это другой вопрос.Он делает это:
finit
fild sum ;//ST(0) = 90
fidiv acc ;//ST(0) = ST(0) / acc = 90 / 7 = 12.857..
frndint ;//ST(0) = 13
fist res ;//RES= ST(0) = 13
mov eax, res ;//EAX = RES = 13
Другими словами, вы рассчитываете раунд (90/7) = 13.
Теперь это прямое деление, а не среднее.Вы, очевидно, вычислили бы среднее значение, суммируя по N элементам, а затем деля на количество элементов.
Вторым моментом является то, что вы работаете с целыми числами, а не со значениями с плавающей запятой: fIld
, *Инструкции 1009 * и fIst
предназначены для работы с целыми числами, а не со значениями с плавающей запятой.Если вы сохраняете значение из FPU в памяти с fIst
вместо fst/fstp
, это значение в памяти будет целочисленным, а не значением с плавающей запятой.Это то, что вам нужно?
Чтобы сохранить значение с плавающей запятой из FPU в памяти, на которую указывает [eax]
, вы можете использовать
fstp dword ptr [eax] ;// Store Single-Precision Floating point value (4 bytes)
fstp qword ptr [eax] ;// Store Double-Precision Floating point value (8 bytes)
fstp tbyte ptr [eax] ;// Store Long Double-Precision Floating point value (10 bytes)
Одиночные и двойные хранилища (но неtbyte ptr
) также работает с fst
вместо fstp
.