操作浮点数-汇编层面

March 18, 2019 逆向 访问: 34 次

FPU

FPU是专用于浮点运算的处理器,有ST0~ST7,都是用来放浮点数的

关于浮点数操作的汇编指令

指令 含义
FLD 类似于push指令,把浮点数据压入ST寄存器中
FST 类似于pop指令,把ST寄存器ST0的数据传送到目标操作数中
FSTP 与FST相类似,所不同的是:指令FST执行完后,不进行堆栈的弹出操作,即:寄存器堆栈不发生变化,而指令FSTP执行完后,则需要进行寄存器堆栈的弹出操作,寄存器堆栈将发生变化
fld dword ptr ds:[eax+0xC]   意思是将[eax+c]的值以浮点型放进ST0里面
fstp dword ptr ss:[ebp-0x20] 意思是将ST0里面的浮点值,放到ebp-20这个内存里面,同是清空ST0里面的值

除法

指令 含义
FDIVR m32real 将 m32real 除以 ST(0),结果存储到 ST(0)
FDIVR m64real 将 m64real 除以 ST(0),结果存储到 ST(0)
FDIVR ST(0), ST(i) 将 ST(i) 除以 ST(0),结果存储到 ST(0)
FDIVR ST(i), ST(0) 将 ST(0) 除以 ST(i),结果存储到 ST(i)
FDIVRP ST(i), ST(0) 将 ST(0) 除以 ST(i),结果存储到 ST(i),并弹出寄存器堆栈
FDIVRP 将 ST(0) 除以 ST(1),结果存储到 ST(1),并弹出寄存器堆栈
FIDIVR m32int 将 m32int 除以 ST(0),结果存储到 ST(0)
FIDIVR m16int 将 m16int 除以 ST(0),结果存储到 ST(0)

加法

指令 含义
FADD m32real 将 m32real 与 ST(0) 相加,结果存储到 ST(0)。
FADD m64real 将 m64real 与 ST(0) 相加,结果存储到 ST(0)。
FADD ST(0), ST(i) 将 ST(0) 与 ST(i) 相加,结果存储到 ST(0)。
FADD ST(i), ST(0) 将 ST(i) 与 ST(0) 相加,结果存储到 ST(i)。
FADDP ST(i), ST(0) 将 ST(0) 与 ST(i) 相加,结果存储到 ST(i),并弹出寄存器堆栈
FADDP 将 ST(0) 与 ST(1) 相加,结果存储到 ST(1),并弹出寄存器堆栈
FIADD m32int 将 m32int 与 ST(0) 相加,结果存储到 ST(0)
FIADD m16int 将 m16int 与 ST(0) 相加,结果存储到 ST(0)

浮点数比较

指令 含义
fcom 比较st0和st1寄存器的值
fcom st(x) 比较st0和stx寄存器的值
fcom source 比较st0和32/64位内存值
fcomp 比较st0和st1寄存器的值,并弹出堆栈
fcomp st(x) 比较st0和stx寄存器的值,并弹出堆栈
fcomp source 比较st0和32/64位内存值,并弹出堆栈
fcompp 比较st0和st1寄存器的值,并两次弹出堆栈
ftst 比较st0和0.0

其他

汇编语言学习笔记(十二)-浮点指令

浮点数二进制表示

在计算机中,浮点数在内存中的存储和整数的存储是不一样的。计算机底层只能识别0和1,也就是采用二进制,二进制也可用科学计数法来表示浮点数

2.5  转换成二进制 10.1  科学记数法表示为1.01×2^1

十进制小数转换二进制小数时,整数部分和平常的方法是一样的,小数部分规则如下:

单精度浮点数

  • 数据宽度:32位,即一个字
  • 最高为符号位(正数为0,负数为1)
  • 尾数位:位于后23位,由于二进制的最高只可能是0或者1,又因为科学记数法表示之后首位必定是1,故社区小数点和点前的1为最后的尾数
  • 指数位:需要加上127,然后再转换成二进制最高位之后的8位

双精度浮点数

  • 数据宽度:64位,即2个字
  • 符号位:最高位是符号位,规则和32位一样
  • 指数位:最高位向后的11位是指数位,需加上1023
  • 尾数位:后52位

添加新评论