Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: