汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1:FLD : FPU(浮點(diǎn)處理器)的加載浮點(diǎn)數(shù)到堆棧指令
.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] ;基址 - 變址 - 偏移量(二維數(shù)組的訪問(wèn)方式)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偽指令將棧頂數(shù)據(jù)復(fù)制到內(nèi)存,FSTP偽指令將棧頂數(shù)據(jù)復(fù)制到內(nèi)存,并出棧
.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;將棧頂數(shù)據(jù)復(fù)制到內(nèi)存fst dblThree ;10.1fst dblFour ;10.1;將棧頂數(shù)據(jù)復(fù)制到內(nèi)存,并出棧fstp dblThree ;10.1fstp dblFour ;234.56INVOKE ExitProcess,0 main ENDP END main3:FCHS_FABS : FCHS偽指令將ST(0)中浮點(diǎn)值的符號(hào)取反,FABS偽指令將ST(0)中浮點(diǎn)值的符號(hào)去掉,以得到絕對(duì)值
.386 .model flat,stdcall.stack ExitProcess PROTO,dwExitCode:DWORD.data dblOne REAL4 1.23.code main PROCfld dblOnefchs ;將ST(0)中浮點(diǎn)值的符號(hào)取反fabs ;將ST(0)中浮點(diǎn)值的符號(hào)去掉,以得到絕對(duì)值INVOKE ExitProcess,0 main ENDP END main4:FADD_FADDP_FIADD :浮點(diǎn)數(shù)據(jù)三種相加運(yùn)算偽指令使用
.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 ;無(wú)操作數(shù)的用法 ST(0)與ST(1)相加,結(jié)果暫存在ST(1),然后ST(0)出棧,結(jié)果保存在棧頂;ST(0) 244.66fld dblTwo;ST(1) 244.66 ,ST(0)10.1fadd ST(1),ST(0) ;寄存器操作數(shù)用法,將ST(0)加到ST(1);ST(1) 254.76 ,ST(0)10.1;內(nèi)存操作數(shù)用法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;先將源操作數(shù)轉(zhuǎn)換為擴(kuò)展雙精度浮點(diǎn)點(diǎn),fiadd myInteger ;ST(0) += myIntegerINVOKE ExitProcess,0 main ENDP END main5:FSUB_FSUBP_FISUB : 浮點(diǎn)數(shù)據(jù)三種相減運(yùn)算偽指令使用
.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;無(wú)操作數(shù)用法,ST(1)減去ST(0),結(jié)果暫存ST(1),然后ST(0)彈出堆棧,將結(jié)果保留在棧頂fsub ;內(nèi)存操作數(shù)用法,ST(0)減去內(nèi)存操作數(shù)fsub dblTwo ;ST(0) -= dblTwo;寄存器用法fsub ST(1),ST(0) ;ST(1) -= ST(0) ,ST(0)不出棧;fsubp 指令,會(huì)將ST(0)出棧fld dblTwofsubp ST(1),ST(0) ;ST(1) -= ST(0) ,然后ST(0)出棧;整數(shù)減法,先把源操作數(shù)轉(zhuǎn)換為擴(kuò)展雙精度浮點(diǎn)數(shù),再?gòu)?span id="ozvdkddzhkzd" class="token function">ST(0)中減去該操作數(shù)FISUB myInteger ;ST(0) -= myInteger INVOKE ExitProcess,0 main ENDP END main6:FMUL_FMULP_FIMUL : 浮點(diǎn)數(shù)據(jù)三種相乘運(yùn)算偽指令使用
.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;無(wú)操作數(shù)用法,ST(1)乘以ST(0),結(jié)果暫存ST(1),然后ST(0)彈出堆棧,將結(jié)果保留在棧頂fmul;內(nèi)存操作數(shù)用法,ST(0)乘以內(nèi)存操作數(shù)fmul dblTwo ;ST(0) *= dblTwo;寄存器用法fmul ST(1),ST(0) ;ST(1) *= ST(0) ,ST(0)不出棧;fmulp 指令,會(huì)將ST(0)出棧fld dblTwofmulp ST(1),ST(0) ;ST(1) *= ST(0) ,然后ST(0)出棧;整數(shù)乘法,先把源操作數(shù)轉(zhuǎn)換為擴(kuò)展雙精度浮點(diǎn)數(shù),再?gòu)?span id="ozvdkddzhkzd" class="token function">ST(0)中乘以該操作數(shù)fimul myInteger ;ST(0) *= myInteger INVOKE ExitProcess,0 main ENDP END main7:FDIV_FDIVP_FIDIV : 浮點(diǎn)數(shù)據(jù)三種相除運(yùn)算偽指令使用
.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;無(wú)操作數(shù)用法,ST(1)除去ST(0),結(jié)果暫存ST(1),然后ST(0)彈出堆棧,將結(jié)果保留在棧頂fdiv ;內(nèi)存操作數(shù)用法,ST(0)除去內(nèi)存操作數(shù)fdiv dblTwo ;ST(0) /= dblTwo;寄存器用法fdiv ST(1),ST(0) ;ST(1) /= ST(0) ,ST(0)不出棧;fsubp 指令,會(huì)將ST(0)出棧fld dblTwofdivp ST(1),ST(0) ;ST(1) /= ST(0) ,然后ST(0)出棧;整數(shù)除法,先把源操作數(shù)轉(zhuǎn)換為擴(kuò)展雙精度浮點(diǎn)數(shù),再?gòu)?span id="ozvdkddzhkzd" class="token function">ST(0)中除去該操作數(shù)fidiv myInteger ;ST(0) /= myInteger INVOKE ExitProcess,0 main ENDP END main8:FCOMP : 浮點(diǎn)數(shù)據(jù)比較偽指令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 會(huì)將ST(0)出棧;fcompp 會(huì)出棧兩次.code main PROCfld X ;ST(0) = Xfcomp Y ;比較ST(0)和Y,ST(0)出棧fnstsw ax ;狀態(tài)字送入AXsahf ;AH復(fù)制到EFLAGSjnb L1 ;X不小于Y ? 跳過(guò)mov N,1 ;N=1 L1:INVOKE ExitProcess,0 main ENDP END main9:FCOMI : 浮點(diǎn)數(shù)據(jù)比較偽指令FCOMI使用,因?yàn)楦↑c(diǎn)數(shù)比較的運(yùn)行時(shí)開(kāi)銷大于整數(shù)比較, Intel P6系列引入了fcomi,比較浮點(diǎn)數(shù)值,并直接設(shè)置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)?跳過(guò)mov N,1 ;N =1 L1:INVOKE ExitProcess,0 main ENDP END main10:FCOMI_EQUAL : 比較浮點(diǎn)數(shù)相等的問(wèn)題,因?yàn)楦↑c(diǎn)數(shù)在計(jì)算過(guò)程中會(huì)出現(xiàn)舍入誤差,比較相等比較X與Y時(shí),應(yīng)該取它們的差值的 絕對(duì)值|x-y|,再與用戶定義的誤差值比較,只不大于誤差值就認(rèn)為兩個(gè)浮點(diǎn)數(shù)相等
include Irvine32.inc include Macros.inc .data epsilon REAL8 1.0E-12 val2 REAL8 0.0 ;比較的數(shù)值 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 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 重庆学车多少钱啊?
- 下一篇: 顺序表(代码、分析、汇编)