Вы определяете свой массив коэффициентов как двойные слова, то есть 32-битный float
.
p DD 1.2, 3, 0, 4.9, 8.27
Но затем вы используете FLD QWORD ptr [ebx+edx]
для загрузки из него qword (64-битный double
). Таким образом, вы рассматриваете битовые комбинации двух соседних float
s как один double
.
Кроме того, вы загружаете один и тот же double
каждый раз, потому что вы никогда не изменяете ebx
или edx
после установки ebx=p
и edx=0
.
Использование fmul dword ptr [ebx]
/ add ebx, 4
Вы также переполните стек регистров x87, поэтому fld
выдает NaN , когда st(0)
.. st(7)
уже используется. Похоже, ты никогда ничего не пишешь. См. http://www.ray.masmcode.com/tutorial/index.html, и другие ссылки в https://stackoverflow.com/tags/x86/info.
Используйте fmulp
, faddp
и fstp
, чтобы вытолкнуть значения, когда вы закончите с ними.
Или fmul
с операндом памяти вместо fld
+ fmulp
.
Я понятия не имею, какие еще ошибки могут быть в вашем коде, но у вас определенно есть эти ошибки, и они оба объясняют, что во время отладки наблюдаются серьезные странности в регистрах FP.
Кстати, вы можете использовать sub esp,8
/ fstp qword ptr [esp]
для сохранения результата непосредственно в стек вызовов в качестве аргумента для printf
. Вам не нужно valoare
.
Или лучше, используйте SSE2 mulsd
для скалярной математики FP вместо x87, но, очевидно, ваше назначение требует, чтобы вы использовали x87 fyl2x
, чтобы сделать это очень неэффективно, и, очевидно, с x87.
Если вы не были вынуждены сделать это неэффективным способом, вы можете просто сделать power *= x
, чтобы получить x, x ^ 2, x ^ 3, ... в цикле. Наращивание мощности по одному умножению за раз вместо того, чтобы переделывать каждую отдельную мощность, называется оптимизацией снижения прочности, подобно превращению tmp = i*10
в tmp += 10
.