Gdb 行刑期间的疯狂行为
我一直在用gcc做一些内联asm。一切都很正常,有些行为让我感到困惑。我正在计算有理多项式,但需要使用80位常量。生成的代码似乎是完美的,但在执行时,80位系数中的一个在加载到fpu时被加载为0,即使在内存中字节值不是零(我认为它是一个有效的80位实数,因为当使用masm生成的代码运行时,完全相同的常量可以加载)。以下是gdb会话的输出:Gdb 行刑期间的疯狂行为,gdb,floating-point,long-double,Gdb,Floating Point,Long Double,我一直在用gcc做一些内联asm。一切都很正常,有些行为让我感到困惑。我正在计算有理多项式,但需要使用80位常量。生成的代码似乎是完美的,但在执行时,80位系数中的一个在加载到fpu时被加载为0,即使在内存中字节值不是零(我认为它是一个有效的80位实数,因为当使用masm生成的代码运行时,完全相同的常量可以加载)。以下是gdb会话的输出: (gdb) disassemble Dump of assembler code for function poly4(double): 0x00402d7c
(gdb) disassemble
Dump of assembler code for function poly4(double):
0x00402d7c <+0>: push %ebp
0x00402d7d <+1>: mov %esp,%ebp
0x00402d7f <+3>: sub $0x8,%esp
0x00402d82 <+6>: mov 0x8(%ebp),%eax
0x00402d85 <+9>: mov %eax,-0x8(%ebp)
0x00402d88 <+12>: mov 0xc(%ebp),%eax
0x00402d8b <+15>: mov %eax,-0x4(%ebp)
0x00402d8e <+18>: fld1
0x00402d90 <+20>: fldl -0x8(%ebp)
0x00402d93 <+23>: fmul %st(0),%st
0x00402d95 <+25>: fdivrp %st,%st(1)
0x00402d97 <+27>: fldt 0x40470e
0x00402d9d <+33>: fadd %st(1),%st
0x00402d9f <+35>: fmul %st(1),%st
0x00402da1 <+37>: fldt 0x404704
0x00402da7 <+43>: faddp %st,%st(1)
0x00402da9 <+45>: fmul %st(1),%st
0x00402dab <+47>: fldt 0x4046fa
0x00402db1 <+53>: faddp %st,%st(1)
0x00402db3 <+55>: fmul %st(1),%st
0x00402db5 <+57>: fldt 0x4046f0
0x00402dbb <+63>: faddp %st,%st(1)
0x00402dbd <+65>: fmul %st(1),%st
=> 0x00402dbf <+67>: fldt 0x4046e6
0x00402dc5 <+73>: faddp %st,%st(1)
...snip....
End of assembler dump.
(gdb) info registers st0 st1 st2 st3 st4 st5
st0 2.7412088761933612e-006 (raw 0x3fecb7f59c22579f9f60)
st1 0.00071574511983807409 (raw 0x3ff4bba0d78724c01468)
st2 <invalid float value> (raw 0x00077c81cc3b0002021e)
st3 <invalid float value> (raw 0x00020098007c00f8f0c0)
st4 0 (raw 0x000013af076300003654)
st5 <invalid float value> (raw 0x0762000000000002021e)
(gdb) x/5xh 0x4046e6
0x4046e6 <_ZL11s_NORMAL_q5>: 0x8996 0xa5d6 0x3d00 0x990a 0x3ff1
(gdb) stepi
0x00402dc5 1577 );
(gdb) info registers st0 st1 st2 st3 st4 st5
st0 0 (raw 0x00000000000000000000)
st1 2.7412088761933612e-006 (raw 0x3fecb7f59c22579f9f60)
st2 0.00071574511983807409 (raw 0x3ff4bba0d78724c01468)
st3 <invalid float value> (raw 0x00077c81cc3b0002021e)
st4 <invalid float value> (raw 0x00020098007c00f8f0c0)
st5 0 (raw 0x000013af076300003654)
(gdb) disassemble
Dump of assembler code for function poly4(double):
0x00402d7c <+0>: push %ebp
0x00402d7d <+1>: mov %esp,%ebp
0x00402d7f <+3>: sub $0x8,%esp
0x00402d82 <+6>: mov 0x8(%ebp),%eax
0x00402d85 <+9>: mov %eax,-0x8(%ebp)
0x00402d88 <+12>: mov 0xc(%ebp),%eax
0x00402d8b <+15>: mov %eax,-0x4(%ebp)
0x00402d8e <+18>: fld1
0x00402d90 <+20>: fldl -0x8(%ebp)
0x00402d93 <+23>: fmul %st(0),%st
0x00402d95 <+25>: fdivrp %st,%st(1)
0x00402d97 <+27>: fldt 0x40470e
0x00402d9d <+33>: fadd %st(1),%st
0x00402d9f <+35>: fmul %st(1),%st
0x00402da1 <+37>: fldt 0x404704
0x00402da7 <+43>: faddp %st,%st(1)
0x00402da9 <+45>: fmul %st(1),%st
0x00402dab <+47>: fldt 0x4046fa
0x00402db1 <+53>: faddp %st,%st(1)
0x00402db3 <+55>: fmul %st(1),%st
0x00402db5 <+57>: fldt 0x4046f0
0x00402dbb <+63>: faddp %st,%st(1)
0x00402dbd <+65>: fmul %st(1),%st
0x00402dbf <+67>: fldt 0x4046e6
=> 0x00402dc5 <+73>: faddp %st,%st(1)
...snip...
End of assembler dump.
(gdb)
以下是poly4函数的源代码:
inline long double poly4(double y)
{
__asm__(
"\n\t" "fld1" //1
"\n\t" "fldl %[y]" //y, 1
"\n\t" "fmul %%st(0), %%st(0)" //y^2, 1
"\n\t" "fdivp %%st(0), %%st(1)" //1/y^2=xsq
//den
"\n\t" "fldt %[s_NORMAL_q1]" //q1, xsq
"\n\t" "fadd %%st(1), %%st(0)" //q1+xsq, xsq
"\n\t" "fmul %%st(1), %%st(0)" //(q1+xsq)*xsq, xsq
"\n\t" "fldt %[s_NORMAL_q2]" //q2, (q1+xsq)*xsq, xsq
"\n\t" "faddp %%st(0), %%st(1)" //q2+(q1+xsq)*xsq, xsq
"\n\t" "fmul %%st(1), %%st(0)" //(q2+(q1+xsq)*xsq)*xsq, xsq
"\n\t" "fldt %[s_NORMAL_q3]" //q3, (q2+(q1+xsq)*xsq)*xsq, xsq
"\n\t" "faddp %%st(0), %%st(1)" //q3+(q2+(q1+xsq)*xsq)*xsq, xsq
"\n\t" "fmul %%st(1), %%st(0)" //(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq, xsq
"\n\t" "fldt %[s_NORMAL_q4]" //q4, (q3+(q2+(q1+xsq)*xsq)*xsq)*xsq, xsq
"\n\t" "faddp %%st(0), %%st(1)" //q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq, xsq
"\n\t" "fmul %%st(1), %%st(0)" //(q4+(q3+(q2+(q1+ xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_q5]" //q5, (q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
//num
"\n\t" "fldt %[s_NORMAL_p0]" //p0, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmul %%st(2), %%st(0)" //p0*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_p1]" //p1, p0*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //p1+p0*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmul %%st(2), %%st(0)" //(p1+p0*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_p2]" //p2, (p1+p0*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //p2+(p1+p0*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmul %%st(2), %%st(0)" //(p2+(p1+p0*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_p3]" //p3, (p2+(p1+p0*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //p3+(p2+(p1+p0*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmul %%st(2), %%st(0)" //(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_p4]" //p4, (p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //p4+(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmul %%st(2), %%st(0)" //(p4+(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fldt %[s_NORMAL_p5]" //p5, (p4+(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "faddp %%st(0), %%st(1)" //p5+(p4+(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq)*xsq, q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq), xsq
"\n\t" "fmulp %%st(0), %%st(2)" //q5+(q4+(q3+(q2+(q1+xsq)*xsq)*xsq)*xsq)=den, (p5+(p4+(p3+(p2+(p1+p0*xsq)*xsq)*xsq)*xsq)*xsq)*xsq=num
// num/den
"\n\t" "fdivp %%st(0), %%st(1)" //num/den
"\n\t" "fldt %[s_oneOverRootTwoPi]" // oneOverRootTwoPi, num/den
"\n\t" "fsubrp %%st(0), %%st(1)" //oneOverRootTwoPi - num/den
"\n\t" "fldl %[y]" //y, (oneOverRootTwoPi - num/den)
"\n\t" "fdiv %%st(0), %%st(1)" //y, (oneOverRootTwoPi - num/den)/y
"\n\t" "sub $8, %%esp"
"\n\t" "fstpl (%%esp)" //(oneOverRootTwoPi - num/den)/y
"\n\t" "call (%P[exp_X2_2])"
"\n\t" "add $8, %%esp"
"\n\t" "fmulp %%st(0), %%st(1)"
"\n\t" "leave"
"\n\t" "ret"
:
: [y] "m" (y)
, [s_oneOverRootTwoPi] "m" (*s_oneOverRootTwoPi)
, [s_NORMAL_p0] "m" (*s_NORMAL_p0)
, [s_NORMAL_p1] "m" (*s_NORMAL_p1)
, [s_NORMAL_p2] "m" (*s_NORMAL_p2)
, [s_NORMAL_p3] "m" (*s_NORMAL_p3)
, [s_NORMAL_p4] "m" (*s_NORMAL_p4)
, [s_NORMAL_p5] "m" (*s_NORMAL_p5)
, [s_NORMAL_q1] "m" (*s_NORMAL_q1)
, [s_NORMAL_q2] "m" (*s_NORMAL_q2)
, [s_NORMAL_q3] "m" (*s_NORMAL_q3)
, [s_NORMAL_q4] "m" (*s_NORMAL_q4)
, [s_NORMAL_q5] "m" (*s_NORMAL_q5)
, [exp_X2_2] "i" (exp_X2_2)
:
);
}
这是FPU在无效负载之前的状态:
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
=>R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
R5: Empty 0x3ff6f7e2148bebef37f8
R4: Empty 0x000000020a0d00000007
R3: Empty 0xf1be000000000002021e
R2: Empty 0x00001697f1bf00003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff3320 PE C0 C1
TOP: 6
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff0fff
Instruction Pointer: 0x1b:0x00402dbd
Operand Pointer: 0xffff0023:0x004046f0
Opcode: 0xd8c9
我想知道上面状态词中的“C1”标志是什么意思-我找不到关于这个的文档。
这是故障fldt(由stepi执行)后的立即状态:
好的,我现在修改了代码,以便0x002DB5和0x002DBF的指令相同。第一个成功,第二个失败。这是一个gdb会话,显示了反汇编代码和执行两条相同指令之前的fpu状态。状态的唯一显著差异是在执行第二条fldt指令之前的状态中存在C1标志:
(gdb) disassemble
Dump of assembler code for function poly4(double):
0x00402d7c <+0>: push %ebp
0x00402d7d <+1>: mov %esp,%ebp
0x00402d7f <+3>: sub $0x8,%esp
0x00402d82 <+6>: mov 0x8(%ebp),%eax
0x00402d85 <+9>: mov %eax,-0x8(%ebp)
0x00402d88 <+12>: mov 0xc(%ebp),%eax
0x00402d8b <+15>: mov %eax,-0x4(%ebp)
=> 0x00402d8e <+18>: fld1
0x00402d90 <+20>: fldl -0x8(%ebp)
0x00402d93 <+23>: fmul %st(0),%st
0x00402d95 <+25>: fdivrp %st,%st(1)
0x00402d97 <+27>: fldt 0x40470e
0x00402d9d <+33>: fadd %st(1),%st
0x00402d9f <+35>: fmul %st(1),%st
0x00402da1 <+37>: fldt 0x404704
0x00402da7 <+43>: faddp %st,%st(1)
0x00402da9 <+45>: fmul %st(1),%st
0x00402dab <+47>: fldt 0x4046fa
0x00402db1 <+53>: faddp %st,%st(1)
0x00402db3 <+55>: fmul %st(1),%st
0x00402db5 <+57>: fldt 0x4046f0
0x00402dbb <+63>: faddp %st,%st(1)
0x00402dbd <+65>: fmul %st(1),%st
0x00402dbf <+67>: fldt 0x4046f0
0x00402dc5 <+73>: faddp %st,%st(1)
0x00402dc7 <+75>: fldt 0x4046dc
0x00402dcd <+81>: fmul %st(2),%st
0x00402dcf <+83>: fldt 0x4046d2
0x00402dd5 <+89>: faddp %st,%st(1)
0x00402dd7 <+91>: fmul %st(2),%st
0x00402dd9 <+93>: fldt 0x4046c8
0x00402ddf <+99>: faddp %st,%st(1)
0x00402de1 <+101>: fmul %st(2),%st
0x00402de3 <+103>: fldt 0x4046be
0x00402de9 <+109>: faddp %st,%st(1)
0x00402deb <+111>: fmul %st(2),%st
0x00402ded <+113>: fldt 0x4046b4
0x00402df3 <+119>: faddp %st,%st(1)
0x00402df5 <+121>: fmul %st(2),%st
0x00402df7 <+123>: fldt 0x4046aa
0x00402dfd <+129>: faddp %st,%st(1)
0x00402dff <+131>: fmulp %st,%st(2)
0x00402e01 <+133>: fdivrp %st,%st(1)
0x00402e03 <+135>: fldt 0x40408e
0x00402e09 <+141>: fsubrp %st,%st(1)
0x00402e0b <+143>: fldl -0x8(%ebp)
0x00402e0e <+146>: fdivr %st,%st(1)
0x00402e10 <+148>: sub $0x8,%esp
0x00402e13 <+151>: fstpl (%esp)
0x00402e16 <+154>: fwait
0x00402e17 <+155>: call 0x4013c0 <exp_X2_2(double)>
0x00402e1c <+160>: add $0x8,%esp
0x00402e1f <+163>: fmulp %st,%st(1)
0x00402e21 <+165>: fstl 0x406020
0x00402e27 <+171>: fld %st(0)
0x00402e29 <+173>: fsubl 0x406020
0x00402e2f <+179>: fildll 0x403020
0x00402e35 <+185>: fmulp %st,%st(1)
0x00402e37 <+187>: fstpl 0x406020
0x00402e3d <+193>: leave
0x00402e3e <+194>: ret
0x00402e3f <+195>: flds 0x40472c
0x00402e45 <+201>: leave
0x00402e46 <+202>: ret
End of assembler dump.
(gdb) tbreak *0x00402db5
Temporary breakpoint 61 at 0x402db5: file cody2.cpp, line 1489.
(gdb) continue
Continuing.
Temporary breakpoint 61, 0x00402db5 in poly4 (y=37.37840817302294) at cody2.cpp:1489
1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
=>R6: Valid 0x3ff0c71ba235b8f6a603 +4.7471033066735141e-005
R5: Empty 0x3ffb8724c9f09161c535
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff3120 PE C0
TOP: 6
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff0fff
Instruction Pointer: 0x1b:0x00402db3
Operand Pointer: 0xffff0023:0x004046fa
Opcode: 0xd8c9
(gdb) stepi
0x00402dbb 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
R6: Valid 0x3ff0c71ba235b8f6a603 +4.7471033066735141e-005
=>R5: Valid 0x3ff6f7e2148bebef37f8 +0.0037823963320275824
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff2920 PE C0
TOP: 5
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff03ff
Instruction Pointer: 0x1b:0x00402db5
Operand Pointer: 0xffff0023:0x004046f0
Opcode: 0xdb2d
(gdb) stepi
0x00402dbd 1489 );
(gdb) stepi
0x00402dbf 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
=>R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
R5: Empty 0x3ff6f7e2148bebef37f8
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff3320 PE C0 C1
TOP: 6
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff0fff
Instruction Pointer: 0x1b:0x00402dbd
Operand Pointer: 0xffff0023:0x004046f0
Opcode: 0xd8c9
(gdb) stepi
0x00402dc5 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
=>R5: Zero 0x00000000000000000000 +0
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff2920 PE C0
TOP: 5
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff07ff
Instruction Pointer: 0x1b:0x00402dbf
Operand Pointer: 0xffff0023:0x0040ccf0
Opcode: 0xdb2d
(gdb)
(gdb)反汇编
函数poly4的汇编代码转储(双精度):
0x00402d7c:推送%ebp
0x00402d7d:mov%esp,%ebp
0x00402d7f:sub$0x8,%esp
0x00402d82:mov 0x8(%ebp),%eax
0x00402d85:mov%eax,-0x8(%ebp)
0x00402d88:mov 0xc(%ebp),%eax
0x00402d8b:mov%eax,-0x4(%ebp)
=>0x00402d8e:fld1
0x00402d90:fldl-0x8(%ebp)
0x00402d93:fmul%st(0),%st
0x00402d95:fdivrp%st,%st(1)
0x00402d97:fldt 0x40470e
0x00402d9d:fadd%st(1),%st
0x00402d9f:fmul%st(1),%st
0x00402da1:fldt 0x404704
0x00402da7:faddp%st,%st(1)
0x00402da9:fmul%st(1),%st
0x002DAB:fldt 0x4046fa
0x00402db1:faddp%st,%st(1)
0x00402db3:fmul%st(1),%st
0x00402db5:fldt 0x4046f0
0x00402dbb:faddp%st,%st(1)
0x00402dbd:fmul%st(1),%st
0x00402dbf:fldt 0x4046f0
0x00402dc5:faddp%st,%st(1)
0x00402dc7:fldt 0x4046dc
0x00402dcd:fmul%st(2),%st
0x00402dcf:fldt 0x4046d2
0x00402dd5:faddp%st,%st(1)
0x00402dd7:fmul%st(2),%st
0x00402dd9:fldt 0x4046c8
0x00402ddf:faddp%st,%st(1)
0x00402de1:fmul%st(2),%st
0x00402de3:fldt 0x4046be
0x00402de9:faddp%st,%st(1)
0x00402db:fmul%st(2),%st
0x00402DD:fldt 0x4046b4
0x00402df3:faddp%st,%st(1)
0x00402df5:fmul%st(2),%st
0x00402df7:fldt 0x4046aa
0x00402dfd:faddp%st,%st(1)
0x002DFF:fmulp%st,%st(2)
0x00402e01:fdivrp%st,%st(1)
0x00402e03:fldt 0x40408e
0x00402e09:fsubrp%st,%st(1)
0x00402e0b:fldl-0x8(%ebp)
0x00402e0e:fdivr%st,%st(1)
0x00402e10:子$0x8,%esp
0x00402e13:fstpl(%esp)
0x00402e16:fwait
0x00402e17:调用0x4013c0
0x00402e1c:添加$0x8,%esp
0x00402e1f:fmulp%st,%st(1)
0x00402e21:fstl 0x406020
0x00402e27:fld%st(0)
0x00402e29:fsubl 0x406020
0x00402e2f:fildll 0x403020
0x00402e35:fmulp%st,%st(1)
0x00402e37:fstpl 0x406020
0x00402e3d:离开
0x00402e3e:ret
0x00402e3f:flds 0x40472c
0x00402e45:离开
0x00402e46:ret
汇编程序转储结束。
(gdb)tbreak*0x00402db5
0x402db5处的临时断点61:文件cody2.cpp,第1489行。
(gdb)继续
持续的。
poly4(y=37.37840817302294)中代码2处的临时断点61,0x002DB5。cpp:1489
1489 );
(gdb)信息浮动
R7:有效0x3ff4bba0d78724c01468+0.00071574511983807409
=>R6:有效0x3ff0c71ba235b8f6a603+4.7471033066735141e-005
R5:空0x3ffb8724c9f09161c535
R4:空0xf13d00000a0d00000007
R3:空0x07ec000000000002021e
R2:空0x000016cbc40900003654
R1:空0x00020098007c00f8f0c0
R0:空0x00077c81cc3b0002021e
状态字:0xffff3120 PE C0
排名:6
控制字:0xffff037f IM DM ZM OM UM PM
PC:扩展精度(64位)
RC:四舍五入到最近
标记字:0xffff0fff
指令指针:0x1b:0x002DB3
操作数指针:0xffff0023:0x004046fa
操作码:0xd8c9
(gdb)stepi
0x00402dbb 1489);
(gdb)信息浮动
R7:有效0x3ff4bba0d78724c01468+0.00071574511983807409
R6:有效0x3ff0c71ba235b8f6a603+4.747103306673514E-005
=>R5:有效0x3FF6F7E2148BEBEBF37F8+0.00378239633203275824
R4:空0xf13d00000a0d00000007
R3:空0x07ec000000000002021e
R2:空0x000016cbc40900003654
R1:空0x00020098007c00f8f0c0
R0:空0x00077c81cc3b0002021e
状态字:0xffff2920 PE C0
排名:5
控制字:0xffff037f IM DM ZM OM UM PM
PC:扩展精度(64位)
RC:四舍五入到最近
标记字:0xffff03ff
指令指针:0x1b:0x002DB5
操作数指针:0xffff0023:0x004046f0
操作码:0xdb2d
(gdb)stepi
0x00402dbd 1489);
(gdb)stepi
0x00402dbf 1489);
(gdb)信息浮动
R7:有效0x3ff4bba0d78724c01468+0.00071574511983807409
=>R6:有效0x3fecb7f59c22579f9f60+2.7412088761933612e-006
R5:空0x3ff6f7e2148bebef37f8
R4:空0xf13d00000a0d00000007
R3:空0x07ec000000000002021e
R2:空0x000016cbc40900003654
R1:空0x00020098007c00f8f0c0
R0:空0x00077c81cc3b0002021e
状态字:0xffff3320 PE C0 C1
(gdb) stepi
0x00402dc5 1485 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
=>R5: Zero 0x00000000000000000000 +0
R4: Empty 0x000000020a0d00000007
R3: Empty 0xf1be000000000002021e
R2: Empty 0x00001697f1bf00003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff2920 PE C0
TOP: 5
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff07ff
Instruction Pointer: 0x1b:0x00402dbf
Operand Pointer: 0xffff0023:0x0040cce6
Opcode: 0xdb2d
(gdb) disassemble
Dump of assembler code for function poly4(double):
0x00402d7c <+0>: push %ebp
0x00402d7d <+1>: mov %esp,%ebp
0x00402d7f <+3>: sub $0x8,%esp
0x00402d82 <+6>: mov 0x8(%ebp),%eax
0x00402d85 <+9>: mov %eax,-0x8(%ebp)
0x00402d88 <+12>: mov 0xc(%ebp),%eax
0x00402d8b <+15>: mov %eax,-0x4(%ebp)
=> 0x00402d8e <+18>: fld1
0x00402d90 <+20>: fldl -0x8(%ebp)
0x00402d93 <+23>: fmul %st(0),%st
0x00402d95 <+25>: fdivrp %st,%st(1)
0x00402d97 <+27>: fldt 0x40470e
0x00402d9d <+33>: fadd %st(1),%st
0x00402d9f <+35>: fmul %st(1),%st
0x00402da1 <+37>: fldt 0x404704
0x00402da7 <+43>: faddp %st,%st(1)
0x00402da9 <+45>: fmul %st(1),%st
0x00402dab <+47>: fldt 0x4046fa
0x00402db1 <+53>: faddp %st,%st(1)
0x00402db3 <+55>: fmul %st(1),%st
0x00402db5 <+57>: fldt 0x4046f0
0x00402dbb <+63>: faddp %st,%st(1)
0x00402dbd <+65>: fmul %st(1),%st
0x00402dbf <+67>: fldt 0x4046f0
0x00402dc5 <+73>: faddp %st,%st(1)
0x00402dc7 <+75>: fldt 0x4046dc
0x00402dcd <+81>: fmul %st(2),%st
0x00402dcf <+83>: fldt 0x4046d2
0x00402dd5 <+89>: faddp %st,%st(1)
0x00402dd7 <+91>: fmul %st(2),%st
0x00402dd9 <+93>: fldt 0x4046c8
0x00402ddf <+99>: faddp %st,%st(1)
0x00402de1 <+101>: fmul %st(2),%st
0x00402de3 <+103>: fldt 0x4046be
0x00402de9 <+109>: faddp %st,%st(1)
0x00402deb <+111>: fmul %st(2),%st
0x00402ded <+113>: fldt 0x4046b4
0x00402df3 <+119>: faddp %st,%st(1)
0x00402df5 <+121>: fmul %st(2),%st
0x00402df7 <+123>: fldt 0x4046aa
0x00402dfd <+129>: faddp %st,%st(1)
0x00402dff <+131>: fmulp %st,%st(2)
0x00402e01 <+133>: fdivrp %st,%st(1)
0x00402e03 <+135>: fldt 0x40408e
0x00402e09 <+141>: fsubrp %st,%st(1)
0x00402e0b <+143>: fldl -0x8(%ebp)
0x00402e0e <+146>: fdivr %st,%st(1)
0x00402e10 <+148>: sub $0x8,%esp
0x00402e13 <+151>: fstpl (%esp)
0x00402e16 <+154>: fwait
0x00402e17 <+155>: call 0x4013c0 <exp_X2_2(double)>
0x00402e1c <+160>: add $0x8,%esp
0x00402e1f <+163>: fmulp %st,%st(1)
0x00402e21 <+165>: fstl 0x406020
0x00402e27 <+171>: fld %st(0)
0x00402e29 <+173>: fsubl 0x406020
0x00402e2f <+179>: fildll 0x403020
0x00402e35 <+185>: fmulp %st,%st(1)
0x00402e37 <+187>: fstpl 0x406020
0x00402e3d <+193>: leave
0x00402e3e <+194>: ret
0x00402e3f <+195>: flds 0x40472c
0x00402e45 <+201>: leave
0x00402e46 <+202>: ret
End of assembler dump.
(gdb) tbreak *0x00402db5
Temporary breakpoint 61 at 0x402db5: file cody2.cpp, line 1489.
(gdb) continue
Continuing.
Temporary breakpoint 61, 0x00402db5 in poly4 (y=37.37840817302294) at cody2.cpp:1489
1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
=>R6: Valid 0x3ff0c71ba235b8f6a603 +4.7471033066735141e-005
R5: Empty 0x3ffb8724c9f09161c535
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff3120 PE C0
TOP: 6
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff0fff
Instruction Pointer: 0x1b:0x00402db3
Operand Pointer: 0xffff0023:0x004046fa
Opcode: 0xd8c9
(gdb) stepi
0x00402dbb 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
R6: Valid 0x3ff0c71ba235b8f6a603 +4.7471033066735141e-005
=>R5: Valid 0x3ff6f7e2148bebef37f8 +0.0037823963320275824
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff2920 PE C0
TOP: 5
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff03ff
Instruction Pointer: 0x1b:0x00402db5
Operand Pointer: 0xffff0023:0x004046f0
Opcode: 0xdb2d
(gdb) stepi
0x00402dbd 1489 );
(gdb) stepi
0x00402dbf 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
=>R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
R5: Empty 0x3ff6f7e2148bebef37f8
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff3320 PE C0 C1
TOP: 6
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff0fff
Instruction Pointer: 0x1b:0x00402dbd
Operand Pointer: 0xffff0023:0x004046f0
Opcode: 0xd8c9
(gdb) stepi
0x00402dc5 1489 );
(gdb) info float
R7: Valid 0x3ff4bba0d78724c01468 +0.00071574511983807409
R6: Valid 0x3fecb7f59c22579f9f60 +2.7412088761933612e-006
=>R5: Zero 0x00000000000000000000 +0
R4: Empty 0xf13d00000a0d00000007
R3: Empty 0x07ec000000000002021e
R2: Empty 0x000016cbc40900003654
R1: Empty 0x00020098007c00f8f0c0
R0: Empty 0x00077c81cc3b0002021e
Status Word: 0xffff2920 PE C0
TOP: 5
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
Tag Word: 0xffff07ff
Instruction Pointer: 0x1b:0x00402dbf
Operand Pointer: 0xffff0023:0x0040ccf0
Opcode: 0xdb2d
(gdb)
st2 <invalid float value> (raw 0x00077c81cc3b0002021e)
st3 <invalid float value> (raw 0x00020098007c00f8f0c0)
st4 0 (raw 0x000013af076300003654)
st5 <invalid float value> (raw 0x0762000000000002021e)