st 浮点栈寄存器的存储方式

问题描述:

​ 我把1转成double压入st(0)中,按道理应该是3FF0000000000000,但x64dbg显示的是3FFF800000000000,我想用windbg看看是不是x64dg显示错误

过程:

​ 我用windbg看了st(0),却发现结果也是3FFF800000000000,看来并不是x64dbg有问题,那么就有可能是st浮点栈寄存器并没有按照IEEE标准编码,随后我将2、3、4都压入st(0),观察值变化终于找到了规律

结果:

​ st浮点栈寄存器的双精度浮点编码方式是最高位为符号位,指数范围用15位表示,剩下48位表示尾数,但是和IEEE标准不同的是,最高位虽然恒为1,但也要加到尾数部分。

eg: 1 转成 双精度浮点

  1. 将1转成二进制数

    1 = 1.0

  2. 因为1是正数,所以符号为0

​ 指数为零 ,指数位为 32,767+0 = 011111111111111

​ 尾数部分为100000000000000000000000000000000000000000000000

  1. 转化为十六进制为3FFF800000000000

补充: IEEE标准

IEEE标准的双精度浮点编码方式是最高位为符号位,指数范围用11位表示,剩下位数表示尾数,最高位1省略
例子:3F84000000000000 表示多少
将值转为二进制 ‭0011 1111 1000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

符号位

符号位为最高位 0 表示正数

指数位

011 1111 1000 十进制位为1016 指数的为011 1111 1000 - 011 1111 1111 = -7
尾数部分
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
将省略的最高位补上
1.0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
转换位十进制
1*2^0 + 1*2^-2 = 1.25

所以结果为1.25 * 2^-7 = 0.009765625

posted @ 2022-10-12 01:33  乘舟凉  阅读(249)  评论(0编辑  收藏  举报