Panowie, napotkałem na dość duży problem z programem asm zaimplementowanym do C++. Mianowicie, dostałem do napisania program wyznaczający wartości funkcji y= ax^3 – bx +sin(c*x) dla przedziału od x = –4 do x = 15 z krokiem 0.1; A wyniki zapisać do dwóch tablic (jedna tablica kod asm, druga kod w C++) na koniec wyświetlić i porównać wyniki. Program w C++ liczy i wyświetla a z asm nie mogę dojść do ładu, na tą chwilę wali błędami "Error 3 error C2415: improper operand type" dla linii mov esi, offset wynik2;
. Bardzo was proszę o jakieś podpowiedzi.
Poniżej kod:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
#define zakres (15-(-4))*10+1 //zakres [-4 do 15] z krokiem 0.1
int main()
{
float x = 3;
float a = 2;
float b = 5;
float c = 7;
float wynik[zakres];
float wynik2[zakres];
int j = 0;
float start = -4;
float step = 0.1;
for (int i = 0; i < zakres; i++)
{
x = -4 + i*0.1;
wynik[i] = a*pow(x, 3) - b*x + sin(c*x);
}
__asm
{
mov esi, offset wynik2; //adres tablicy do zmiennej tab
petla:
fld start;
fild j;
fld step;
fmulp st(1), st(0); //mnozymy st(1) razy st(0) wynik laduje do st(1)
faddp st(1), st(0); //dodaj st(1) + st(0) wynik laduje do st(1)
fstp x; //do x wynik
fld a; //na stos koprocesora
fld x;
fld x;
fld x;
fmulp st(1), st(0); //st(1) razy st(0) wynik laduje do st(1)
fmulp st(1), st(0); //st(1) razy st(0) wynik laduje do st(1)
fmulp st(1), st(0); //st(1) razy st(0) wynik laduje do st(1)
fld b;
fld x;
fmulp st(1), st(0); //st(1) razy st(0) wynik laduje do st(1)
fsubp st(1), st(0); //st(1) - st(0) wynik laduje do st(1)
fld c; //na stos koprocesora
fld x;
fmulp st(1), st(0); //st(1) razy st(0) wynik laduje do st(1)
fsin; //oblicz sinusa st(0) = sin(st(0))
faddp st(1), st(0); //dodaj st(1) + st(0) wynik do st(1)
fstp esi; //zapis wyniku do tablicy
add esi, 4; //zwiekszanie adresu o 4 przesuwajac sie na kolejna pole w tablicy
inc j; //zwikaszmay o 1 j
cmp j, zakres; //porownanie j z zakres
jge koniec; //gdy j >= zakres to skacz do koniec
jmp petla; //skacz do petli w przeciwnym razie
koniec:
}
cout << "WYNIK1 WYNIK2" << endl;
for (int i = 0; i < zakres; i++)
{
cout << wynik[i] << " " << wynik2[i] << endl;
}
system("Pause");
return 0;
}