完美主义 发表于 2012-2-14 21:45:21

水平不强的千万别看!!!

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 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

完美主义 发表于 2012-2-14 22:44:53

难道真没人会吗???
小生我怕怕那

莫名其妙 发表于 2012-2-15 09:07:47

完美的标题吓到了一干众新手!~:dizzy:

赵璐 发表于 2012-2-15 09:40:49

我是新手:P

唯舆之缌 发表于 2012-2-15 23:02:38

标题很霸气
给跪了

chao_prince 发表于 2012-2-15 23:15:48

你应该查查关于FPU的相关知识。。代码的总体思想就是用浮点处理器。。然后根据上面的公式算出X的坐标。。

chao_prince 发表于 2012-2-15 23:20:43

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 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

xing59741 发表于 2012-8-13 17:00:15

_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]
查看完整版本: 水平不强的千万别看!!!