Page 1 of 1
Вопрос по FPU
Posted: Sat Nov 05, 2005 11:14 am
by EXIS
Как сравнить две float переменные и сделать переход в зависимости от резултата? Сравнение со знаком. Задача такая:
IF (a>b) then действия;
Делаю на асме
fld dword
;st1
fld dword [a] ;st0
fcompp
fstsw ax
sahf
jnl metka
действия
metka:
Но работает неправильно. 
Posted: Sat Nov 05, 2005 11:33 am
by sid1333
А как точно "неправильно работает"?? Вроде как всё верно написано...
Posted: Sat Nov 05, 2005 11:38 am
by EXIS
У меня получается что
+10.5 > +150.5
А я правильно переменные в стек затолкал может наоборот или условие в jmp поменять надо?
Posted: Sat Nov 05, 2005 11:54 am
by sid1333
.387
.model small
.stack 100h
.code
start:
mov ax,DGROUP
mov ds,ax
fild __100
fild __1000
fcompp
fstsw __ax
mov ax,__ax
sahf
ja bol
mov dx,offset men6e
mov ah,9
int 21h
jmp exit
bol:
mov dx,offset bol6e
mov ah,9
int 21h
exit:
mov ax,4C00h
int 21h
.data
__ax dw 0
__100 dw 100
__1000 dw 1000
bol6e db 'Bol6e',0Dh,0Ah,'$'
men6e db 'Men6e',0Dh,0Ah,'$'
end start
Вот такая херь мне тока что выдала пральный результат
Posted: Sat Nov 05, 2005 11:57 am
by EXIS
Ты юзаешь команды для чисел без знака типа ja,jb
А мне нужно со знаком типа jg,jl
Короче попробую сам разобраться.
Posted: Sat Nov 05, 2005 12:00 pm
by sid1333
Кстати я так и не понял почему fstsw сразу в ax не записал

Точнее чё масм ругается?
Posted: Sat Nov 05, 2005 12:04 pm
by sid1333
Гм... действительно както странно
Posted: Sat Nov 05, 2005 3:46 pm
by mike.dld
Не забывайте про FINIT (FNINIT)
Posted: Sat Nov 05, 2005 5:16 pm
by EXIS
Sid походу ты прав.
Мне кажется нужно полюбому использовать только ja,jb вместо jg,jl т.к. SF неустанавливается а он влияет на jg и gl
завтра точно проверю.
Posted: Sat Nov 05, 2005 6:41 pm
by sid1333
Как то это странно. В C/C++ еси написать if (a < b) {...}else {...}, где a и b например -100.0f и 100.0f то всё скомпилится нормально и мы попадём в 1ую скобку. То есть и с отрицательными числами проблем нет
Posted: Sun Nov 06, 2005 9:46 am
by EXIS
Проверил, при сравнении с FPU полюбому используются только команды ja,jna,jb,nb,je,jne
при этом знак все равно учитывается, короче исправленный код выглядит так:
fld dword ;st1
fld dword [a] ;st0
fcompp
fstsw ax
sahf
jnb metka
действия
metka:
Posted: Sun Nov 06, 2005 9:33 pm
by mike.dld
Надо бы вам знать, что все вычисления в FPU происходят над 80-разрядными знаковыми числами.
А вообще, читай вы документацию Интела, таких проблем и вопросов не возникало бы.
Posted: Mon Nov 07, 2005 7:35 pm
by EXIS
mike.dld wrote:Надо бы вам знать, что все вычисления в FPU происходят над 80-разрядными знаковыми числами.
А вообще, читай вы документацию Интела, таких проблем и вопросов не возникало бы.
Сижу целыми днями читаю

Из-за ткой фиххни я в документацию не лезу. Просто я хотел быстро получить точный ответ от тех кто с этим сталкивался, в итоге все равно пришлось почти одному все проверять. Бывает...
