现在的位置: 首页 > 综合 > 正文

浮点运算指令集

2013年06月27日 ⁄ 综合 ⁄ 共 2188字 ⁄ 字号 评论关闭
对下面的指令先做一些说明:
st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响
src,dst,dest,op等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数
mem8,mem16,mem32,mem64,mem80等表示是内存操作数,后面的数值表示该操作数的内存位数(8位为一字节)
x <- y 表示将y的值放入x,例st(0) <- st(0) - st(1)表示将st(0)-st(1)的值放入浮点寄存器st(0)

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)
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
 

抱歉!评论已关闭.