· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Программирование FPU

Посл.отвђт Сообщен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