Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2010, 10:22   #1
iceman2112
Пользователь
 
Аватар для iceman2112
 
Регистрация: 04.05.2010
Сообщений: 19
По умолчанию Как вызвать функцию в ассемблерной вставке, зная адрес

Есть функция на C++, скажем
double имя_метода (double a, double b, double (*pf)(double))
{
__asm{
...
}
}
Как во вставке обратися к функции на которую указывает pf?

P.S. Если у нас есть простая функция, к примеру,
void example (void), то понятно
...
call dword ptr emaple
...
а вот как с указателем pf??
iceman2112 вне форума Ответить с цитированием
Старый 04.05.2010, 10:44   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

mov eax, pf
call eax
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 04.05.2010, 11:30   #3
iceman2112
Пользователь
 
Аватар для iceman2112
 
Регистрация: 04.05.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от alexcoder Посмотреть сообщение
mov eax, pf
call eax
Попробовал, у меня pf был синус
Вот функция, где x это точка в котороый нужно вычислить синус

void c (double (*pf)(double), float x)
{
__asm{
mov eax, x
push eax
mov eax, pf
call eax
add esp,4
}
cout<< (*pf)(x);
}
В результате после вызова функции в eax у меня значение 00000CFE
, при любых х, а не то значение которое должно быть;
а cout<< (*pf)(x); вычисляет всё правильно

Последний раз редактировалось iceman2112; 04.05.2010 в 11:39.
iceman2112 вне форума Ответить с цитированием
Старый 04.05.2010, 13:38   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
#include <math.h>

double x=1.0,y;
double (*pf)(double);
int main()
{
pf=&sin;
//y=sin(x);
asm
{
lea eax,x
push [eax+4]
push [eax]
mov eax,pf
call eax
add esp,8
fstp qword ptr[y]
}
return 0;
}
а потом уже выводить y cout ом

результат из синуса возвращается не в ЕAX!!!!, а в стеке сопроцессора!!!
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22
Вызвать адрес памяти как функцию XAOC-forever Общие вопросы Delphi 18 07.03.2009 20:32
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39
как вызвать в Dll по указателю функцию, которая определена в главном потоке? SaintRain Общие вопросы Delphi 1 25.11.2006 08:27
как вызвать из Dll функцию, которая определена в главном потоке? SaintRain Win Api 1 23.11.2006 20:08