Как сравнить две float переменные и сделать переход в зависимости от резултата? Сравнение со знаком. Задача такая:
IF (a>b) then действия;
Делаю на асме
fld dword ;st1
fld dword [a] ;st0
fcompp
fstsw ax
sahf
jnl metka
действия
metka:
Но работает неправильно.
Вопрос по FPU
А как точно "неправильно работает"?? Вроде как всё верно написано...
У меня получается что
+10.5 > +150.5
А я правильно переменные в стек затолкал может наоборот или условие в jmp поменять надо?
+10.5 > +150.5
А я правильно переменные в стек затолкал может наоборот или условие в jmp поменять надо?
.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
Вот такая херь мне тока что выдала пральный результат
.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
Вот такая херь мне тока что выдала пральный результат
Ты юзаешь команды для чисел без знака типа ja,jb
А мне нужно со знаком типа jg,jl
Короче попробую сам разобраться.
А мне нужно со знаком типа jg,jl
Короче попробую сам разобраться.
Кстати я так и не понял почему fstsw сразу в ax не записал Точнее чё масм ругается?
Гм... действительно както странно
Не забывайте про FINIT (FNINIT)
Sid походу ты прав.
Мне кажется нужно полюбому использовать только ja,jb вместо jg,jl т.к. SF неустанавливается а он влияет на jg и gl
завтра точно проверю.
Мне кажется нужно полюбому использовать только ja,jb вместо jg,jl т.к. SF неустанавливается а он влияет на jg и gl
завтра точно проверю.
Как то это странно. В C/C++ еси написать if (a < b) {...}else {...}, где a и b например -100.0f и 100.0f то всё скомпилится нормально и мы попадём в 1ую скобку. То есть и с отрицательными числами проблем нет
Проверил, при сравнении с FPU полюбому используются только команды ja,jna,jb,nb,je,jne
при этом знак все равно учитывается, короче исправленный код выглядит так:
fld dword ;st1
fld dword [a] ;st0
fcompp
fstsw ax
sahf
jnb metka
действия
metka:
при этом знак все равно учитывается, короче исправленный код выглядит так:
fld dword ;st1
fld dword [a] ;st0
fcompp
fstsw ax
sahf
jnb metka
действия
metka:
Надо бы вам знать, что все вычисления в FPU происходят над 80-разрядными знаковыми числами.
А вообще, читай вы документацию Интела, таких проблем и вопросов не возникало бы.
А вообще, читай вы документацию Интела, таких проблем и вопросов не возникало бы.
Сижу целыми днями читаю Из-за ткой фиххни я в документацию не лезу. Просто я хотел быстро получить точный ответ от тех кто с этим сталкивался, в итоге все равно пришлось почти одному все проверять. Бывает...mike.dld wrote:Надо бы вам знать, что все вычисления в FPU происходят над 80-разрядными знаковыми числами.
А вообще, читай вы документацию Интела, таких проблем и вопросов не возникало бы.
Who is online
Users browsing this forum: No registered users and 10 guests