Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Сумма двух чисел с плавающей запятой.


Автор: IKM2007 15.5.2009, 20:19
Здраствуйте.
Собственно задача:
Написать процедуру, которая считывает сумму двух 4-байтных чисел с плающей запятой.
Все это надо делать "вручную". Знак надо учитывать. Числа хранятся в памяти по адресам t1 и t2. Мне интересен алгоритм, но запостил здесь, так-как все таки надо знать структуру 4-байтных FPU-чисел. Спасибо.

Автор: IKM2007 17.5.2009, 12:43
Вот целых 3 часа писал этот код.
Кому не лень, проверьте, возможно что-то не так.

Код

float_sum macro tt1, tt2, result
local a, l1, l2, l3, l4, l5, l6, t1, t2, verj, the_end
pushf
pushad

mov eax, tt1
mov ebx, tt2
mov ecx, eax
mov edx, ebx

and eax, 0FFFFFFh; f -> eax
and ebx, 0FFFFFFh; f -> ebx

shr ecx, 23
shr edx, 23
and ecx, 0FFh; e1 -> ecx
and edx, 0FFh; e2 -> edx
sub ecx, 127; получили степень 2-ки
sub edx, 127; получили степень 2-ки

cmp ecx, edx
jg l1
mov esi, edx
sub esi, ecx
jmp a
l1:
mov esi, ecx
sub esi, edx
xchg ecx, edx;меньшяя степень в ecx
xchg eax, ebx; меньшее число в eax
a:
mov edi, ecx;степень -> edi

;получим знак чисел, знак меньшего в n1, знак большего в n2
n1 = 0
n2 = 0
mov ecx, tt1
mov edx, tt2

test ecx, 80000000h
jz t1
mov n1, 1
t1:
test edx, 80000000h
jz t2
mov n2, 1
t2:
;уравниваем e1 и e2
cmp esi, 29
jge l3
cmp esi, 22
jg l4
mov ecx, esi
shr eax, cl
jmp verj
l4:
shr eax, 22
mov ecx, esi
sub ecx, 22
sub edi, ecx
shl ebx, cl
verj:

cmp n1, 1
jnc l5
or eax, 80000000h
l5:
cmp n2, 1
jnc l6
or ebx, 80000000h
l6:
;уже числа со знаком
add eax, ebx
l3:;проверяем, заняты ли биты в месте для "e"
test eax, 807FFFFFh
jz the_end
sar eax, 8
add edi, 8
and eax, 807FFFFFh
the_end:
add edi, 127; получили "настоящий" e
and edi, 0FFh
shl edi, 23
or eax, edi
mov result, eax

popad
popfd
endm

Автор: IKM2007 20.6.2009, 07:56
Тема опять актуальна. Экзамен Ассемблер через 3 дня. В правильноси вышенаписанном коде не уверен, так что просьба: проверьте пожайлуста, если где то что нитак, скажите. Если где то есть уже написанная прога, дайте ссылку. Вообщем, жду помощи. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)