汇编语言计算Sin,Cos,Pow函数
2024-10-15 22:58:52
填了一下之前的坑。首先是一个题外话,在VS2015中默认汇编代码会使用SSE生成,如果想用FPU编译出FLD,FSTP这些指令,需要设置一下。
项目 >> 属性 >> C/C++ >> Code Generation
Enable Enhanced Instruction Set默认是是Not Set,但是会被开启,设置成IA32就行了。
方便生成浮点计算代码时使用。
然后进入正题,Sin,Cos,Pow计算,先上代码
.data ;0.52359877 = 30度 fval1 real4 0.52359877 x real4 3.14 power real4 1.1 ;3.14^1.1 = 3.5206480575123685712125842405755 .code SomeFunction proc fld fval1 fsin ;sin(30度) = 0.5,结果放到st0 fld fval1 fcos ;cos(30度) = 0.86602540378443864676372317075294,结果放到st0 fld fval1 fsincos ;st0 = sin,st1 = cos ;dividend被除数 LabelMyPower: ;x^power = 2^(y*log2(x)) ;3.14^1.1 fld power fld x fyl2x ;fyl2x = y * log2(x) = power * log2(x) = st1 * log2(st0),结果放到st0 = 1.8158411074047422 fld1 fld st(1) ;fyl2x的结果 fprem ;相当于fmod(1.0, fyl2x的结果) = fmod(st0, st1),得到余数部分,结果放到st0 = 0.81584110740474229 f2xm1 ;2^x - 1,st0[-1.0, +1.0],操作数值域为[-1.0, +1.0],所以才有上面的fld1,结果st0 = 0.76032414147020678 fadd ;st0 = 0.76032414147020678,st1 = 1.0,加上上一指令减去的1.0,结果st0 = 1.7603241414702068 fscale ;st0 * 2^(st1取整为1, st1 = 1.8158411074047422) = 1.7603241414702068 * 2^1 = 3.5206482829404137 ;st0 = 2^小数次方 * 2^整数次方 ;fxch st(1) ;fstp st ;st0 = x^power ret SomeFunction endp end
注释都写好了,应该没问题,Sin,Cos不用说了。
Pow函数主要用到了指数和对数的性质,说实话指数对数咋用早忘光了,还好有笔记,下辈子真得考虑做个学霸了,这辈子的数学能力应该没救了。
简单来说,x^y可以化成2^(y*log2(x))这种方法计算。
汇编代码就是先计算y*log2(x)小数部分,求2的指数,再计算整数部分2的指数,再相乘
写汇编Intel手册果然少不了,10年前就听大牛说过这玩意,10年后终于有幸接触了Hello World级汇编编程,可喜可贺,也就比大牛晚个10年而已。
pow汇编代码来自
http://www.madwizard.org/programming/snippets?id=36
最新文章
- Spring之注入的几种方式
- centos7.0安装后ifconfig无法使用
- wordpress 打开卡在1.gravatar.com
- flash flex 程序出现错误 Error #2032
- glyphicon halflings regular ttf 报错
- R.java 文件内报错:Underscores can only be used with source level 1.7 or greater。
- 如何保存CONSOLE LOG
- AngularJS Protractor
- Xcode 项目文件介绍
- org.springframework.web.bind.ServletRequestDataBinde
- Javascript的事件委托
- [C++程序设计]有默认参数的函数
- querySelector $() getElementBy区别
- 2017年你需要一个VPN
- Java中如何封装自己的类,建立并使用自己的类库?
- LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流
- PornHub 正式发布 AI自动标注色情演员引擎
- MySql常用命令集Mysql常用命令3
- Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
- Nginx浅析