汇编语言计算Sin,Cos,Pow函数
填了一下之前的坑。首先是一个题外话,在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
汇编语言计算Sin,Cos,Pow函数的更多相关文章
- C语言pow()函数的计算精度问题
编程计算 a+aa+aaa+-+aa-a(n个a)的值,n和a的值由键盘输入.例如,当n=4,a=2,表示计算2+22+222+2222的值. 程序运行结果示例: Input a,n: 2,4↙ su ...
- pow函数(数学次方)在c语言的用法,两种编写方法实例( 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)
关于c语言里面pow函数,下面借鉴了某位博主的一篇文章: 头文件:#include <math.h> pow() 函数用来求 x 的 y 次幂(次方),x.y及函数值都是double型 , ...
- pow()函数结果强制转化为int造成误差的分析
开发环境:codeblocks,编译器gcc 在计算102时调用pow(10, 2),再强制类型转换为int类型后输出: printf(,)); 得到的结果却是:99 这是因为 double pow( ...
- Python3 pow() 函数
Python3 pow() 函数 Python3 数字 描述 pow() 方法返回 xy(x的y次方) 的值. 语法 以下是 math 模块 pow() 方法的语法: import math mat ...
- pow函数
pow函数如果直接强制类型转换成int,会导致精度的损失.如果是int的幂计算,建议重写函数.或者用double型进行计算.
- (函数分治法)实现pow函数(x的y次方幂)
题目:实现pow函数. 题目分析:因为一个一个乘,循环太大,参考矩阵连乘问题:对于n=4的话,可以得出x的平方,然后平方与平方相乘.节省计算次数.对于偶数的幂,只要x的平方多次递归调用即可:对于奇数的 ...
- c++ pow函数
函数名称: pow 函数原型: double pow( double x, double y ); 函数功能: 计算x的y次幂 例:z=pow(x,y); x=9,y=8 z就是9 ...
- python实现pow函数(求n次幂,求n次方)
目录 类型一:求n次幂 类型二:求n开方 类型一:求n次幂 实现 pow(x, n),即计算 x 的 n 次幂函数.其中n为整数.pow函数的实现--leetcode 解法1:暴力法 不是常规意义上的 ...
- 初中知识回顾tan,sin,cos关系
如果K=tan, sin 是X x=k/power(1+k*k,0.5) 开平方 cos是y y=1.0/power(1+k*k,0.5) 开平方 gisoracle总结 ============= ...
随机推荐
- Kettle从excel导入数据到sql server
从excel工作表中读取数据逐行执行insert语句插入到sqlserver 为了简单起见只选取了三个个字段作为参数,日期,字符类型的需要加上'' Spoon是作业配置的GUI界面,配置好后可以通过控 ...
- springmvc的简单使用以及ssm框架的整合
Spring web mvc是基于servlet的一个表现层框架 首先创建一个简单的web工程了解它的使用 web.xml的配置 <?xml version="1.0" en ...
- firefox修改语言
下面咱们就可以开始更改设置来让咱们安装好的语言成为默认的语言. 首先在空窗口里输入以下地址:about:config,进入设置页面. 2 请大家定位到general.useragent.locale这 ...
- python3 发送邮件
import smtplibfrom email.mime.text import MIMETextdef SendEmail(fromAdd,toAdd,subject,text): _pwd = ...
- Array.prototype.push.apply(a,b)和Array.prototype.slice.call(arguments)
Array.prototype.push.apply(a,b) 时常看到在操作数组的时候有这样的写法: var a = [1,2,3]; var b = [4,5,6]; a.push.apply(a ...
- Web Worker模拟抢票
web worker工作原理图: 抢票系统思维导图: 思路:五个人(5个div窗口模拟)同时进行抢票,有百分之十的几率可以抢到票,抢到票后对应的窗口(即随机生成的数大于等于0小于9的情况)会编程天蓝色 ...
- cdnbest节点后台的3311如何登陆
如图操作点节点列表中节点管理修改节点3311的权限(因为初次安状节点权限是随机生成的,所以要修改),同时开启3311,然后就能在浏览器登陆节点后台了
- oracle函数nvl, nvl2, nullif
nvl函数 语法: NVL(表达式1, 表达式2) select nvl(s.name, '未填写') from student s 如果表达式1的值为空, 则显示第二个值, 否则显示原来的值, nv ...
- 关于@autoreleasepool
苹果推荐使用场景: 如果你编写的程序不是基于 UI 框架的,比如说命令行工具: 如果你编写的循环中创建了大量的临时对象:(常用) 如果你创建了一个辅助线程. @interface ViewContro ...
- Tomcat的三种部署方式
Tomcat是目前web开发中非常流行的Web 服务器,也就是tomcat在部署项目的时候,必须要把应用程序中所用到的jar包放到tomcat的lib目录下,然后再一起部署到服务器上. 那么tomca ...