汇编编写正弦函数思路
⽂章⽬录
⼀、⽤C语⾔写正弦函数代码
#include
#include
voidmain()
{
floatx,sum,a,b;//sum代表和,a为分⼦,b为分母
chars;
printf("pleainputx");
scanf("%f",&x);
s=1;
sum=0;
a=x;//分⼦赋初值
b=1;//分母赋初值
for(inti=1;a/b>=1e-6;i++)//精确到0.000001
{
sum=sum+s*a/b;//累加⼀项
a=a*x*x;//求下⼀项分⼦x的3,5,7次⽅
b=b*2*i*(2*i+1);//求下⼀项分母1*2*3,1*2*3*4*5,1*2*3*4*5*6*7
s*=-1;
}
printf("sum=%fn",sum);
}
⼆、再翻译为汇编
.data
;定义变量
.code
mainPROC
movecx,6;循环6次,循环越多,越准确
fldcyy118
L1:
;sum=sum+s*a/b
callgetfenzi;获得分⼦
callgetfenmu;获得分母
callFan;乘除-1
loopL1
fldsum
callWriteFloat
getfenziproc
;a=a*x*x;;获得分⼦
getfenziendp
getfenmuproc
;b=b*2*i*(2*i+1);获得分母
getfenmuendp
Fanproc
;s*=-1;乘除-1
Fanendp
mainENDP
ENDmain
其他整形例⼦
;shl乘法4*36=4*2^5+4*2^2
.data
.code
mainPROC
moveax,4
movebx,eax
shleax,5
shlebx,2
addeax,ebx
callWriteInt
mainENDP
ENDmain
;mul乘法⽆符号化3*3
.data
cyy1181DWORD3h
cyy1182DWORD3h
.code
mainPROC
moveax,cyy1181
movebx,cyy1182
mulebx
callWriteInt
mainENDP
ENDmain
;imul乘法有符号化2*-3乘ebx放⼊eax中
.data
cyy1181DWORD2h
cyy1182DWORD-3h
.code
mainPROC
moveax,cyy1181
movebx,cyy1182
imulebx
callWriteInt
mainENDP
ENDmain
;div除法⽆符号化4/2
.data
cyy1181QWORD8h
cyy1182DWORD2h
.code
mainPROC
movedx,DWORDPTRcyy1181+4
moveax,DWORDPTRcyy1181
divcyy1182
callWriteInt
mainENDP
ENDmain
;idiv除法有符号化4/2
.data
cyy1181SDWORD100
cyy1182DWORD-2
.code
mainPROC
moveax,cyy1181
cdq
movebx,cyy1182
idivebx
callWriteInt
mainENDP
ENDmain
其他浮点型例⼦
.data
mainENDP
ENDmain
;32位浮点数I/O测试()
.data
firstREAL8123.456
condREAL810.0
thirdREAL8?
.code
mainPROC
finit;初始化FPU
;两个浮点数⼊栈,并显⽰FPU堆栈.
fldfirst
fldcond
callShowFPUStack
;输⼊两个浮点数,并显⽰它们的乘机
mWrite"Pleaenterarealnumber:"
callReadFloat
mWrite"Pleaenterarealnumber:"
callReadFloat
fmulST(0),ST(1);相乘
mWrite"Theirproductis:"
callWriteFloat
callCrlf
exit
mainENDP
ENDmain
.code
mainPROC
其他浮点型例⼦
.data
var1real83.0;
var2real80.0;
.code
mainPROC
fldvar1;⼊栈st(0)=var1
fldvar2;⼊栈st(0)=var2,st(1)=var1
fmulst(1),st(0);st(0)=var1*var2,st(1)=var1
;减法、乘法、除法将fmul换成fsub、fadd、fdiv.
callWriteFloat;打印
callShowFPUStack;打印
mainENDP
ENDmain
.data
var1real83.0;输⼊
var2real80.0;分⼦
.code
mainPROC
fldvar1;⼊栈st(0)=var1
fldvar2;⼊栈st(0)=var2,st(1)=var1
fmulpst(1),st(0);st(0)=var1*var2
;减法、乘法、除法将fmulp换成fsubp、faddp、fdivp.
callWriteFloat;打印
callShowFPUStack;打印
mainENDP
ENDmain
.data
var1real83.0;输⼊
var2real80.0;分⼦
.code
mainPROC
fldvar1;⼊栈st(0)=var1
fstpvar2;去浮点数ST(0)到var2,var2=var1,执⾏出栈操作st()为空
callWriteFloat;打印
callShowFPUStack;打印
mainENDP
ENDmain
本文发布于:2022-12-08 06:06:05,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/64249.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |