Точно также как и в МАСМ32. Тут на сайте есть статьи касательно FPU под МАСМ32. Кстати, ассемблер просто поддерживает мнемоники инструкций FPU, а поддержка самих операций ложится, естественно, на процессор.
Hotwire Обычные регистры не работают с плавающей точкой и это не из-за тасм, а из-за проца Но даже FPU не грузит непосредственно заданные константы - только размещённые в памяти или специальные типа 0.0 - FLDZ, 1.0 - FLD1, 3.14... - FLDPI И обрати внимание на директивы\ключи компиляции, а то ТАСМ по умолчанию FPU комманды эмулирует
А каким образом можно написать подпрограмму для занесения float'ов в EAX (или в какой-нибудь другой регистр)? Например: FLOAT PROC INTEGERWORD, FRACTIONWORD ............. FLOAT ENDP Где можно почитать про FPU?
Hotwire Занести то обычный float в eax можно только единственное, что с ним там можно сделать - это сохранить в другую переменную )). А про FPU читай здесь, здесь и вообще привыкай сам поиск юзать.
Asterix У Магда, более чем "что-то" есть. В достаточном объеме,чтобы не задать вопрос подобный тому, что задал автор темы
Теперь я прекрасно понял, что сразу надо было писать то, что мне надо. Рывшись в статьях по OpenGL'у, напоролся на туториал от Tyler Durden'а. Он использует FASM, а я писал только на TASM'е пятом. Как реализовать такой фрагмент кода на ТАСМе invoke glRotatef,[theta],1.0,ebx,ebx
попробуй явно указать размер dword ptr 1.0 если не поможет, то .data _1_0 dd 1.0 .code call glRotatef,[theta],[_1_0],ebx,ebx Не слишком изящно, но полюбому сработает.
Первый вариант не заработал, а второй прокатил. Но очень некрасиво все это выглядит. Других вариантов нет?
Hotwire Можешь подглядеть в отладчике или hex редакторе как выглядит нужная константа и использовать её в hex форме. Но как показывает практика в рельных прогах FPU контанты (не размещённные в переменных) нужны довольно редко. В основном они требуются в слепленных на скорую руку пробниках. В Masm32 я для этого использую макрос Код (Text): @REAL4 MACRO Fnum Local Name .data Name dd Fnum .code exitm <Name> ENDM glRotatef,[theta],@REAL4(1.0),ebx,ebx Или вариант определяющий имя на которе потом можно ссылаться Код (Text): @REAL4 MACRO Name, Fnum Local Name2 IFB <Fnum> .data Name2 dd Name .code exitm <Name2> ELSE .data Name dd Fnum .code exitm <Name> ENDIF ENDM glRotatef,[theta],@REAL4(_1_0, 1.0),ebx,ebx glRotatef,[theta],[_1_0],ebx,ebx Скорее всего это и в TASM прокатит
Как загружать остальные регистры FPU (кроме ST0)? Согласитесь, что юзать FXCH ST(i) очень тормознуто.
при помощи fld <операнд>. Каждый fld пропихивает содержимое регистров на один вверх, освобождая st0, в который и производится загрузка операнда. (st6->st7, st5->st6, ... ,st0->st1) Просто загружаешь данные в определенном порядке, и всё. Кроме того есть fdecstp и fincstp, которые сдвигают указатель на вершину стека (st0), иначе говоря переопределяют имена регистров. Это тоже может оказаться полезным. А зачем тебе сразу 8 регистров?
Hotwire Читай Edmondа про проектирование FPU кода, а FXCH достаточно хорошо параллелится с другими командами, хотя и есть подводные камни cresta У меня частенько все 8 заполнены либо "в притык", либо приходится выбирать какую переменную оставлять в памяти
Y_Mur Имо теоретичекси достаточно 2х регистров, а "8 в притык" это надо постараться . По идее так должны алгоритмы работы со стеком ФПУ кодироваться - Обратная польская запись [edit] хотя возможно лучше сначала операнды в стек занести... но будет ли выигрышь?
asmfan cresta Смотря какой алгоритм У меня в цикле на основе одного входного массива может быть построено 2-4 выходных массивов и при этом в стеке и промежуточные данные сидят и постоянно используемые константы туда же разместить очень желательно