Инструкцията 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)