Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C++ by kokmAn ( 16 years ago )
/*Ассемблерная команда процессора 80287 FSTSW АХ копирует содержимое его регистра состояния (фиксирующий коды условий)
в регистр АХ процессора 80286. Затем коды условий проверяются командами этого процессора.
Для этого применяется интересный прием. В процессоре 80286 есть команда SAHF (запомнить содержимое регистра АН во флажках)
, которая была введена в микропроцессор 8086 ради совместимости с микропроцессором 8080.
Если сравнить два числа с плавающей точкой с помощью команды FCOM, затем передать содержимое регистра состояния процессора
80287 в регистр АХ командой FSTSW, а содержимое регистра АН во флажки с помощью команды SAHF, то получится результат.
В частности, бит С3 попадает во флажок нуля ZF, а бит С0 - во флажок переноса CF. Теперь можно убедиться, что результат
команды FCOM по установке флажков такой же как и команды СМР процессора 80286 за исключением, конечно, условия "не сравнимы",
которого не может быть в процессоре 80286. Например, команды FCOM FSTSW АХ SAHF JE noaccident осуществляют переход к метке
noaccident, если ST(0) = ST(1). Размещение бит кода условия в регистре состояния и значения кода условия от команд FCOM и FTST
выбраны так, чтобы правильно работал показанный.*/
#include <cstdlib>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
int sgn = 0;
int IntPart = 0;
float help;
float num= -23.33;
float LesOne = 0.1;
float one = 1;
float ten = 10;
float zero = 0;
int man = 0;
int acc = 7;
float res = 0;
//scanf ("%f", #);
__asm{
fld num
fcom zero
fstsw ax
sahf
jb _sgn
jmp _next
_sgn:
mov sgn, 1
fabs
_next:
fcom one
fstsw ax
sahf
ja _div
jb _mul
_div:
fdiv ten
add man, 1
fcom one
fstsw ax
sahf
ja _div
jmp _end
_mul:
fcom LesOne
fstsw ax
sahf
ja _end
_mul2:
fmul ten
fstp num
fld num
sub man, 1
fcom LesOne
fstsw ax
sahf
jb _mul2
jmp _end
_end:
mov ecx, acc
sub ecx, 1
get_num:
fmul ten
loop get_num
fistp IntPart
}
char* begin = "0.";
if (sgn)
begin = "-0.";
printf ("%s%d%c%d", begin, IntPart, 'E', man);
return 0;
}
Revise this Paste