flds
指令应将值存储在寄存器st0
中。我正在调试一个我没有代码的共享库。有时,flds
指令对st0
没有任何影响。对于它工作的情况和失败的情况,下面是gdb
输出。在破碎的情况下,fstat
寄存器是0x2261而不是0x2061。 0x200标志表示什么?
工作版本:
0x6d9b4f : flds -0x4(%ebp) 0x6d9b52 : leave 0x6d9b53 : ret (gdb) info registers fstat st0 st1 st2 st3 st4 st5 st6 st7 fstat 0x2061 8289 st0 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st1 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st2 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st3 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st4 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st5 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st6 780250362506194 (raw 0x4030b1688c6c5af48000) st7 1 (raw 0x3fff8000000000000000) (gdb) ni 0x006d9b52 in Startup () 1: x/3i $pc 0x6d9b52 : leave 0x6d9b53 : ret 0x6d9b54 : push %ebp (gdb) info registers fstat st0 st1 st2 st3 st4 st5 st6 st7 fstat 0x1861 6241 st0 -1584 (raw 0xc009c600000000000000) st1 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st2 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st3 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st4 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st5 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st6 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st7 780250362506194 (raw 0x4030b1688c6c5af48000)
破碎的版本:
0x6d9b4f : flds -0x4(%ebp) 0x6d9b52 : leave 0x6d9b53 : ret (gdb) info registers fstat st0 st1 st2 st3 st4 st5 st6 st7 fstat 0x2261 8801 st0 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st1 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st2 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st3 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st4 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st5 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st6 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st7 -nan(0xc000000000000000) (raw 0xffffc000000000000000) (gdb) ni 0x006d9b52 in Startup () 1: x/3i $pc 0x6d9b52 : leave 0x6d9b53 : ret 0x6d9b54 : push %ebp (gdb) info registers fstat st0 st1 st2 st3 st4 st5 st6 st7 fstat 0x1a61 6753 st0 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st1 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st2 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st3 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st4 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st5 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st6 -nan(0xc000000000000000) (raw 0xffffc000000000000000) st7 -nan(0xc000000000000000) (raw 0xffffc000000000000000)
答案 0 :(得分:4)
标志0x200
称为C1
条件位,它在FPU堆栈问题时提供附加信息。英特尔手册说:
C1条件代码标志用于各种功能。什么时候 设置x87 FPU状态字中的IE和SF标志, 指示堆栈溢出或下溢异常(#IS),C1标志 区分溢出(C1 = 1)和下溢(C1 = 0)。
请注意,info float
将为您提供更详细的转储,包括状态和控制位名称,甚至包括对后者的解释。
Status Word: 0x1a61 IE PE SF C1
TOP: 3
所有这些意味着代码不能正确平衡fpu堆栈。显然,工作版本和损坏版本都存在堆栈问题,只有一个是下溢而另一个是溢出,或者C1
标志之间已经发生了变化。
其中一个有效的原因可能是因为有问题的FPU寄存器在一种情况下是空的。如果没有FPU标记词(info float
也会显示),我们无法判断。