Найти целое значение аргумента, при котором значение выражения удовлетворяет условию - Assembler
Формулировка задачи:
Добрый! Есть задача:Найти целое значение аргумента, при котором функция
Y = (5,6^x) / (3 * x^2) превысит 200
Код я написала, вычисление работает, но не работает переход по условию. Мне все время выдается Х=1. Помогите разобраться, что я не так написала:
#include "stdafx.h" #include <iostream> using namespace std; void main () { double A=5.6; // описание операндов в памяти long B=3, C=200, X=0; __asm { finit ; очистка регистров сопроцессора fld1 ; стек 1, регистр для вычисления степенной функц. m1: inc X ; наращивание аргумента fld A ; загрузка в ST(0) 5,6 fmulp ST(1),ST ; вычисление степенной функции 5,6^x fidiv B fidiv X fidiv X fcom C ; сравнение Y с 200 ?????????????? вот здесь начинаются проблемы!!!!!! fstsw AX ; сохранение регистра состояния SW (FPU) в регистре AX (CPU) ??????????? sahf ;сохранение старшего байта АХ в рег. флагов ??????????????? jc m1 ; переход, если сумма меньше 200 ????????????????? } cout<<"X="<<X<< endl; system("pause"); }
Никто не поможет?
Решение задачи: «Найти целое значение аргумента, при котором значение выражения удовлетворяет условию»
textual
Листинг программы
.data const200 dq 200.0 const3 dq 3.0 const5_6 dq 5.6 temp dq 1.0 x dd 1 .code .... fninit ;Y = (5,6^x) / (3 * x^2) превысит 200 fld const200 ; st(0)=200 @@: fild x ; st(0)=x st(1)=200 fmul st,st ; st(0)=x*x st(1)=200 fmul const3 ; st(0)=3*x*x st(1)=200 fld temp ; st(0)=temp st(1)=3*x*x st(2)=200 fmul const5_6; st(0)=temp*5,6 st(1)=3*x*x st(2)=200 fst temp ;temp=temp*5,6 fdivrp st(1),st ; st(0)=(5,6^x)/(3*x*x) st(1)=200 fcomip st,st(1); st(0) > 200 ? ja exit inc x jmp @b exit: ....
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д