0

(我正在为 NASM 编写纯 x86 程序集,而不是 C/C++。)

当编译的二进制文件运行时,我遇到了分段错误 - 我知道这是一个古老的错误消息,但是搜索这个特定的分段错误实例并没有被证明是富有成效的:

gdb 表明故障发生在ENTER 616,0调用开始时。我相信这与将 old %rbp、 storage %rspinto%rbp和 reduction %rspfor616局部变量的字节数相同。

有没有更多经验的人暗示为什么会在这里发生分段错误?对于内存访问问题来说,这似乎是一个奇怪的地方——唯一想到的是 616 可能会减少很多,但除此之外它让我感到困惑。允许的大小是否有限制(可用内存总量除外)?

任何帮助将非常感激。

更新:如果有帮助,这不是一长串递归调用的结束:

(gdb) backtrace
#0  0x00000000004005e0 in user_func ()
#1  0x0000000000400e69 in if4 ()
#2  0xffffffffffffffff in ?? ()
#3  0xffffffffffffffff in ?? ()
#4  0x0000000000000000 in ?? ()

(gdb) frame 0
#0  0x00000000004005e0 in user_func ()

(gdb) disassemble
Dump of assembler code for function user_partition:
=> 0x00000000004005e0 <+0>:     enterq $0x2b0,$0x0
   0x00000000004005e4 <+4>:     push   %r15
   0x00000000004005e6 <+6>:     push   %r12
   0x00000000004005e8 <+8>:     push   %r13
   0x00000000004005ea <+10>:    push   %r14
   ...

更新 2:由于回溯似乎表明堆栈指针损坏,以下是有关每个方法调用的一些相关细节:

user_func:                           
   ENTER      296, 0                         
   PUSH       R13      ; Saving any callee-saved registers used in main body   
   PUSH       R15     
   PUSH       R14     
   PUSH       R12     
   ; Only opcodes to MOV between temp registers and [ RBP - x ]
   MOV        RAX, 0                        
   POP        R12      ; Restoring the callee-saved registers    
   POP        R14
   POP        R15
   POP        R13
   LEAVE                                    
   RET                                      

在推动/弹出事物方面,我是否可能在这里做错了什么?离开之前的流行音乐对我来说似乎是正确的......

4

1 回答 1

1

0x0000000000000回溯跟踪中的和之类的值0xffffffffffff表明您在某个时候已经丢弃了堆栈(覆盖了返回值或类似内容)。您的堆栈指针很可能是垃圾,因此推送到它很可能会导致段错误。

于 2012-05-04T21:06:40.303 回答