LINUX.ORG.RU

Assembler FPU simple functions


0

2

вот я кое чего наваял используя ассемблерные вставки, все компилится но результат несовпадает с реальным(( Помогите исправить мой код.

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	/*Требуется вычислить выражение (argTG/(cos{i}+tg(i)))*cos(i*i)*/
	double a=0;//хранится результат cos(i)+tg(i)
    double b=0;//хранится результат argTG(i)/a
    double y=0;//хранится результат b * cos(i^2)
    int i = 3;
    int j = 9; //i^2
    _asm
    {
		finit
        fld i
        fcos
        fld i
        fptan
        fadd
        fstp a
            fld i
            fpatan
            fld a
            fdiv
            fstp b
                     fld b
                     fld j
                     fcos
                     fmul
                     fstp y
    }
cout<<"Результат операции: "<<y;
cout<<endl;
	return 0;
}

Ответ на: комментарий от Begemoth

Прошу не разводить холивар на тему использования тех или инных IDE. Здесь это не играет никакой роли. Я не знаю синтаксиса AT&T поэтому писал там где удобней на данный момент.

shmel210 ()
Ответ на: комментарий от anon_666

модульная работа) Причем препод ошибок в ней не нашел, но непринял из за неправильного результата(((

shmel210 ()
$ g++ lor.cpp -o lor
lor.cpp:1:20: фатальная ошибка: stdafx.h: Нет такого файла или каталога
Компиляция прервана.
$

давай исправляй. а потом и ассемблером займёмся.

arsi ★★★★★ ()
Ответ на: комментарий от anonymous_sapiens

Причем здесь среды?? И какие к черту виндовые ошибки, вы вообще ассемблер знаете или потроллить пришли???

shmel210 ()

> int i = 3;

int j = 9; //i^2

fld i


fld j




для целых fIld

madcore ★★★★★ ()
Ответ на: комментарий от shmel210

у меня чего то твой код не компилируется.

└> gcc t.s
t.s: Assembler messages:
t.s:5: Error: no such instruction: `using namespace std'
t.s:7: Error: junk `(int argc,_TCHAR* argv[])' after expression
t.s:7: Error: suffix or operands invalid for `int'
t.s:8: Error: junk at end of line, first unrecognized character is `{'
t.s:10: Error: no such instruction: `double a=0'
t.s:11: Error: no such instruction: `double b=0'
t.s:12: Error: no such instruction: `double y=0'
t.s:13: Error: invalid character '=' in operand 1
t.s:14: Error: invalid character '=' in operand 1
t.s:15: Error: no such instruction: `_asm'
t.s:16: Error: junk at end of line, first unrecognized character is `{'
t.s:22: Warning: translating to `faddp'
t.s:27: Warning: translating to `fdivp'
t.s:32: Warning: translating to `fmulp'
t.s:34: Error: junk at end of line, first unrecognized character is `}'
t.s:35: Error: invalid character '<' in mnemonic
t.s:36: Error: invalid character '<' in mnemonic
t.s:37: Error: no such instruction: `return 0'
t.s:38: Error: junk at end of line, first unrecognized character is `}'

как ты его компилируешь?

nanoo_linux ()

Раздел форума называется - программирование и разработка ПО под Linux/Unix, не так ли?

У большинства людей с данного ресурса Ваш код просто не скомпилируется.

Многие расценят Вашу тему как издевательство или троллинг.

Хотя бы укажите результат вашей программы.

Кстати, ассемблерная вставка не соответствует, к примеру ассемблерным вставкам компилятора gcc, который обычно пока используется при компиляции программ для Linux.

Странно почему ещё тему не закрыли.

m4n71k0r ()

Какой результат-то должен быть? 2.451022? Ошибку тебе уже указали в треде.

Yareg ★★★ ()
Ответ на: комментарий от m4n71k0r

программа выводит 1,5708 при замене fld на fild для целых чисел выводит 0.338699 проверяю в OpenOffice функцией =(ATAN(3)/(COS(3)+TAN(3)))*COS(9) выходит 1,004860196

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
    double a=0;//хранится результат cos(i)+tg(i)
    double b=0;//хранится результат argTG(i)/a
    double y=0;//хранится результат b * cos(i^2)
    int i = 3;
    int j = 9; //i^2
    _asm_("
		finit
        fld $i
        fcos
        fld $i
        fptan
        fadd
        fstp $a
            fld $i
            fpatan
            fld $a
            fdiv
            fstp $b
                     fld $b
                     fld $j
                     fcos
                     fmul
                     fstp $y
    ")
cout<<"Результат операции: "<<y;
cout<<endl;
return 0;
}

shmel210 ()
Ответ на: комментарий от shmel210
$ g++ lor.cpp -o lor
lor.cpp:12:5: ошибка: отсутствует терминирующий символ "
lor.cpp:30:5: ошибка: отсутствует терминирующий символ "
lor.cpp: В функции ‘int main()’:
lor.cpp:13:7: ошибка: нет декларации ‘finit’ в этой области видимости
$

с какими флагами собирал? какая версия компилятора?

arsi ★★★★★ ()
Ответ на: комментарий от arsi

в том то и проблема что под gcc не смог откомпилить, думаешь я стал бы ставить взоломанный VisualStudio для ради этой ерунды. Компилю также, ошибки те же. пробовал еще так _asm_(""....""); появляются друге

13 expected `)' before «finit» 29 `_asm_' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)

shmel210 ()
Ответ на: комментарий от shmel210

> думаешь я стал бы ставить взоломанный VisualStudio для ради этой ерунды

молодой человек, я сейчас милицию позову! ©

arsi ★★★★★ ()

Что это за говно вообще???

_asm
    {
      finit
        fld i
        fcos
        fld i
        fptan
        fadd
        fstp a
            fld i
            fpatan
            fld a
            fdiv
            fstp b
                     fld b
                     fld j
                     fcos
                     fmul
                     fstp y
    }

ttnl ★★★★★ ()
Ответ на: комментарий от shmel210

Возможно, мне изменяет память, но вроде fptan и fpatan делают не совсем то, что ты думаешь...
И было бы гораздо лучше, если бы твой исходник собирался.

madcore ★★★★★ ()
Ответ на: комментарий от madcore

вот нашел прасильный синтаксис для gcc компилятора

 __asm__ ("finit\n\t"

        "fld i\n\t"

        "fcos\n\t"

        "fld i\n\t"

        "fptan\n\t"

        "fadd\n\t"

        "fstp a\n\t"

            "fld i\n\t"

            "fpatan\n\t"

            "fld a\n\t"

            "fdiv\n\t"

            "fstp b\n\t"

                     "fld b\n\t"

                     "fld j\n\t"

                     "fcos\n\t"

                     "fmul\n\t"

                     "fstp y");
осталось найти как передать ассемблеру переменные))

shmel210 ()
Ответ на: комментарий от shmel210

>напиши лучше и под gcc. ну или в nasm,gas

Дай денег

ttnl ★★★★★ ()
Ответ на: комментарий от shmel210

Лень мне щас разбираться, как там локальные переменные передаются.


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
double y=0;
int i = 3;
int j = 9; //i^2
int main(){
    asm(".intel_syntax noprefix\n\
	finit\n\
	fild	dword ptr [i]\n\
	fcos	\n\
	fild	dword ptr [i] \n\
	fptan\n\
	fxch	st(1)\n\
	fstp	st(1)\n\
	faddp\n\
	fild	dword ptr [i]\n\
	fld1\n\
	fpatan\n\
	fdivrp\n\
	fild	dword ptr [j]\n\
	fcos\n\
	fmulp\n\
	fstp qword ptr [y]\n\
	.att_syntax noprefix\n");

cout<<"Результат операции: "<<y;
cout<<endl;
return 0;
}


madcore ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.