(我正在为 NASM 编写纯 x86 程序集,而不是 C/C++。)
当编译的二进制文件运行时,我遇到了分段错误 - 我知道这是一个古老的错误消息,但是搜索这个特定的分段错误实例并没有被证明是富有成效的:
gdb 表明故障发生在ENTER 616,0
调用开始时。我相信这与将 old %rbp
、 storage %rsp
into%rbp
和 reduction %rsp
for616
局部变量的字节数相同。
有没有更多经验的人暗示为什么会在这里发生分段错误?对于内存访问问题来说,这似乎是一个奇怪的地方——唯一想到的是 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
在推动/弹出事物方面,我是否可能在这里做错了什么?离开之前的流行音乐对我来说似乎是正确的......