Assembler







. ,

.
.
. 7.25.
 

. NAN, ,
8087,
. -
FXAM, .
,
, .
 

. ( ,
"-") , .
,
E 10.
, ,
.

,
8087.
 
.
. , 1234
3; , 103 104.
,
( ) 10
. 1 10.
108.
; - ,
- .

Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:04:46
. 7.25 Page 1-1
 
PAGE ,132
TITLE . 7.25
0000 CODE SEGMENT PUBLIC
ASSUME CS:CODE,DS:CODE,ES:CODE
EXTRN TEN_TO_X:NEAR
0000 ???? OLD_CW DW ?
0002 ???? NEW_CW DW ?
0004 ???? EXPONENT DW ?
0006 ??????????????????? BCD_RESULT DT ?
?
0010 ??????????????????? BCD_EXPONENT DT ?
?
001A 00E1F505 TEN8 DD 100000000
001E 20 20 20 20 20 20 20 PRINT_STRING DB ' E ',10,13,'$'
20 20 45 20 20 20 20
0A 0D 24
 
. 7.25 ()
PUBLIC FLOAT_ASCII
;--------------------------------------------
;
; 8087
; .
; : ST(0)
; : ;
; 8087
;--------------------------------------------
002F FLOAT_ASCII PROC NEAR
;-----ST(0)-----;-----ST(1)-----;--ST(2)--
; X ; ? ; ?
002F 9B D9 C0 FLD ST(0) ; X ; X ; ?
0032 9B D9 E1 FABS ; |X| ; X ; ?
0035 9B D9 E8 FLD1 ; 1 ; |X| ; X
0038 9B D9 C9 FXCH ST(1) ; |X| ; 1 ; X
003B 9B D9 F1 FYL2X ; LOG2(X) ; X ; ?
003E 9B D9 E9 FLDL2T ; LOG2(10) ; LOG2(X) ; X
0041 9B DE F1 FDIVRP ST(1),ST(0) ; E=LOGX/LOG10 ; X ; ?
0044 D9 3E 0000 R FNSTCW OLD_CW ; ; ;
0048 9B FWAIT ; ; ;
0049 A1 0000 R MOV AX,OLD_CW ; ; ;
004C 25 F3FF AND AX,NOT 0C00H ; ; ;
004F 0D 0400 OR AX,0400H ; ; ;
0052 A3 0002 R MOV NEW_CW,AX ; ; ;
0055 9B D9 2E 0002 R FLDCW NEW_CW ; ; ;
005A 9B D9 FC FRNDINT ; I = INT(E) ; X ; ?
005D 9B D9 2E 0000 R FLDCW OLD_CW ; ; ;
0062 9B DF 16 0004 R FIST EXPONENT ; I ; X ; ?
0067 9B D9 E0 FCHS ; -I ; X ; ?
006A E8 0000 E CALL TEN_TO_X ; 10 ** (-I) ; X ; ?
006D 9B DE C9 FMULP ST(1),ST(0) ; X/10**I ; ? ; ?
0070 9B DA 0E 001A R FIMUL TEN8 ; ࠠ ; ? ; ?
0075 9B DF 36 0006 R FBSTP BCD_RESULT ; ? ; ? ; ?
007A 9B DF 06 0004 R FILD EXPONENT ; I ; ? ; ?
007F 9B DF 36 0010 R FBSTP BCD_EXPONENT ; ? ; ? ; ?
;----- ,
; -
0084 FC CLD
0085 8D 3E 001E R LEA DI,PRINT_STRING ;
;
0089 A0 000F R MOV AL,BYTE PTR BCD_RESULT+9
008C E8 00C3 R CALL PRINT_SIGN ;
008F A0 000A R MOV AL,BYTE PTR BCD_RESULT+4
0092 E8 00DF R CALL PRINT_NYBBLE ;
0095 B0 2E MOV AL,'.' ;
0097 AA STOSB
0098 8D 1E 0009 R LEA BX,BCD_RESULT+3
009C B9 0004 MOV CX,4 ; 8 (16 )
009F DO_BYTE: ;
009F E8 00CD R CALL PRINT_BYTE
00A2 E2 FB LOOP DO_BYTE
00A4 B0 45 MOV AL,'E' ;
00A6 AA STOSB
 
. 7.25 ()
00A7 A0 0019 R MOV AL,BYTE PTR BCD_EXPONENT+9
00AA E8 00C3 R CALL PRINT_SIGN ;
00AD A0 0011 R MOV AL,BYTE PTR BCD_EXPONENT+1
00B0 E8 00DF R CALL PRINT_NYBBLE ;
00B3 8D 1E 0010 R LEA BX,BCD_EXPONENT
00B7 E8 00CD R CALL PRINT_BYTE ;
00BA 8D 16 001E R LEA DX,PRINT_STRING
00BE B4 09 MOV AH,9H
00C0 CD 21 INT 21H ;
00C2 C3 RET
00C3 FLOAT_ASCII ENDP
 
;----- ' ' '+'
00C3 PRINT_SIGN PROC NEAR
00C3 3C 00 CMP AL,0 ;
00C5 B0 20 MOV AL,' ' ;
00C7 74 02 JZ POSITIVE
00C9 B0 2D MOV AL,'-' ;
00CB POSITIVE:
00CB AA STOSB ;
00CC C3 RET
00CD PRINT_SIGN ENDP
 
;----- ,
; [BX]
 
00CD PRINT_BYTE PROC NEAR
00CD 8A 07 MOV AL,[BX] ;
00CF 51 PUSH CX
00D0 B1 04 MOV CL,4
00D2 D2 E8 SHR AL,CL ;
00D4 59 POP CX
00D5 E8 00DF R CALL PRINT_NYBBLE ;
00D8 8A 07 MOV AL,[BX] ;
00DA E8 00DF R CALL PRINT_NYBBLE ;
00DD 4B DEC BX ;
00DE C3 RET
00DF PRINT_BYTE ENDP
 
;----- AL
 
00DF PRINT_NYBBLE PROC NEAR
00DF 24 0F AND AL,0FH ;
00E1 04 30 ADD AL,'0' ;
00E3 AA STOSB ;
00E4 C3 RET
00E5 PRINT_NYBBLE ENDP
00E5 CODE ENDS
END
 
. 7.25 ()
 

. 10

Log10(X) = Log2(X)/Log2(10)
 
,
. ,
10X,
. TENB
( 108) ,
. , FBSTP
;
, - .
 
,

. .
;
PRINT_BYTE ,
PRINT_NYBBLE . ,
XLAT,
0 9. ( -
,
).
 
,
. ,
( 101234)
, . ,
, ,
. ,
, , ,
. 0,
0.00000000E-932. ,
; 8087 0
(-4932) .
ASCII,
( ,
).
, ,
( , FTST) ,
, .