
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.159.222] |
![]() |
|
Сообщ.
#1
,
|
|
|
![]() ![]() ... ;cel_leng dd ? - длина целой части ;cel dd ? - целая часть числа (bin) ;drob dd ? - дробная часть числа (bin) ;chislo dd ? - число ... itog: xor eax,eax ;очищаем lea eax,chislo ;1-й байт chislo mov ebx,cel ;добавляем mov [eax],ebx ;целую часть lea eax,сhislo-1 ;адрес <- что-то тут add eax,cel_len ;точки <- не так, а что? mov byte ptr [eax],"." ;добавляем точку inc eax ;смещаемся вправо mov ebx,drob ;добавляем mov [eax],ebx ;дробную часть ... Подскажите - почему не работает и куда смотреть? ![]() |
![]() |
Сообщ.
#2
,
|
|
Очень странный код. Не так там, по-моему всё, а не только 2 выделенные строки.
Во-первых, идея всунуть символьную точку в двоичное число – полнейший абсурд. Во-вторых, смешана работа с байтами и двойными словами (регистры же 32-битные). В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные. В-четвёртых, сто за ассемблер? |
Сообщ.
#3
,
|
|
|
Цитата Jin X @ В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные. В-четвёртых, сто за ассемблер? Это masm32v11. Это урезанный вариант следующего кода: ![]() ![]() ... asc2float proc pushad lea esi,stroka-1 ;правый байт add esi,sfull ;целой части mov ecx,sfull ;счётчик mov bufer,0 ;инициируем... (bufer dd ?) mov bfull,0 ;bfull dd ? mov bdrob,0 ;bdrob dd ? xor eax,eax ;очищаем f1: ;преобразуем целую часть: mov al,[esi] ;берём байт or al,al ;есть что? jz d1 ;нет->d1 and al,0Fh ;да->убираем 3-ку mul mult ;учитываем coмножитель (mult dd 1.0) add bfull,eax ;сохраняем mov eax,mult ;обновляем mul ten ;множитель и (ten dd 10.0) mov mult,eax ;сохраняем его dec esi ;смещаемся влево loop f1 ;повторяем d1: ;преобразуем дробную часть: lea esi,stroka+1 ;левый байт add esi,sfull ;дробной части mov ecx,sdrob ;счётчик xor eax,eax ;очищаем d2: mov al,[esi] ;берём байт or al,al ;есть что? jz itog ;нет->itog and al,0Fh ;да->убираем 3-ку mul aten ;учитываем множитель (aten dd 0.1) add bdrob,eax ;сохраняем mov eax,aten ;обновляем mul aten ;множитель и mov aten,eax ;сохраняем его inc esi ;смещаемся вправо loop d2 ;повторяем itog: ;здесь я не совсем уверен: xor edi,edi ;очищаем lea edi,bufer ;адрес начала bufer mov ebx,bfull ;добавляем mov [edi],ebx ;целую часть lea edi,bufer-1 ;адрес add edi,sfull ;точки mov byte ptr [edi],"." ;добавляем точку inc edi ;смещаемся вправо mov ebx,bdrob ;добавляем mov [edi],ebx ;дробную часть fin: popad ret asc2float endp ... Я сильно сомневаюсь в процедуре "itog" |
![]() |
Сообщ.
#4
,
|
|
Цитата cupoma58 @ Если не заниматься анализом... что он должен делать? Это урезанный вариант следующего кода |
![]() |
Сообщ.
#5
,
|
|
Походу тут выполняется попытка целочисленными инструкциями работать с форматами плавающей точки
|
![]() |
Сообщ.
#6
,
|
|
А в чём смысл? Неужели быстрее будет?
p.s. Есть SSE, если что ![]() |
![]() |
Сообщ.
#7
,
|
|
Та дело даже не в этом. Обрати внимание на комменты к инструкциям mul. Типа (... dd 0.1). Походу он пытается mulить с eax 32-битный float.
|
Сообщ.
#8
,
|
|
|
Цитата Jin X @ Например:А в чём смысл? 1. Истиное равномерное распределение представляемых вещественных чисел; 2. Абсолютно точное хранение чисел вида: 0,3 или 1,7 (и т.д.) |
Сообщ.
#9
,
|
|
|
Цитата Qraizer @ Та дело даже не в этом. Обрати внимание на комменты к инструкциям mul. Типа (... dd 0.1). Походу он пытается mulить с eax 32-битный float. Этот код - попытка преобразования символьного дробного числа в двоичное: ![]() ![]() 12.34 ->31322E3334 -> 1 22E 3 4 -> целая часть справа-налево, дробная слева-направо с целью его дальнейшего использования: ![]() ![]() fld dig1 fld dig2 ;арифм.операция fst itog именно выделенные строчки вызывают у меня сомнение и я ожидаю подсказки - в каком направлении работать? |
![]() |
Сообщ.
#10
,
|
|
Ну, я так и подумал. Только всё равно нихрена не очевидно было. Тогда тебе проще преобразовать ASCII-символы в цифры, скомпоновать в BCD и просто грузануть FBLD. А положение десятичной запятой учесть уже в готовом вещественном, просто поделя на 10 в соответствующей степени.
|