3

我正在开发一些带有内联汇编的软件的端口,因为我们从X32下的 Debian 维护者那里获取了一些错误报告。该代码在 X86 和 X64 下都很好。

我们在emms指令中发现了一个总线错误:

   ...
   0x005520fd <+3885>:  pop    %rsp
   0x005520fe <+3886>:  emms   
=> 0x00552100 <+3888>:  pop    %rbx
   0x00552101 <+3889>:  jmpq   0x5519e3
   0x00552106 <+3894>:  nopw   %cs:0x0(%rax,%rax,1)
   ...

根据手册,会引发以下异常:

Exceptions:

    RM PM VM SMM Description
    #UD #UD #UD #UD If CR0.EM = 1
    #NM #NM #NM #NM If CR0.TS = 1
    #MF #MF #MF #MF If pending FPU Exception 

这是 MMX 状态寄存器中使用的掩码:

mxcsr    0x1f80    [ IM DM ZM OM UM PM ]

我不相信我可以访问控制寄存器来确定实际导致异常的原因,因此我无法定位总线错误的原因。

总线错误的一些潜在原因是什么?或者我该如何进一步解决这个问题?


这是info float

(gdb) info float
  R7: Empty   0xffffffffffffffffffff
  R6: Empty   0xffffa5a5a5a5a5a5a5a5
  R5: Empty   0xfffffedcba9876543210
  R4: Empty   0xffffb182db48cf349120
  R3: Empty   0xffff926cd0b6a839b535
  R2: Empty   0xfffff373de2d49584e7a
  R1: Empty   0xffff16166e76b1bb925f
=>R0: Empty   0xffff24f0130c63ac9332

Status Word:         0x0000                                            
                       TOP: 0
Control Word:        0x037f   IM DM ZM OM UM PM
                       PC: Extended Precision (64-bits)
                       RC: Round to nearest
Tag Word:            0xffff
Instruction Pointer: 0x00:0x00000000
Operand Pointer:     0x00:0x00000000
Opcode:              0x0000

这是来自info registers

(gdb) info registers
rax            0xffffcb58   0xffffcb58
rbx            0x30 0x30
rcx            0x14f3   0x14f3
rdx            0x61d560 0x61d560
rsi            0xffffcb08   0xffffcb08
rdi            0x14 0x14
rbp            0xffffcb58   0xffffcb58
rsp            0xb62f7cbfffffc8d8   0xb62f7cbfffffc8d8
r8             0x0  0x0
r9             0x40 0x40
r10            0x2e676e696e6e7572   0x2e676e696e6e7572
r11            0x246    0x246
r12            0x9028a0 0x9028a0
r13            0xffffcaf0   0xffffcaf0
r14            0x8f6120 0x8f6120
r15            0xffffca6c   0xffffca6c
rip            0x552100 0x552100
eflags         0x10246  [ PF ZF IF RF ]
cs             0x33 0x33
ss             0x2b 0x2b
ds             0x2b 0x2b
es             0x2b 0x2b
fs             0x63 0x63
gs             0x0  0x0

这是 MMX 状态寄存器位的细分:

  IM - Invalid Operation Mask
  DM - Denormalized Mask
  ZM - Divide By Zero Mask
  OM - Overflow Mask
  UM - Underflow Mask
  PM - Precision Mask
4

1 回答 1

0

EMMS正在执行没有问题,如箭头所示,并且rip错误的值如下pop,因为rsp指向无效的内存。的正确值rsp小于 0x100000000。

于 2015-09-23T07:38:49.840 回答