欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )

发布时间:2023/12/1 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 ) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1:FLD : FPU(浮点处理器)的加载浮点数到堆栈指令

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array ;直接寻址fld [array+16] ;直接偏移mov esi,OFFSET arrayfld REAL8 PTR[esi] ;间接寻址mov esi,1fld array[esi*8] ;带比例因子的变址fld array[esi*TYPE array] ;带比例因子的变址mov ebx,OFFSET arraymov esi,8fld REAL8 PTR[ebx+esi] ;基址 - 变址mov ebx,3*TYPE array fld array[ebx+esi] ;基址 - 变址 - 偏移量(二维数组的访问方式)mov esi,1fld array[ebx+esi * TYPE array] ;带比例因子的基址 - 变址 - 偏移量fld dblOne ;ST(0) = dblOnefld dblTwo ;ST(0) = dblTwo,ST(1) = dblOneINVOKE ExitProcess,0 main ENDP END main

2:FST_FSTP : FST伪指令将栈顶数据复制到内存,FSTP伪指令将栈顶数据复制到内存,并出栈

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL8 234.56 dblTwo REAL8 10.1 dblThree REAL8 ? dblFour REAL8 ?.code main PROCfld dblOne ;ST(0) = dblOnefld dblTwo ;ST(0)= dblTwo,ST(1) = dblOne;将栈顶数据复制到内存fst dblThree ;10.1fst dblFour ;10.1;将栈顶数据复制到内存,并出栈fstp dblThree ;10.1fstp dblFour ;234.56INVOKE ExitProcess,0 main ENDP END main

3:FCHS_FABS : FCHS伪指令将ST(0)中浮点值的符号取反,FABS伪指令将ST(0)中浮点值的符号去掉,以得到绝对值

.386 .model flat,stdcall.stack ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL4 1.23.code main PROCfld dblOnefchs ;ST(0)中浮点值的符号取反fabs ;ST(0)中浮点值的符号去掉,以得到绝对值INVOKE ExitProcess,0 main ENDP END main

4:FADD_FADDP_FIADD :浮点数据三种相加运算伪指令使用

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL8 234.56 dblTwo REAL8 10.1 myInteger DWORD 1 .code main PROCfld dblOnefld dblTwo;ST(1) 234.56 , ST(0)10.1fadd ;无操作数的用法 ST(0)ST(1)相加,结果暂存在ST(1),然后ST(0)出栈,结果保存在栈顶;ST(0) 244.66fld dblTwo;ST(1) 244.66 ,ST(0)10.1fadd ST(1),ST(0) ;寄存器操作数用法,ST(0)加到ST(1);ST(1) 254.76 ,ST(0)10.1;内存操作数用法fadd dblTwo ;ST(0) += dblTwo mov esi,OFFSET dblTwofadd REAL8 PTR[esi] ;ST(0) += [esi];ST(1)254.76 ST(0)30.3faddp ST(1),ST(0) ;ST(0)加到ST(1),然后ST(0)出栈 ;ST(0)285.06;先将源操作数转换为扩展双精度浮点点,fiadd myInteger ;ST(0) += myIntegerINVOKE ExitProcess,0 main ENDP END main

5:FSUB_FSUBP_FISUB : 浮点数据三种相减运算伪指令使用

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL8 10.10 dblTwo REAL8 1.1 myInteger DWORD 1.code main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)减去ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fsub ;内存操作数用法,ST(0)减去内存操作数fsub dblTwo ;ST(0) -= dblTwo;寄存器用法fsub ST(1),ST(0) ;ST(1) -= ST(0) ,ST(0)不出栈;fsubp 指令,会将ST(0)出栈fld dblTwofsubp ST(1),ST(0) ;ST(1) -= ST(0) ,然后ST(0)出栈;整数减法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中减去该操作数FISUB myInteger ;ST(0) -= myInteger INVOKE ExitProcess,0 main ENDP END main

6:FMUL_FMULP_FIMUL : 浮点数据三种相乘运算伪指令使用

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL8 10.10 dblTwo REAL8 1.1 myInteger DWORD 1.code main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)乘以ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fmul;内存操作数用法,ST(0)乘以内存操作数fmul dblTwo ;ST(0) *= dblTwo;寄存器用法fmul ST(1),ST(0) ;ST(1) *= ST(0) ,ST(0)不出栈;fmulp 指令,会将ST(0)出栈fld dblTwofmulp ST(1),ST(0) ;ST(1) *= ST(0) ,然后ST(0)出栈;整数乘法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中乘以该操作数fimul myInteger ;ST(0) *= myInteger INVOKE ExitProcess,0 main ENDP END main

7:FDIV_FDIVP_FIDIV : 浮点数据三种相除运算伪指令使用

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL8 10.10 dblTwo REAL8 1.1 myInteger DWORD 1.code main PROCfld dblOnefld dblTwo;无操作数用法,ST(1)除去ST(0),结果暂存ST(1),然后ST(0)弹出堆栈,将结果保留在栈顶fdiv ;内存操作数用法,ST(0)除去内存操作数fdiv dblTwo ;ST(0) /= dblTwo;寄存器用法fdiv ST(1),ST(0) ;ST(1) /= ST(0) ,ST(0)不出栈;fsubp 指令,会将ST(0)出栈fld dblTwofdivp ST(1),ST(0) ;ST(1) /= ST(0) ,然后ST(0)出栈;整数除法,先把源操作数转换为扩展双精度浮点数,再从ST(0)中除去该操作数fidiv myInteger ;ST(0) /= myInteger INVOKE ExitProcess,0 main ENDP END main

8:FCOMP : 浮点数据比较伪指令FCOMP使用

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD;比较如下C++代码 ;double X = 1.2 ;double Y = 3.0 ;int N =0 ;if (X < Y) ; N= 1.data X REAL8 1.2 Y REAL8 3.0 N DWORD 0;fcom 比较ST(0)ST(1) ;fcom m32fp 比较ST(0) 与 m32fp ;fcom m32fp 比较ST(0) 与 m64fp ;fcom ST(i) 比较ST(0)ST(i);fcomp 会将ST(0)出栈;fcompp 会出栈两次.code main PROCfld X ;ST(0) = Xfcomp Y ;比较ST(0)和Y,ST(0)出栈fnstsw ax ;状态字送入AXsahf ;AH复制到EFLAGSjnb L1 ;X不小于Y ? 跳过mov N,1 ;N=1 L1:INVOKE ExitProcess,0 main ENDP END main

9:FCOMI : 浮点数据比较伪指令FCOMI使用,因为浮点数比较的运行时开销大于整数比较, Intel P6系列引入了fcomi,比较浮点数值,并直接设置ZF,PF和CF

.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data X REAL8 1.2 Y REAL8 3.0 N DWORD 0;fcomi 格式 ;fcomi ST(0),ST(i).code main PROCfld Y ;ST(0) = Yfld X ;ST(0) = X,ST(1) = Yfcomi ST(0),ST(1) ;比较ST(0)ST(1)jnb L1 ;ST(0)不小于ST(1)?跳过mov N,1 ;N =1 L1:INVOKE ExitProcess,0 main ENDP END main

10:FCOMI_EQUAL : 比较浮点数相等的问题,因为浮点数在计算过程中会出现舍入误差,比较相等比较X与Y时,应该取它们的差值的 绝对值|x-y|,再与用户定义的误差值比较,只不大于误差值就认为两个浮点数相等

include Irvine32.inc include Macros.inc .data epsilon REAL8 1.0E-12 val2 REAL8 0.0 ;比较的数值 val3 REAL8 1.001E-13 .code main PROC;如果(val2 == val3),显示"Values are equal"fld epsilonfld val2fsub val3fabsfcomi ST(0),ST(1)ja skipmWrite <"Values are equal",0dh,0ah> skip:INVOKE ExitProcess,0 main ENDP END main 创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。