0

flds指令应将值存储在寄存器中st0。我正在调试一个我没有代码的共享库。有时该flds指令对st0. 下面是gdb它工作时的情况和失败时的情况的输出。在损坏的情况下,fstat寄存器是 0x2261 而不是 0x2061。0x200 标志表示什么?

工作版本:

    0x6d9b4f : flds -0x4(%ebp)  
    0x6d9b52:离开  
    0x6d9b53 : 回复  
    (gdb) 信息寄存器 fstat st0 st1 st2 st3 st4 st5 st6 st7  
    fstat 0x2061 8289  
    st0 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st1 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st2 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st3 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st4 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st5 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st6 780250362506194(原始 0x4030b1688c6c5af48000)  
    st7 1(原始 0x3fff8000000000000000)  
    (gdb) 你  
    0x006d9b52 在启动()  
    1: x/3i $pc  
    0x6d9b52:离开  
    0x6d9b53 : 回复  
    0x6d9b54 : 推送 %ebp  
    (gdb) 信息寄存器 fstat st0 st1 st2 st3 st4 st5 st6 st7  
    fstat 0x1861 6241  
    st0 -1584(原始 0xc009c600000000000000)  
    st1 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st2 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st3 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st4 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st5 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st6 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st7 780250362506194(原始0x4030b1688c6c5af48000)  

破解版:

    0x6d9b4f : flds -0x4(%ebp)  
    0x6d9b52:离开  
    0x6d9b53 : 回复  
    (gdb) 信息寄存器 fstat st0 st1 st2 st3 st4 st5 st6 st7  
    fstat 0x2261 8801  
    st0 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st1 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st2 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st3 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st4 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st5 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st6 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st7 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    (gdb) 你  
    0x006d9b52 在启动()  
    1: x/3i $pc  
    0x6d9b52:离开  
    0x6d9b53 : 回复  
    0x6d9b54 : 推送 %ebp  
    (gdb) 信息寄存器 fstat st0 st1 st2 st3 st4 st5 st6 st7  
    fstat 0x1a61 6753  
    st0 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st1 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st2 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st3 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st4 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st5 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st6 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
    st7 -nan(0xc000000000000000) (原始 0xffffc000000000000000)  
4

1 回答 1

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 寄存器在一种情况下碰巧是空的。info float如果没有 FPU 标签词(也会显示),我们无法判断。

于 2014-02-27T13:18:14.163 回答