汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-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 main2: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 main3: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 main4: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 main5: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 main6: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 main7: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 main8: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 main9: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 main10: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 、浮点运算符、浮点比较 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重庆学车多少钱啊?
- 下一篇: 许昌治疗少精弱精最好的医院推荐