1、Version Date Edited DescriptionV1.0 2012-10-8 missgya New Created说明:本文整理自保护方式下的 80386 及其编程3.7.6 节。使用软件环境为 MASM6.15 + CodeView 4.10,有部分指令的说明与在该环境中的测试结果不一致,可能是不同编译器的原因。如有疑问,欢迎发送邮件至。几个浮点数的十六进制形式:-2.5 c0200000-2.0 c0000000-0.25 be8000000.25 3e800000sqrt(2)-1 3ed413cd0.5 3f0000000.75 3f4000001.0 3f800000
2、1.25 3fa00000pi/3 3f860a8bsqrt(3) 3fddb3d72.0 400000002.5 402000002.75 403000003.0 404000004.0 408000005.0 40a000006.0 40c000008.0 41000000F2XM1作用:ST = 2ST 1限制:原 ST 必须为【-0.5,0.5】例:.dataarray dd 3f000000hvalow dd ?.codepage.startupfld arrayf2xm1fstp valowmov eax, valow ;结果 3ED413CDfst valowmov eax, v
3、alow ;结果 FFC00000.exit说明:若原 ST0.5,则不进行任何计算FABS作用:ST=fabs(ST)例:.dataarray dd 0c0000000hvalow dd ?.codepage.startupfld arrayfabsfstp valowmov eax, valow ;结果 40000000fst valowmov eax, valow ;结果 FFC00000.exitFADDFADD作用:ST(1) = ST(1) + ST ; pop()例:.dataarray dd 40000000h, 40400000hvalow dd ?.codepage.sta
4、rtupfld arrayfld array + 4faddfstp valowmov eax, valow ;结果 40a00000fst valowmov eax, valow ;结果 FFC00000.exitFADD mem32/mem64作用:ST = ST + mem32/mem64例:.dataarray dd 40000000h, 40400000hvalow dd ?.codepage.startupfld arrayfadd array + 4fstp valowmov eax, valow ;结果 40a00000fst valowmov eax, valow ;结果 F
5、FC00000.exitFADD ST(m), ST(n)作用:ST(m) = ST(m) + ST(n)限制:op1 和 op2 至少有一为 st,如 fadd st, st(n)或 fadd st(n), st 或 fadd st, st例:.dataarray dd 40000000h, 40400000hvalow dd ?.codepage.startupfld arrayfld array + 4fadd st(1), stfstp valowmov eax, valow ;结果 40400000fst valowmov eax, valow ;结果 40a00000.exitFA
6、DDP ST(m), st输出:ST(m) = ST(m) + ST; pop();说明:faddp st(1), st 与 fadd 结果相同。faddp st, st 没有意义FIADD mem16/mem32作用:ST = ST + mem16/mem32,其中 mem16/mem32 为整数例:.dataarray dd 3f000000h, 2valow dd ?.codepage.startupfld arrayfiadd array + 4fstp valowmov eax, valow ;结果 40200000fst valowmov eax, valow ;结果 FFC000
7、00.exitFCHS作用:ST = -ST例:.dataarray dd 40000000hvalow dd ?.codepage.startupfld arrayfchsfstp valowmov eax, valow ; 结果 C0000000fst valowmov eax, valow ; 结果 FFC00000.exitFCLEX/FNCLEX作用:清除异常FCOMFCOM作用:比较 ST 与 ST(1)说明:若 ST ST(1),则为 ja;若 ST ST(1),则为 jb;否则为 jz/je。不能用 jg 和 jl例:.dataarray dd 0c0000000h,3f000
8、000hvalow dd ?.codepage.startupfld array + 4fld arrayfcomfst valowmov eax, valow ;结果 c0000000fstsw axsahfja GreaterThanjb LessThanjz EqualToGreaterThan:nopLessThan:Nop ;跳转到此处EqualTo:nop.exitFCOM op1作用:比较 ST 与 op1说明:op1 可为 ST(n),其他同 FCOMFCOMP作用:比较 ST 与 op1; pop()例:.dataarray dd 0c0000000h,3f000000hva
9、low dd ?.codepage.startupfld array + 4fld arrayfcomfst valowmov eax, valow ;结果 3f000000fstsw axsahfja GreaterThanjb LessThanjz EqualToGreaterThan:nopLessThan:Nop ;跳转到此处EqualTo:nop.exitFCOMP op1作用:比较 ST 与 op1; pop()说明:op1 可为 ST(n),其他同 FCOMPFCOMPP作用:比较 ST 与 ST(1); pop(), pop()例:.dataarray dd 0c0000000
10、h,3f000000h, 11111111hvalow dd ?.codepage.startupfld array + 8fld array + 4fld arrayfcomfst valowmov eax, valow ;结果 11111111fstsw axsahfja GreaterThanjb LessThanjz EqualToGreaterThan:nopLessThan:Nop ;跳转到此处EqualTo:nop.exitFICOM mem16/mem32作用:比较 ST 与 mem16/mem32说明:mem16/mem32 为整数。其他同 FCOM op1FICOMP me
11、m16/mem32作用:比较 ST 与 mem16/mem32; pop()说明:mem16/mem32 为整数。其他同 FCOMP op1FCOS作用:ST = cos(ST)例:.dataarray dd 3f860a8bhvalow dd ?.codepage.startupfld arrayfcosfstp valowmov eax, valow ;结果 3F00000Cfst valowmov eax, valow ;结果 FFC00000.exitFDECSTP作用:TOP = (7+TOP) % 8例:.dataarray dd 40000000h, 42000000hvalow
12、 dd ?.codepage.startupfld arrayfld array + 4fdecstpfst valowmov eax, valow ;结果 FFC00000.exitFDIVFDIV作用:ST(1) = ST(1) / ST; pop()例:.dataarray dd 40a00000h, 40000000hvalow dd ?.codepage.startupfld array ;5.0fld array + 4 ;2.0fdivfstp valowmov eax, valow ;结果 40200000fst valowmov eax, valow ;结果 FFC00000.exitFDIV mem32/mem64作用:ST = ST / mem32/mem64