|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 30, 2004 10:23:31 Никогда не приходилось использовать FPU и я что-то растерялся, как можно перевести ASCII to FLOAT и поместить результат перевода в переменную? (строка содержит только цифры) И как перевести целую часть от FLOAT в ASCII строку? |
|
|
Дата: Мар 30, 2004 10:50:08 · Поправил: q_q Asterix Например 1) MAMS32\M32LIB\ATOFP.ASM 2) MASM32\FPULIB\FpuTrunc.asm + MASM32\M32LIB\ltoa.asm |
|
|
Дата: Мар 30, 2004 11:06:17 q_q Я смотрел, но что-то уж больно мудрёно там ;-) Ответ на первый вопрос уже нашёл: xor eax, eax lea esi, buffer fldz @loop: lodsb test eax, eax jz @end aaa mov nm, eax fimul ten fiadd nm jmp @loop @end: fstp num |
|
|
Дата: Мар 30, 2004 11:50:42 Дык это если целое число. Где тут точка то обрабатывается? Ты с таким же успехом, если там точки нет, мог бы сделать обычное преобразование для целых чисел и полученный результат загрузить с помощью fild. При загрузке FPU автоматом преобразовало бы это в real10 формат в ST(0) потом сделать fstp куда тебе надо и он был бы записан в формате с плавающей точкой. И это вообще очень тормозной алгоритм даже для целых чисел. В FPU же поддержка BCD. В BCD ASCII строку вообще легко преобразовать, дальше её fbld. И хошь fst(p) хошь fist(p) куда надо и какой надо разрядности. |
|
|
Дата: Мар 30, 2004 12:46:51 [ The Svin: Дык это если целое число. Где тут точка то обрабатывается?] Точки нет, только цифры.. [ The Svin: мог бы сделать обычное преобразование для целых чисел и полученный результат загрузить с помощью fild.] Результат откуда загрузить, это придётся заводить ещё одну переменную типа QWORD ? [ The Svin: В BCD ASCII строку вообще легко преобразовать,] Что то я не соображу, это нужно из 313233343536373839 сделать 123456789 и куда записать результат, опять в строку или в переменную? [ The Svin: И это вообще очень тормозной алгоритм даже для целых чисел.] Почему? |
|
|
Дата: Мар 30, 2004 13:18:29 Результат откуда загрузить, это придётся заводить ещё одну переменную типа QWORD ? Так ты одну и ту же переменную можешь использовать. Пусть у тебя есть процедура AsciiDec2Qword. Принимает два аргумента ptrStr - указатель на строку и ptrQword - указатель на Qword. У тебя есть decimal ASCIIZ строка. Тебе нужно поместить целое число в переменную num (кстати ты не сказал даже какого размера тебе нужен float, он бывает трёх но предположу что real8 т.е. 64х битный) invoke AsciiDec2Qword,addr MyAscii,addr num fild qword ptr num fstp qword ptr num и всё. Что то я не соображу, это нужно из 313233343536373839 сделать 123456789 и куда записать результат, опять в строку или в переменную? Дык почитать нужно про fbld, это полстранички. BCD упакованный формат тебе известен? Тут он должен быть 9и байтным. Преобразовал во временную 9и байтную переменную bcdnum и всего две команды. fbld bcdnum fstp fnum Почему? Дык то туча причин. fiadd и fimul будут жуть как медленнее чем обычные add и mul целочисленные. Уж не говоря что mul можно через lea организовать. Он линейно будет в разы быстрее из-за замены инструкций. Даже забыв про это, посмотри к по идиотски организован контрольный блок. Цепочечная тормозная команда вначале. Проверка почему то сделана вначале вместо конца. В результате два джампа в цикле вместо одного. И т.д. и т.п. А вообще если предпологаются числа >=2^32 то лучше сделать через трансформирование в BCD 9и байтное число и fbld, fstp. |
|
|
Дата: Мар 30, 2004 14:14:49 На всякий случай решил сказать. 1. BCD аргумент тут террабайт (10 байт) 2. В BCD как и в двоичном коде страшие байты (представляющие старшие разряды) по более старшим адресам, т.е. тебе нужно не только упаковать младшие половины из ASCIIZ но и расположить их в обратном порядке. 3. Старший байт в данном формате BCD будет знаковым и если тебе нужно отрицательное значение - там должен быть 80h а если положительное - 00. Таким образом значимых байт 9 и 1 байт - для знака числа. Всё, если захочешь вернуться к теме, то после попытки сделать домашнюю работу. |
|
|
Дата: Мар 30, 2004 14:48:19 · Поправил: Asterix [ The Svin: кстати ты не сказал даже какого размера тебе нужен float, он бывает трёх но предположу что real8 т.е. 64х битный] Точно! [ The Svin: Дык почитать нужно про fbld, это полстранички. BCD упакованный формат тебе известен?] Почитать то особо и негде, по мелочи посшибал у Зубкова и Абеля. |
|
|
Дата: Мар 30, 2004 14:50:56 [ The Svin: Всё, если захочешь вернуться к теме, то после попытки сделать домашнюю работу.] Хорошо, буду пробовать ;-) |
|
|
Дата: Мар 30, 2004 16:39:59 Intel то на что. Второй том. |
|
|
Дата: Мар 30, 2004 17:44:37 Вроде как с первым вопросом разобрался, будет что-то типа этого ну только более универсально, т.е. здесь для эксперимента я брал фиксированные параметры и не обнулял переменную: lea esi, [szSrc+10-1]
lea edi, [sDest]
xor eax, eax
xor ebx, ebx
mov ecx, 2
mov edx, 5
std
@@:
lodsb
test edx, edx
jz @F
shl ebx, 4
xor al, 030h
or ebx, eax
loop @B
xchg eax, ebx
aam_16
xchg ah, al
aad_16
mov BYTE PTR [edi], al
xor ebx, ebx
xor eax, eax
mov ecx, 2
inc edi
dec edx
jmp @B
@@:
fbld sDest
А как быть со вторым вопросом, из целой части FLOAT организовать строку?? |
|
|
Дата: Мар 30, 2004 17:45:26 > Intel то на что. Второй том. У меня нету, да и по англицки там ;-) |
|
|
Дата: Мар 30, 2004 19:43:25 · Поправил: S_T_A_S_ [Чего-то я на ..] У меня нету, да и по англицки там ;-) Даже книжки иногда можно заказать на халяву ;-) http://www.intel.com/design/pentium4/manuals/index2.htm |
|
|
Дата: Мар 30, 2004 20:40:54 Блин, если исходная строка с нечётным количеством цифр тут опять возникают проблемы, нужно чётность проверять и что-то делать со строкой, или перекопировать или нулевой байт спереди пихать заранее.. |
|
|
Дата: Мар 30, 2004 20:42:40 S_T_A_S_ Я уже смотрел эту страницу, не врубаюсь я как там заказывать :-( |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054 |