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位