关于罗云彬第7章时钟程序坐标计算的分析
2008-10-03 09:50
507 查看
本来我已进行到第八章,可是有些问题还要向前查找,这一查就发现了很多问题,如第203页程序的子程序计算时钟圆周上某个角度对应的X坐标 X=圆心X+Sin(角度)*半径
_dwPara180 dw 180
_CalcX proc _dwDegree,_dwRadius
local @dwReturn
fild dwCenterX
fild _dwDegree
fldpi
fmul
fild _dwPara180
fdivp st(1),st
fsin
fild _dwRadius
fmul
fadd
fistp @dwReturn
mov eax,@dwReturn
ret
_CalcX endp
发现问题了,现在我把FPR八个通用数据寄存器中的内容演示一下:
从这时算的结果就不一样了fadd的结果是st(0)的内容是dwRadius*sin(PI*_dwDegree/180)+sin(PI*_dwDegree/180),不和书上一样了。
我把书上的程序用OllyDBG编译了一下,结果发现
发灰的地方就是程序_CalcX程序的内容,这和源程序不一样。fmul变成了fmulp st(1),st
fadd变成了faddp st(1),st ,其它都一样。
接着在一本国外的教材上看到了对无参数浮点运算的如下解释:fmul (none) ; pops ST and ST(1), multiplies them and pushes to stack.
fdiv (none) ; pop ST and ST(1), calculates ST(1)/ST pushes quotient onto th estack
fsub (none) ; pops ST and ST(1), calculates ST(1)-ST; and pushes the difference into the stack
fadd (none) ;pops both ST and ST(1), adds these values and pushes the sum onto the stack top
这样来说fadd可以解释为faddp st(1),st
fmul可解释为fmulp st(1),st
这下就全明白了。
所以这段程序栈内的内容可以演示如下:
@dwReturtn中存dwCenterX+_dwRadius*sin(PI*_dwDegree/180)值。
_dwPara180 dw 180
_CalcX proc _dwDegree,_dwRadius
local @dwReturn
fild dwCenterX
fild _dwDegree
fldpi
fmul
fild _dwPara180
fdivp st(1),st
fsin
fild _dwRadius
fmul
fadd
fistp @dwReturn
mov eax,@dwReturn
ret
_CalcX endp
发现问题了,现在我把FPR八个通用数据寄存器中的内容演示一下:
从这时算的结果就不一样了fadd的结果是st(0)的内容是dwRadius*sin(PI*_dwDegree/180)+sin(PI*_dwDegree/180),不和书上一样了。
我把书上的程序用OllyDBG编译了一下,结果发现
发灰的地方就是程序_CalcX程序的内容,这和源程序不一样。fmul变成了fmulp st(1),st
fadd变成了faddp st(1),st ,其它都一样。
接着在一本国外的教材上看到了对无参数浮点运算的如下解释:fmul (none) ; pops ST and ST(1), multiplies them and pushes to stack.
fdiv (none) ; pop ST and ST(1), calculates ST(1)/ST pushes quotient onto th estack
fsub (none) ; pops ST and ST(1), calculates ST(1)-ST; and pushes the difference into the stack
fadd (none) ;pops both ST and ST(1), adds these values and pushes the sum onto the stack top
这样来说fadd可以解释为faddp st(1),st
fmul可解释为fmulp st(1),st
这下就全明白了。
所以这段程序栈内的内容可以演示如下:
@dwReturtn中存dwCenterX+_dwRadius*sin(PI*_dwDegree/180)值。
相关文章推荐
- 一个关于时间的故事(通过历史分析解决程序问题)
- 一个关于时间的故事(通过历史分析解决程序问题)
- 关于VB 6 中 DoEvents 导致主窗体关闭后程序无法退出的分析
- 关于计算Java程序运行时间
- 关于windows程序显示鼠标所在坐标
- 关于计算程序运行时间的方法汇总
- 关于计算java程序运行时间
- 关于DrawText的基准线纵坐标的计算
- 关于Spark运行流式计算程序中跑一段时间出现GC overhead limit exceeded
- 关于hadoop集群的简单性能测试——mapreduce性能,hive性能,并行计算分析(原创)
- 基金计算程序(asp.net)功能分析
- php中关于长度计算容易混淆的问题分析
- 关于数学分析的计算题III(极限)
- 关于程序自校验的一些分析
- 利用MATLAB计算三维坐标序列距离误差程序
- 带有导航栏的视图坐标计算与详细分析
- highcharts图表常见问题:关于如何设置数据点起始位置为坐标原点的问题分析与总结篇(独家爆料)
- 关于从NAND Flash启动的问题,2440 启动问题 , 拷贝4k程序 ,启动代码分析
- 一个关于时间的故事(通过历史分析解决程序问题)