鱼C论坛

 找回密码
 立即注册
查看: 2403|回复: 7

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

[复制链接]
发表于 2012-2-14 21:45:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; 计算时钟圆周上某个角度对应的 X 坐标
  3. ; X = 圆心X + Sin(角度) * 半径
  4. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  5. _dwPara180        dw        180
  6. _CalcX                proc        _dwDegree,_dwRadius
  7.                 local        @dwReturn

  8.                 fild        dwCenterX        ;压栈
  9.                 fild        _dwDegree        ;压栈
  10.                 fldpi                                        ;压入3.14
  11.                 fmul                        ;角度*Pi
  12.                 fild        _dwPara180
  13.                 fdivp        st(1),st        ;角度*Pi/180
  14.                 fsin                        ;Sin(角度*Pi/180)
  15.                 fild        _dwRadius
  16.                 fmul                        ;半径*Sin(角度*Pi/180)
  17.                 fadd                        ;X+半径*Sin(角度*Pi/180)
  18.                 fistp        @dwReturn
  19.                 mov        eax,@dwReturn
  20.                 ret

  21. _CalcX                endp
复制代码
老罗书上 第七章的源代码 求解释
fild是将整数转化为长双精FP80压栈(压到st0)
fldpi压入3.1415
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-14 22:44:53 | 显示全部楼层
难道真没人会吗???
小生我怕怕那
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 09:07:47 | 显示全部楼层
完美的标题吓到了一干众新手!~:dizzy:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 09:40:49 | 显示全部楼层
我是新手:P
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 23:02:38 | 显示全部楼层
标题很霸气
给跪了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-15 23:15:48 | 显示全部楼层
你应该查查关于FPU的相关知识。。代码的总体思想就是用浮点处理器。。然后根据上面的公式算出X的坐标。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 21:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表