请教罗云彬汇编中的一段程序
罗云彬win32汇编第7章Clock.asm,也就是第203页 程序段 _CalcX_CalcX proc _dwDegree,_dwRadius
local @dwReturn
fild dwCenterX
fild _dwDegree
fldpi
fmul ;角度*Pi
fild _dwPara180
fdivp st(1),st ;角度*Pi/180
fsin ;Sin(角度*Pi/180)
fild _dwRadius
fmul ;半径*Sin(角度*Pi/180)
fadd ;X+半径*Sin(角度*Pi/180)
fistp @dwReturn
mov eax,@dwReturn
ret
_CalcX endp
用的是浮点指令,用到了浮点数据寄存器,FPU共有8个浮点数据寄存器,FPR0---FPR7相连并组成一个循环。fild是入栈指令,如果一个整数压入了浮点数据寄存器中就自动被转换成了浮点数,一st0至st7动态表示8个寄存器,并不一定是st0表示FPR0、st7表示FPR7,
现在看一下操作数的载入过程。当第一次载入时候,数据被存放在ST,以后每次操作,堆栈上升,开始被载入的操作数也随之上移,
直到ST(7)。比如:
load a : ST(0) = a; ST(1) = 0; ST(2) = 0.....
load b : ST(0) = b; ST(1) = a; ST(2) = 0.....
load c : ST(0) = c; ST(1) = b; ST(2) = a.....
而这段程序的入栈时
fild dwCenterX ;st(0)=dwCenterX
fild _dwDegree ;st(0)=_dwDegree,st(1)=dwCenterX
fldpi ;st(0)=PI,st(1)=_dwDegree,st(2)=dwCenterX
fmul ;st(0)=PI*_dwDegree,st(1)=_dwDegree,st(2)=dwCenterX;fmul指的是st(0)<-st(0)*st(1)
fild _dwPara180 ;st(0)=180,st(1)=PI*_dwDegree,st(2)=_dwDegree,st(3)=dwCenterX
fdivp st(1),st ;st(1)=st(0)/st(1);也就是说 st(1)=180/(PI*_dwDegree),而不是书上说的 角度*PI/180,是不是哪里不对呢,请大家帮忙。