具体实现函数,注释已经给出。
.686
.387
.model flat, stdcall
option casemap : none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
Table EQU THIS BYTE;//宏定义 定义了9个初值分别为1,2,3,4...9的字节单元,Table为这些字节单元的首地址
COUNT = 1
REPT 9
DB COUNT
COUNT = COUNT + 1
ENDM
F REAL4 ?
T DW ? ; //临时变量Temp,用于存放1+2+3...+9的值,并从整形转换成实数类型的跳板
L1 REAL4 0.000001
C1 REAL4 0.000001
TWO REAL4 2.0
ONE REAL4 1.0
ZERO REAL4 0.0
_size DW 80
.code
start:
MOV CX, 9;//设置循环次数
FLD ZERO;//给栈顶置零
LEA ESI, Table;//把DS:Table的偏移地址给ESI,用于寄存器间接寻址
sum:
CMP CX, 0
JE calculation;//如果CX为零则跳转到calculation段
MOV AX, 0
MOV AL, [ESI]
MOV T, AX
FILD T;//FILD指令将16位 32位或者64位有符号整数源操作数转换为双精度浮点数,并加载到ST(0)。源操作数符号保留。FILD支持的内存操作数类型和MOV一致
FADD
ADD ESI, 1
LOOP sum;//本来这句是CX为零就不执行跳转的语句,但是不知道为什么没有实现????
calculation:
FSTP ST(2)
FLD L1; //将L1入栈
FMUL C1; //ST < -(C1) * (ST)
FSQRT; //ST < -sqrt(ST)
FMUL TWO; //ST < -(TWO) * (ST)
FLDPI; //ST < -PI
FMUL;//ST<-ST(1)*ST
FLD ONE;//ST <- 1
FDIVR;//ST <- ST/ST(1)
FLD ST(2)
FMUL
FSTP F;//F<-ST
invoke ExitProcess,NULL
end start