1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
У меня вопрос - почему не компилируется этот кусок кода?
procedure SinCos(var d, c, s: extended); assembler; asm fld d fsincos fstp c fstp s end;
И как его правильно переписать. Компилятор говорит что инвалид комбинатион оф опкоде энд операндс. Вот глобальные переменные можно передавать, локальные можно, а передаваемые в процедуру - нельзя! Что за странное ограничение?
Для Дельфей (для D7 именно) на QualityCentral в свое время выкладывался вот такой код (из JediVCL):
procedure FSinCos(var Sin, Cos: Extended; X: Extended); assembler; asm FLD X FSINCOS FSTP Extended PTR [EDX] FSTP Extended PTR [EAX] FWAIT end;
var Rad, _Sin, _Cos: extended; begin Rad := Pi / 4; FSinCos(_Sin, _Cos, Rad); writeln(_Sin, ' ', _Cos); readln; end.
, только что проверил под D2009 - работает.
Да, это работает, спасибо. При замене EDX и EAX на С и S тоже работает. Только при замене порядка переменных уже работать перестаёт. А текущий порядок какой-то по-моему неестественный. И ещё вопрос - команда FWAIT что делает, насколько тут нужна, и если я вместо вызова процедуры буду просто писать этот ассемблерный код, безо всяких вызовов - она тоже нужна?