1. 数据传递和对常量的操作指令
指令格式
指令含义
执行的操作
FLD src
装入实数到 st(0)
st(0) <- src (mem32/mem64/mem80)
FILD src
装入整数 到st(0)
st(0) <- src (mem16/mem32/mem64)
FBLD src
装 入BCD数到st(0)
st(0) <- src (mem80)
FLDZ
将0.0 装入st(0)
st(0) <- 0.0
FLD1
将1.0装入st(0)
st(0) <- 1.0
FLDPI
将pi装入st(0)
st(0) <- ?(ie, pi)
FLDL2T
将 log2(10)装入st(0)
st(0) <- log2(10)
FLDL2E
将log2(e)装入 st(0)
st(0) <- log2(e)
FLDLG2
将log10(2)装入st(0)
st(0) <- log10(2)
FLDLN2
将loge(2)装入st(0)
st(0) <- loge(2)
FST dest
保存实数st(0)到dest
dest <- st(0) (mem32/mem64)
FSTP dest
dest <- st(0) (mem32/mem64/mem80);然后再执行一次出栈操作
FIST dest
将st(0)以整数保存到dest
dest <- st(0) (mem32/mem64)
FISTP dest
dest <- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作
FBST dest
将st(0)以BCD保存 到dest
dest <- st(0) (mem80)
FBSTP dest
dest<- st(0) (mem80);然后再执行一次出栈操作
2.比较指令
指令格式
指令含义
执 行的操作
FCOM
实数比较
将标志位设置为 st(0) - st(1) 的结果标志位
FCOM op
实 数比较
将标志位设置为 st(0) - op (mem32/mem64)的结果标志位
FICOM op
和整数比较
将Flags值设置为st(0)-op 的结果op (mem16/mem32)
FICOMP op
和整数比较
将st(0)和op比较 op(mem16/mem32)后;再执行一次出栈操作
FTST
零检测
将st(0)和0.0比较
FUCOM st(i)
比较st(0) 和st(i) [486]
FUCOMP st(i)
比较 st(0) 和st(i),并且执行一次出栈操作
FUCOMPP st(i)
比较st(0) 和st(i),并且执行两次出栈操作
FXAM
Examine: Eyeball st(0) (set condition codes)
fnstsw EAX
将比较后的状态字写入到EAX
3.运算指令
指 令格式
指令含义
执行的操作
加法
FADD
加实数
st(0) <-st(0) + st(1)
FADD src
st(0) <-st(0) + src (mem32/mem64)
FADD st(i),st
st(i) <- st(i) + st(0)
FADDP st(i),st
st(i) <- st(i) + st(0);然后执行一次出栈操作
FIADD src
加上一个整数
st(0) <-st(0) + src (mem16/mem32)
减法
FSUB
减 去一个实数
st(0) <- st(0) - st(1)
FSUB src
st(0) <-st(0) - src (reg/mem)
FSUB st(i),st
st(i) <-st(i) - st(0)
FSUBP st(i),st
st(i) <-st(i) - st(0),然后执行一次出栈操作
FSUBR st(i),st
用一个实数来减
st(0) <- st(i) - st(0)
FSUBRP st(i),st
st(0) <- st(i) - st(0),然后执行一次出栈操作
FISUB src
减去一个整数
st(0) <- st(0) - src (mem16/mem32)
FISUBR src
用一个整数来减
st(0) <- src - st(0) (mem16/mem32)
乘法
FMUL
乘上一个实数
st(0) <- st(0) * st(1)
FMUL st(i)
st(0) <- st(0) * st(i)
FMUL st(i),st
st(i) <- st(0) * st(i)
FMULP st(i),st
st(i) <- st(0) * st(i),然后执行一次出栈操作
FIMUL src
乘上一个整数
st(0) <- st(0) * src (mem16/mem32)
除法
FDIV
除以一个实数
st(0) <-st(0) /st(1)
FDIV st(i)
st(0) <- st(0) /t(i)
FDIV st(i),st
st(i) <-st(0) /st(i)
FDIVP st(i),st
st(i) <-st(0) /st(i),然后执行一次出栈操作
FIDIV src
除以一个整数
st(0) <- st(0) /src (mem16/mem32)
FDIVR st(i),st
用实数除
st(0) <- st(i) /st(0)
FDIVRP st(i),st
FDIVRP st(i),st
FIDIVR src
用整数除
st(0) <- src /st(0) (mem16/mem32)
FSQRT
平 方根
st(0) <- sqrt st(0)
FSCALE
2的st(0)次方
st(0) <- 2 ^ st(0)
FXTRACT
Extract exponent:
st(0) <-exponent of st(0); and gets pushed
st(0) <-significand of st(0)
FPREM
取余数
st(0) <-st(0) MOD st(1)
FPREM1
取余数(IEEE),同FPREM,但是使用IEEE标准[486]
FRNDINT
取整(四舍五入)
st(0) <- INT( st(0) ); depends on RC flag
FABS
求绝对值
st(0) <- ABS( st(0) ); removes sign
FCHS
改变符号位(求负数)
st(0) <-st(0)
F2XM1
计算(2 ^ x)-1
st(0) <- (2 ^ st(0)) - 1
FYL2X
计算Y * log2(X)
st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0) * log2( st(1) )的值
FCOS
余弦函数Cos
st(0) <- COS( st(0) )
FPTAN
正切函数tan
st(0) <- TAN( st(0) )
FPATAN
反 正切函数arctan
st(0) <- ATAN( st(0) )
FSIN
正弦函数sin
st(0) <- SIN( st(0) )
FSINCOS
sincos函数
st(0) <-SIN( st(0) ),并且压入st(1)
st(0) <- COS( st(0) )
FYL2XP1
计算Y * log2(X+1)
st(0)为Y; st(1)为X; 将st(0)和st(1)变为st(0) * log2( st(1)+1 )的值
处理器控制指令
FINIT
初 始化FPU
FSTSW AX
保存状态字的值到AX
AX<- MSW
FSTSW dest
保存状态字的值到dest
dest<-MSW (mem16)
FLDCW src
从src装入FPU的控制字
FPU CW <-src (mem16)
FSTCW dest
将 FPU的控制字保存到dest
dest<- FPU CW
FCLEX
清除异常
FSTENV dest
保存环境到内存地址dest处 保存状态字、控制字、标志字和异常指针的值
FLDENV src
从内存 地址src处装入保存的环境
FSAVE dest
保存FPU的状态到dest处 94字节
FRSTOR src
从src处装入由FSAVE保存的FPU状态
FINCSTP
增 加FPU的栈指针值
st(6) <-st(5); st(5) <-st(4),...,st(0) <-?
FDECSTP
减 少FPU的栈指针值
st(0) <-st(1); st(1) <-st(2),...,st(7) <-?
FFREE st(i)
标志寄存器st(i)未被使用
FNOP
空操作,等同CPU的nop
st(0) <-st(0)
WAIT/FWAIT
同步FPU与CPU:停止CPU的运行,直到FPU完成当前操作码
FXCH
交换指令,交换st(0)和st(1)的值
st(0) <-st(1)
st(1) <- st(0)
;********************************************************************************
73]%^kx=
;* 浮点数指令集
DE. Pw+5<.
;********************************************************************************
i5)trSM|
;////////////////////////////////////////////////////////////////////////////////
O'!k$iJNb
;////
38 B\ \
;//// 浮点数载入指令
:v&GAs6H
;////
(zTr/
;///////////////////////////////////////////////////////////////////////////////
; /EH@V|
; 助记符 操作数 功能
5M*ZZ+YX
fld memory(real) ; 将存储器中的实型压人堆栈
a+J :1'
fild memory(integer) ;将存储器的整型数值转化为浮点数并压人堆栈
Ebp8})P/~
fbld memory(BCD) ;将存储器的BCD码转化为浮点数并压人堆栈
m2�N ?Fg
fld st(num) ;将浮点型寄存器中的数值压入堆栈
VQLo vt"
fld1 (none) ;1.0压人堆栈
g]d@X_ &D
fldz (none) ;0.0压人堆栈
o_={xrmIA
fldpi (none) ;Π(pi) 压人堆栈
ZtB0:'o;
fldl2e (none) ;log2(e)压人堆栈
-h.' ]^I
fldl2t (none) ;log2(10)压人堆栈
85nUR[)h
fldlg2 (none) ;log10(2)压人堆栈
^t #]E#
fldln2 (none) ;loge(2)压人堆栈
xb1)ZJH
finit (none) ; 初始化浮点型单元,并清空8个寄存器的内容
LfF<wDvXf
uOZ+9x(
T@k&YJ
;////////////////////////////////////////////////////////////////////////////////
vA+�RZ
;/////
x)V.^-
;//// 浮点数数据存储指令
o#w6]Fmc
;////
x\t>|DB
;///////////////////////////////////////////////////////////////////////////////
0MPsF{Xw[
;助记符 操作数 功能
@|�5B
fst st(num) ;复制st的值来替换st(num)的内容;只有st(num)是受到影响
=m-_0xo
fstp st(num) ;复制st的值来替换st(num)的内容;st出栈
(U-p&q>z
fst memory(real) ;复制st的值为实型数,存入存储器;堆栈不受影响
z.[L1AGa|s
fstp memory(real) ;复制st的值为实型数,存入存储器;st出栈
B&L{/.v_z\
fist memory(integer) ;复制st的值,并转换为整型数存入存储器
")Bf^DV
fistp memory(integer) ;复制st的值,并转换为整型数存入存储器;st出栈
FeCQGT
fbstp memory(BCD) ;复制st的值,并转换为BCD码存入存储器;st出栈
vqL{~tR
fxch (none) ;互换st和st(1)
'^P Ud`
fxch st(num) ;互换st和st(num)
Y&gfe8%5N
;///////////////////////////////////////////////////////////////////////////////
Fs&m'g
;////
SSI&WZ2a
;/// 浮点型加法指令
ZJw92Sb
;///
4.VEE~sH$
;//////////////////////////////////////////////////////////////////////////////
FtF!Dtv
;助记符 操作数 功能
/CZOO)n
fadd (none) ; 将st和st(1)出栈;将两个值相加;并将它们的和入栈
J(l6(+8
fadd st(num),st ; 将st(num)和st相加;用和替换st(num)
WG^D$L:
fadd st,st(num) ; 将st和st(num)相加;用和替换st
,U<Ku*}B
fadd memory(real) ; 将st和存储器中的实型数相加;用和替换st
Q"Bgr&RJ
fiadd memory(integer) ;将st和存储器中的整型数相加,用和替换st
&1Az`[zKGW
faddp st(num),st ;将st(num)和st相加,用和来替换st(num),将st出栈
m:"2I&0)WM
�Mz"kaO
#b8/gRfS
;//////////////////////////////////////////////////////////////////////////////
"#m *`n
;////
JP@UvDE|
;/// 浮 点型乘法指令
| _S9U|
;///
Dxu)by
;//////////////////////////////////////////////////////////////////////////////
&7<~Q\XZbI
;助记符 操作数 功能
*&AK.n_
fmul (none) ;将st和st(1)出栈;并将它们的值相乘;乘积人栈
({i|
fmul st(num),st ;将st(num)和st相乘;用乘积来替换st(num)
w$t2Hd
fmul st,st(num) ;将st和st(num)相乘;用乘积来替换st
s&tr84u|
fmul memory(real) ;将st和存储器中的实型数相乘;用乘积来替换st
I~mw\K{.3M
fimul memory(integer) ;将st和存储器中的整型数相乘,用乘积来替换st
wYF)G;[wM
fmulp st(num),st ;将st(num)和st相乘;乘积来替换st(num);并将st出栈
L~;_R*Th
;助记符 操作数 功能
O0Z'vbFG
fsub (none) ;将st和st(1)出栈,计算st(1)减st的值;将差入栈
q|6lw 74`
fsub st(num),st ;计算st(num)减st的值;用差值替换st(num)
p<J/J.E
fsub st,st(num) ;计算st减st(num)的值;用差值来替换st
J}.p6E~j
fsub memory(real) ;计算st减存储器中的实型数的值;用差值来替换st
?pVODnP k
fisub memory(integer) ;计算st减存储器中的整型数的值;用差值替换st
T$q]iSgu
fsubp st(num),st ; 计算st(num)减st的值;用差值替换st(num);将st出栈
oZzE.Q1T
fsubr (none) ;将st和st(1)出栈;计算st减st(1)的 值;将差值入栈
t qER;L
fsubr st(num),st ;计算st减st(num)的值,用差值替换 st(num)
ricDP 9#a
fsubr st,st(num) ; 计算st(num)减st的值,用差值来替换st
<vj&e(D^
fsubr memory(real) ; 计算存储器中的实型数值减st的值,用差值替换st
EoY570PN
fisubr memory(integer) ;计算存储器中的整型数值减st的值;用差值替换st
$AX!L+<!
fsubrp st(num),st ;计算st减st(num)的值,用差值替换st(num);将st出栈
1f~D Uku=
@ojn< 7W
g;*~ xo
;//////////////////////////////////////////////////////////////////////////////
TQ>1u
;///
{X< tUco
;/// 浮点型除法指令
Cx@,�J\rsQ
;///
6ZF5f^M^
;//////////////////////////////////////////////////////////////////////////////
i,V~5dE[I<
;助记符 操作数 功能
bS0LjvY9g
fdiv (none) ;将st和st(1)出栈;计算st(1)/st的值;并将商入栈
/njN*rhx&Z
fdiv st(num),st ;计算st(num)/st的值;用商来替换st(num)
~Ipl'cE
fdiv st,st(num) ;计算st/st(num)的值;用商来替换st
e0aeiG$/0
fdiv memory(real) ;计算st/存储器中的实型数;用商来替换st
.lj\H
fidiv memory(integer);计算st/存储器中的整型数;用商来替换st
{o;J'yjre1
fdivp st(num),st ;计算st(num)/st的值;用商来替换st(num);并将st出栈
Dzp9BRS 2f
fdivr (none) ;将st和st(1)出栈;计算st/st(1)的值;并将商入栈
+nZx{d,wt
fdivr st(num),st ;计算st/st(num)的值;用商来替换st(num)
dhV =;'
fdivr st,st(num) ;计算st(num)/st的值;用商来替换st
_o<8R@1
fdivr memory(real) ;计算存储器中的实型数/st;商来替换st
F_@PSA+
fidivr memory(integer);计算存储器中的整型数/st;用商来替换st
" Z#&A
fdivrp st(num),st ;计算st/st(num)的值,用商来替换st(num);并将st出栈
QQ pe.oF
;//////////////////////////////////////////////////////////////////////////////
l'mgjv~
;///
++5So fG@
;/// 附 加的浮点型指令
/ \OjtE
;///
wzF/`z&0?6
;/////////////////////////////////////////////////////////////////////////////
`WX @1 ]m
;助记符 操作数 功能
vz/.*u
fabs (none) ;st := |st|(绝对值)
v2/@Pu!kg
fchs (none) ;st := -st(相反数)
D&:�,,Dp
frndint (none) ;对st取整
c?>@ P
fsqrt (none) ;用st的平方根来替换st
E2+O-;VN
;/////////////////////////////////////////////////////////////////////////////
+VCG/J
;///
2tMe#�V
;/// 浮 点型比较指令
ko2�?q
;///
j.= VZ
;////////////////////////////////////////////////////////////////////////////
fX^ <H_1$G
;助记符 操作数 功能
h/?$~OD
fcom (none) ;比较st和st(1)
8Q�d�*OO
fcom st(num) ;比较st和st(num)
z10J8Ms'
fcom memory(real) ;比较st和存储器中的实型数
BE>^;`�K
ficom memory(integer) ;比较st和存储器中的整型数
/Ps/m!
ftst (none) ;比较st和0.0
@komb IK
fcomp (none) ;比较st和st(1);然后出栈
+&bJhX
fcomp st(num) ;比较st和st(num);然后出栈
40h
fcomp memory(real) ;比较st和存储器中的实型数;然后出栈
t} 6QU
fcomp memory(integer) ;比较st和存储器中的整型数;然后出栈
%'+}-w
fcompp (none) ;比较st和st(1);然后两次出栈
%JoHc?
;////////////////////////////////////////////////////////////////////////////
\*yH33B9
;///
C}jFR] x)
;/// 混 合浮点型指令
r_ >]y p
;///
8SGqDaRt
;////////////////////////////////////////////////////////////////////////////
U\y:\+e l
; 助记符 操作数 功能
pGRk
fstsw memory WORD ;复制状态寄存器到存储器字
.RW&=1D6
fstsw ax ;复制状态寄存器到ax寄存器
@o KW$\
fstcw memory WORD ;复制控制字寄存器到存储器
3-Bz5sj9
fldcw memory WORD ;复制存储器字到控制字寄存器