0

我很难追踪这个装配错误,非常感谢一些帮助。

我已经将这个错误追踪到了一个地方,这让我很困惑:

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>

所以我想我应该排除一个错误的汇编程序作为原因。

4

0 回答 0