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;
И как его правильно переписать. Компилятор говорит что инвалид комбинатион оф опкоде энд операндс. Вот глобальные переменные можно передавать, локальные можно, а передаваемые в процедуру - нельзя! Что за странное ограничение?
У меня не говорит, что неправильные операнды, жалуется, что не знает такой инструкции FSINCOS... Компилятор какой? Я вот это откомпилировал и выполнил на TP7 без проблем:
{ Код от Merlyn-а } procedure FSinCos(var S, C : extended ; A : extended) ; assembler ; asm fld [A] ; db $CD,$35,$FB les di,[C] ; fstp es:tbyte ptr[di] ; les di,[S] ; fstp es:tbyte ptr[di] ; end {FSinCos} ;
var Rad, _Sin, _Cos: extended; begin Rad := Pi / 4; FSinCos(_Sin, _Cos, Rad); writeln(_Sin, ' ', _Cos); end.
У меня не говорит, что неправильные операнды, жалуется, что не знает такой инструкции FSINCOS...
А это команда из более позднего видимо сопроцессора. А у Паскаля 287 это вершина технического прогресса. Видимо db $CD,$35,$FB и есть код этой команды, насильно так сказать, заставим Паскаль это компилировать.
Цитата
Компилятор какой?
А, Дельфа... Седьмая.
Цитата
Я вот это откомпилировал и выполнил на TP7 без проблем:
{ Код от Merlyn-а } procedure FSinCos(var S, C : extended ; A : extended) ; assembler ; asm fld [A] ; db $CD,$35,$FB les di,[C] ; fstp es:tbyte ptr[di] ; les di,[S] ; fstp es:tbyte ptr[di] ; end {FSinCos} ; var Rad, _Sin, _Cos: extended; begin Rad := Pi / 4; FSinCos(_Sin, _Cos, Rad); writeln(_Sin, ' ', _Cos); end.
Вот результат:
7.07106781186548E-0001 7.07106781186548E-0001
... По-моему, все правильно.
Как хитро он переменные из регистров грузит. Через промежуточный регистр оказывается... А Merlyn, кстати, раз знает код команды, не может переписать это в кодах полностью? А то, говорят, это единственная возможность делать макросы на Паскале. Издевательство такое утончённое.
Добавлено через 4 мин. У меня этот код почему-то ошибку при выполнении выдаёт. Только окно сразу же закрывается, а аль-эф-5 в дельфе нету, не посмотреть что за ошибка.