汇编语言计算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总结 ============= ...
随机推荐
- Python-递加计数器
计数本:number.txt 1 2 3 4 主程序:计数器 # Author: Stephen Yuan # 递加计算器 import os # 递加计算器 def calc(): file_siz ...
- VS2012 C# 连接MySQL数据库
原则:不安装 1.下载: https://dev.mysql.com/downloads/connector/net/6.8.html#downloads 2.解压 → 3.添加引用(一个MySql. ...
- linux中 bashrc文件的alias添加快捷命令
alias (为了简化命令操作,节省时间) 进入 /home下的用户,假设为 web 执行命令 ls -alh 找到 .bashrc 隐藏文件,如果没有则新建 通过 vi .bashrc 在里 ...
- 说下spring生命周期
面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧 Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...
- 开源项目初涉(C++自我学习开始)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://i.cnblogs.com/EditPosts.aspx?postid=8428885 临近2018农历新年,我还在上班,哈哈. ...
- git 第一次提交代码
git init git add README.md git commit -m "first commit" git remote add origin https://git. ...
- leetcode152
class Solution { public: int maxProduct(vector<int>& nums) { if(nums.empty()) ; ) ]; ]; // ...
- 如何将R中的data frame对象的数据导入到DB
在使用ARIMA模型来预测我们的销量的时候,如果保存预测版本进DB,以供后续分析呢 1. 在定义变量阶段我们定义了dfResult <- data.frame() 这是一个data f ...
- 详解vue组件的is特性:限制元素&动态组件
在vue.js组件教程的一开始提及到了is特性 意思就是有些元素,比如 ul 里面只能直接包含 li元素,像这样: <ul> <li></li> </ul&g ...
- Python:Fintech产品的第一语言
来源商业新知,原标题:为什么说Python是Fintech与金融变革的秘密武器 人生苦短,不止程序员,Python正在吸引来自金融领域大佬们的青睐目光. 金融科技的风口下,无数传统金融人都想从中掘一桶 ...