1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
; Static Name Aliases
;
TITLE polevl
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
PUBLIC _polevl
PUBLIC _p1evl
_DATA SEGMENT
EXTRN __chkstk:NEAR
EXTRN __fac:NEAR
EXTRN __fltused:NEAR
$T20001 DQ 0000000000H ; .0000000000000000
ans DQ 0
ctrlw DW 0
_DATA ENDS
_TEXT SEGMENT
PUBLIC _polevl
_polevl PROC NEAR
push bp
mov bp,sp
mov ax,12
call __chkstk
push si
mov si,[bp+12]
; fstcw ctrlw
; fwait
; mov ax,ctrlw
; or ax,00100h
; mov ctrlw,ax
; fldcw ctrlw
fldz
fwait
mov ax,[bp+14]
inc ax
mov [bp-12],ax
$D15:
fmul QWORD PTR [bp+4]
add si,8
fwait
fadd QWORD PTR [si-8]
fwait
dec WORD PTR [bp-12]
jne $D15
fstp ans
; fstcw ctrlw
; fwait
; mov ax,ctrlw
; and ax,0feffh
; mov ctrlw,ax
; fldcw ctrlw
lea ax, ans
fwait
pop si
mov sp,bp
pop bp
ret
_polevl ENDP
PUBLIC _p1evl
_p1evl PROC NEAR
push bp
mov bp,sp
mov ax,12
call __chkstk
push si
; fstcw ctrlw
; fwait
; mov ax,ctrlw
; or ax,00100h
; mov ctrlw,ax
; fldcw ctrlw
mov si,[bp+12]
fld QWORD PTR [bp+4]
add si,8
fadd QWORD PTR [si-8]
fwait
mov ax,[bp+14]
dec ax
mov [bp-12],ax
$D26:
fmul QWORD PTR [bp+4]
add si,8
fadd QWORD PTR [si-8]
fwait
dec WORD PTR [bp-12]
jne $D26
fstp ans
lea ax, ans
; fstcw ctrlw
; fwait
; mov ax,ctrlw
; and ax,0feffh
; mov ctrlw,ax
; fldcw ctrlw
fwait
pop si
mov sp,bp
pop bp
ret
_p1evl ENDP
_TEXT ENDS
END
|