Помогите плиз не могу чтото понять как делить с плавающей точкой, читал зубкова, но всеже... Нужно: _a/_b=21,75 Код (Text): .data? _a dd ? _b dd ? _j dq ? .code mov _a,87 mov _b,4 fld _a fdiv _b fist _j mov eax,_j ; Теперь на eax-21 В общем из стека FPU вывести целое фисло получается, но как дробь получить - не допрет , т.е. как вывести .75 ? для вывода на экран уже числа 21.75
Quantum Можешь привести рабочий пример? Всю секцию обыскал - ничего не нашел, там половина линков битых.
Corleone Тот пример by Black_mirror должен быть доступен в оффлайновой версии форума. Рабочий (вроде) пример есть в масме32: \fpulib\FpuFLtoA.asm
Corleone Суть простая, а реализация не очень Особенно для общего случая, навороченного в FpuFLtoA.asm Для вывода числа в децимальном виде с фиксированным числом знаков нужно умножить число на соответствующую степень 10 и выгрузить в виде упакованного двоично-десятичного (BCD) числа. Например, для двух знаков Код (Text): d100 dd 100 bcd db 10 dup(?) ... fimul d100 fbstp bcd В bcd старший байт определяет знак, а 9 младших байт это 18 4-битовых представлений десятичных цифр 0..9. Преобразование 4 бит в символ делается просто добавлением 30h. Проблема тут только в том, чтобы найти старшую значащую hex-цифру (чтобы не выводить лишние нули в целой части), правильно вставить десятичную точку и предусмотреть случай, когда целая часть = 0. Логика простая, но возиться лень Поэтому проще использовать готовые функции, хоть и излишне навороченные
Действительно FPU сложновато да и лень юзать =) Выход нашел все в том же масме! Вот кто рулит и продолжает рулить! Код (Text): LOCAL buffer[MAX_PATH]:byte LOCAL divData[10] :byte invoke FpuDiv,Total,Time,addr divData,SRC1_DIMM or SRC2_DIMM invoke FpuFLtoA,addr divData,2,addr buffer,SRC1_REAL or SRC2_DIMM invoke SetWindowText,hPerMin,addr buffer
Corleone > "Выход нашел все в том же масме! Вот кто рулит и продолжает рулить!" Если уж на то пошло, то для ленивых рулит Delphi )))))) Код (Text): Edit1.Text:=FormatFloat('0.00',Total/Time);
leo Я не признаю ничего кроме <font size=14>Masm32</font><!--size-->. Делфи - это мерзость! Опитмизация на высшем уровне!
IceStudent Ну от многих я слышал про то что лучше фасм, но очень привык в масму, как ни крути а 3,5 года на масме срок внушительный, к тому же не любитель я менять обстановку =) Ладно, т.к. деление с плавающей запятой я освоил, считаю тему закрытой, всем спасибо за ответы
Corleone Масм масму рознь - одно дело ассемблер, другое дело левые сборные солянки под назвнием fpulib и т.п. Обрати внимание на комментарий к FpuDiv.asm "This procedure was written by Raymond Filiatreault, December 2002. Modified March 2004 to avoid any potential data loss from the FPU" Т.е. почти полтора года "левая" FpuDiv страдала потенциальным багом и сколько таких багов еще сидит в этих либах точно неизвестно. Так что не обольщайся
Ха-ха. Пожалуй я поторопился с выводами - возможные баги это фигня по сравнению с чудесами "оптимизации" fpulib. Посмотрите например, во что гений Raymond Filiatreault'а превратил элементарное fld+fmul+fstp в своей чудо-функции fpmul =8O. Эти люди еще чего-то ворчат о дельфийской оптимизации: если бытует мнение, что дельфя писана для студентов, то masm32\fpulib - для пассажиров с детьми и инвалидов ))))) Число строк кода и условных переходов потрясает воображение и не поддается подсчету - просто overflow. Но верх оптимизации это FSAVE и FRSTORE, которые понатыканы во все fp-функции. Для справочки - на всех процессорах регистровые FADD\FSUB выполняются 3-5 тактов, FMUL 4-7, с операндами из памяти чуть дольше. А вот FSAVE\FRSTORE не менее полторы сотни тиков каждая, а на P4 - несколько сотен. Остается надеяться, что никому из любителей masm32 не придет в голову использовать fpulib для серьезных вычислений )
Угу, видел я те функции, улыбнулся какой-то и забросил подальше. Самому проще строить вычисления, чем учить эти функции..
Мне всего лишь нужно для подсчета среднего арифметического и вывода его а экран То что эта либа написана ч-з *опу я и сам понял