对下面的指令先做一些说明:
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)
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