汇编语言计算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总结 ============= ... 
随机推荐
- docker 批量删除
			杀死所有正在运行的容器docker kill $(docker ps -a -q) 删除所有已经停止的容器docker rm $(docker ps -a -q) 删除所有未打 dangling 标签 ... 
- oracle数据库组件列表及相关的数据字典视图
			Component Data dictionary tables and views Database V$DATABASE, V$VERSION, V$INSTANCEShared server V ... 
- 刘志梅  201771010115 《面向对象程序设计(java)》 第八周学习总结
			实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 接口定义:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义:由常量和一组抽象方法组成:接 ... 
- 【亲测】在网页上查找接口,Network--XHR,出来的每个Name都是后台的一个接口
- win7+win10系统使用日常经验集锦
			请保留此份 Cmd Markdown 的欢迎稿兼使用说明, 当然你也可以使用彩色字体. 或者使用小体字. 或者使用大体字. 如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键 Ctrl+Al ... 
- scp: command not found
			scp 不能用? [root@doc]# scp jdk-8u144-linux-x64.tar.gz root@10.10.10.17:/root/ root@10.10.10.17's passw ... 
- 再谈PHP设计模式
			设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数必须声 ... 
- (转)2018CRM系统最新排行榜
			https://www.jianshu.com/p/718cc29de91f 2018CRM系统最新排行榜 深谷幽兰呼 关注 2018.09.04 10:22 字数 1524 阅读 3182评论 0喜 ... 
- springcloud-知识点总结(三):Hystrix & Dashboard & turbine & Zuul & SpringCloud Config
			1.Hystrix断路器简介 Hystrix断路器简介 hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因 ... 
- BlockTrain网络
			[BlockTrain网络] 1.每个节点都参与全⽹络的路由功能,同时也可能包含其他功能.每个节点都参与验证并传播交易及区块信息,发现并维持与对等节点的连接.在图6-1所⽰的全节点⽤例中,名为“⽹络路 ... 
