|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 23, 2003 08:04:59 Вот начал осваивать работу с FPU,все охота попробовать на практике. Но, блин, споткнулся о мелочь: не знаю, как в тасме32 объявить переменную типа флоат.Я знаю, что df, но как написать само число? (а то самому пересчитывать из формата в формат неохота, да и просто глупо). Такой прикол не прокатывает: 123.234e23 Кто нам поможет, беднякам? |
|
|
Дата: Июл 23, 2003 09:15:06 DF - определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение); для работы с плавающей запятой используются DD, DQ, DT и тогда float_number dd 3.5e7 Рекомендую почитать Зубкова |
|
|
Дата: Июл 23, 2003 11:24:32 Спасибо. |
|
|
Дата: Июл 24, 2003 23:23:27 как из вещественного 64 бит перевисти в 32 бита???? |
|
|
Дата: Июл 24, 2003 23:23:44 как из вещественного 64 бит перевисти в 32 бита???? |
|
|
Дата: Июл 26, 2003 16:15:24 2emergenter может, попробовать считать изпамяти в fpu как 64-битное, а потом выплюнуть из fpu-стека как 32-битное. Ведь, на сколько я знаю, все равно в стеке все числа преобразовываются к 10-байтовым. |
|
|
Дата: Июл 27, 2003 01:12:54 ТАК попробывал не получилось!!! Число 0x80000000 |
|
|
Дата: Авг 2, 2003 16:12:10 · Поправил: Fixer Можно так fld QWORD PTR длинное_вещественное fstp DWORD PTR короткое_вещественное Можно не используя FPU (Этот пример только для того чтобы показать как устроено число с плавующей точкой. Он проигрывает по скорости исполнения и по размеру предидущему) ; Округление для упрощения ведется в меньшую ; сторону ; Загрузка 64-битного числа в регистры EAX:EDX mov ebx, offset длинное_вещественное mov eax, [ebx+4] ; Мантиса mov edx, [ebx] test eax, 40000000h jz itsSmall test eax, 38000000h jnz Big jmp Normal itsSmall: mov ebx, eax shl ebx, 2 cmp ebx, 0E0000000h jb Small Normal: mov ebx, eax ; Переносим недостающие биты из предидущего двойного ; слова (по идеи здесь нужно было бы сделать ; округление) shld eax, edx, 3 ; Выделяем битовой маской новую мантису (биты 0-22) and eax, 7FFFFFh ; Выделяем новую экспоненту ; для длинного вещественного ; экспонента - биты 52-62; знак - бит 63 ; для короткого вещественного ; экспонента - биты 23-30; знак - бит 31 ; соответственно самый старший бит экспоненты ; является знаком экспоненты ; Выравниваем экспоненту (без знака) ; по правой границе регистра DX shr ebx, 14 ; Рубим старшие разряды экспоненты shl bx, 3 ; Теперь у нас 8-битная экспонента shl ebx, 14 ; Выделяем экспоненту и знак мантисы and ebx, 0FF800000h or eax, ebx jmp OutVal Big: ; В случае большого числа необходимо установить ; бесконечность нужного знака mov edx, eax ; Для бесконечности все биты мантисы - 0 ; все биты экспоненты - 1 mov eax, 7F800000h ; Выделяем знак мантисы and edx, 80000000h or eax, edx jmp OutVal Small: ; В случае маленького числа делаем его равным 0 xor eax, eax OutVal: mov короткое_вещественное, eax |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.051 |