在Mac OSX上flds指令失败

时间:2014-02-27 10:22:57

标签: macos assembly x86 x87

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)  

1 个答案:

答案 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也会显示),我们无法判断。