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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2012, 09:46   #1
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию ASM и функции

Здравствуйте. Подскажите пожалуйста почему возвращаемое значение всегда равно нулю? По идее должно быть 13.00

Код:
type
  TVec3 = record
   x,y,z: single;
  end;
  TTypeClass = (tcOne,tcTwo,tcThree);    

..

Function GetMyPosition(MyId: string; TypeClass: TTypeClass): single;
var a: string;
begin
 case TypeClass of
  tcOne: a:='One';
  tcTwo: a:='Two';
  tcThree: a:='Three';
 end;

 showmessage(MyID+#13+a);
 result:=13.00;
end;

Procedure ShowMsg(S: string);
begin
 Showmessage(S);
end;


Procedure OnInit;
var
 pGetMyPosition: pointer;
 pShowMsg: pointer;
 stri: string;
 TC: TTypeClass;
 res: single;
begin
 pGetMyPosition:=@GetMyPosition;
 pShowMsg:=@ShowMsg;

 TC:=tcThree;
 stri:='Привет!';

 asm
 mov eax, stri
 mov edx, TC
 call pGetMyPosition
 mov res, eax
 end;

showmessage(FloatToStr(res));
end;
Также, хотел спросить, как можно принимать возвращаемые значения не как single а как, допустим, TVec3 ? (естественно, если переделать функцию в вид Function Lalala: TVec3)
Celestia вне форума Ответить с цитированием
Старый 02.11.2012, 09:58   #2
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
значение всегда равно нулю
Не всегда, просто так звезды сложились.
С равной вероятностью оно может быть любое.

Результат вещ.типа при delphi fastcall возвращается не через eax, а через вершину FPU-стека, т.е. забирать его надо из st(0) с последующей коррекцией стека.
xoodoo вне форума Ответить с цитированием
Старый 02.11.2012, 12:12   #3
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию

А можно поподробней об этом пожалуйста?
Celestia вне форума Ответить с цитированием
Старый 02.11.2012, 13:46   #4
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

О чем "об этом" ?
Ты впервые слышишь об FPU ?
xoodoo вне форума Ответить с цитированием
Старый 02.11.2012, 14:12   #5
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию

Нет, не впервые. Просто не сталкивался раньше с ассемблером, а тут такая задача просто встала- решить проблему с принятием результата функции.
"забирать его надо из st(0) с последующей коррекцией стека. " - не можешь написать как это сделать?
Celestia вне форума Ответить с цитированием
Старый 02.11.2012, 15:01   #6
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

call чегототам
fstp res
xoodoo вне форума Ответить с цитированием
Старый 02.11.2012, 15:24   #7
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
call чегототам
fstp res
Спасибо, так работает. А не можешь ничего сказать по поводу того как получать не числа в результате а record'ы ?

Последний раз редактировалось Stilet; 03.11.2012 в 11:57.
Celestia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров asm-asm Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.12.2011 11:54
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
с++ и ASM breate Общие вопросы C/C++ 4 04.11.2009 20:56
[c++]asm Nightwalker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.10.2008 19:39