Программа написана при помощи компилятора Radasm. Задание Реализовать проверку достоверности математического выражения с использованием сопроцессора для 100 значений в промежутке от 0 до 2pi. Значения проверяются правильно, только я попадаю в бесконечный цикл проверки. Использовать для реализации цикла loop не могу (ошибка компилятора при прыжке на 28 строчек), а цикл .while выдает бред. Пожалуйста, помогите. Код Код (Text): .386 .387 .model flat,stdcall option casemap:none include FPU_Lab.inc .data t dq 2.0 a dq 0.0 b dq 0.0 rpt dq 100.0 .data? rez dq ? .code start: invoke Main invoke ExitProcess,0 Main Proc invoke ClearScreen finit fldpi ;pi fldpi ;pi,pi fadd ;2*pi fdiv rpt fstp rez mov ecx,5 .while (ecx!=0) fld a ;a fcos; cos(a) fld b;b,cos(a) fcos ;cos(b),cos(a) fadd ;cos(b)+cos(a) fld a;a,cos(b)+cos(a) fld b;b,a,cos(b)+cos(a) fadd;b+a,cos(b)+cos(a) fld t;t,b+a,cos(b)+cos(a) fdiv;(b+a)/2),cos(b)+cos(a) fcos;cos(b+a)/2),cos(b)+cos(a) fld a;a,cos(b+a)/2),cos(b)+cos(a) fld b;b,a,cos(b+a)/2),cos(b)+cos(a) fsub;a-b,cos(b+a)/2),cos(b)+cos(a) fld t;t,a-b,cos(b+a)/2),cos(b)+cos(a) fdiv;(a-b)/t,cos(b+a)/2),cos(b)+cos(a) fcos;cos((a-b)/t),cos(b+a)/t),cos(b)+cos(a) fmul;cos((a-b)/t)*cos(b+a)/t),cos(b)+cos(a) fld t;t,cos((a-b)/t)*cos(b+a)/t),cos(b)+cos(a) fmul;2*cos((a-b)/2)*cos(b+a)/2),cos(b)+cos(a) fcomp fstsw ax sahf .if ZERO? invoke MessageBox,0,$CTA0("Equal"),0,MB_OK .else invoke MessageBox,0,$CTA0("NOT equal"),0,MB_OK .endif fld a ;a fld b ;b,a fadd rez ;b+rez,a fstp b ;a fadd rez; a+rez fstp a ;bye :) dec ecx .endw ret Main endp end start
Ураааа! Заработало! Ну что это за фигня, а? Все знают, что это регистр-счетчик. Зачем его трогать? Что там мелкомягкие думали?
vitalik Ну просто некошерно не выругать мелкомягких. А между тем у пингвинов точно так же - ecx is scratch register.
winapi засирает вам регистры ??? - оберните их вызов в отдельную функцию с push ECX и pop ECX никто же не пытается использовать loop и rep непосредственно вместе
mymessage proc push ecx .if ZERO? invoke MessageBox,0,$CTA0("Equal"),0,MB_OK .else invoke MessageBox,0,$CTA0("NOT equal"),0,MB_OK .endif pop ecx mymessage endp все остальное сами допишите