水平不强的千万别看!!!
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_dwPara180 dw 180
_CalcX proc _dwDegree,_dwRadius
local @dwReturn
fild dwCenterX ;压栈
fild _dwDegree ;压栈
fldpi ;压入3.14
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老罗书上 第七章的源代码 求解释
fild是将整数转化为长双精FP80压栈(压到st0)
fldpi压入3.1415
难道真没人会吗???
小生我怕怕那 完美的标题吓到了一干众新手!~:dizzy: 我是新手:P 标题很霸气
给跪了
你应该查查关于FPU的相关知识。。代码的总体思想就是用浮点处理器。。然后根据上面的公式算出X的坐标。。 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_dwPara180 dw 180
_CalcX proc _dwDegree,_dwRadius
local @dwReturn
fild dwCenterX // 圆心坐标入栈
fild _dwDegree // 角度入栈
fldpi // PI入栈
fmul // 角度 * PI
fild _dwPara180 // 180入栈
fdivp st(1),st ;角度*Pi/180
fsin ;Sin(角度*Pi/180) ( 几何知识 1度 = PI / 180 )
fild _dwRadius // 剩下的就是你注释的那样。。
fmul ;半径*Sin(角度*Pi/180)
fadd ;X+半径*Sin(角度*Pi/180)
fistp @dwReturn
mov eax,@dwReturn
ret
_CalcX endp _CalcX proc _dwDegree,_dwRadius ;角度,半径
local @dwReturn ;存储X坐标结果
fild dwCenterX ;将圆心x按整型放入st0(浮点栈顶)
fild _dwDegree ;将角度按整型放入st0(浮点栈顶),别的浮点数据栈+1
fldpi ;将圆周率压入浮点栈
fmulp st(1),st ;角度*圆周率(没有操作数的隐含规则:st(1),st(0)),清空参数1和参数2并将结果放入栈顶(st0)
;fistp @dwReturn
;操作完成后st(1)和st(0)会被清空,别的栈会上升,结果保存在st(0)
;如果fmul操作后带有参数,那么栈不会清空,并且把结果存放至参数1
;参数后面加上P代表弹出栈顶,fmulp st(1),st中的结果放在了参数1中,不是st(0)
fild _dwPara180 ;将类型为【字】的数据180按整型放入栈顶
fdivp st(1),st ;【角度*Pi】/180并把结果存放至st0
;参数1和参数2都会被清空,结果存在栈顶
fsin ;Sin(角度*圆周率/180)
fild _dwRadius ;将半径按整型放入st0
fmulp st(1),st(0) ;半径*Sin(角度*圆周率/180)【隐含操作数:st(1),st(0)】
faddp st(1),st(0) ;X+半径*Sin(角度*圆周率/180)
fistp @dwReturn ;将st(0)按整型存储至@dwReturn并将st(0)弹出
mov eax,@dwReturn ;将数据放入eax
ret
_CalcX endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 Y 坐标
; Y = 圆心Y - Cos(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CalcY proc _dwDegree,_dwRadius ;;角度,半径
local @dwReturn ;存储Y坐标结果
fild dwCenterY ;将圆心y按整型放入栈顶
fild _dwDegree ;将角度按整型放入栈顶
fldpi ;将圆周率放入栈顶
fmulp st(1),st(0) ;(角度*圆周率)st(0)和st(1)相乘后清空st(0)和st(1)并把结果放入栈顶
;参数后面加上P代表弹出栈顶,fmulp st(1),st中的结果放在了参赛1中,不是st(0)
fild _dwPara180 ;将180按整型存入栈顶
fdivp st(1),st ;参数1除以参数2后清空st(0)和st(1)并将结果放入栈顶
fcos ;Cos(角度*圆周率/180)
fild _dwRadius ;将半径存放至栈顶
fmulp st(1),st(0) ;半径*Cos(角度*圆周率/180)【隐含操作数:st(1),st(0)】
fsubp st(1),st ;参数1减去参数2,将结果存放至st(1),并且将st(0)弹出
fistp @dwReturn ;将st(0)按照整型存储至@dwReturn并弹出st(0)
mov eax,@dwReturn ;将数据放入eax
ret
_CalcY endp
页:
[1]