我很难追踪这个装配错误,非常感谢一些帮助。
我已经将这个错误追踪到了一个地方,这让我很困惑:
not_object:
movq _stanza_header(%rip), %rbp
movq c_rsp_offset(%rbp), %rsp
andq $-16, %rsp
addq $0, %rsp // Code does not work without this line
call _gc_failure
出于某种原因,添加虚拟语句 (addq $0, %rsp) 会使代码工作,而没有它,它就不会。
有谁知道这种行为是如何发生的?我没有将代码动态加载到堆中,所以我不相信我会以某种方式覆盖代码而没有段错误。
我正在使用 Apple 的 i686-apple-darwin10-gcc-4.2.1 在 64 位 Intel 机器上组装代码。
非常感谢您的帮助!-帕特里克
生成的机器代码(由 gdb 反汇编)与我写的相匹配:
not_object:
0x000000010001060e <not_object+0>: mov 0xabb(%rip),%rbp # 0x1000110d0 <stanza_header>
0x0000000100010615 <not_object+7>: mov 0x58(%rbp),%rsp
0x0000000100010619 <not_object+11>: and $0xfffffffffffffff0,%rsp
0x000000010001061d <not_object+15>: add $0x0,%rsp
0x0000000100010621 <not_object+19>: callq 0x10000173f <gc_failure>
所以我想我应该排除一个错误的汇编程序作为原因。