Assembly 将0添加到寄存器会导致bug消失吗?

Assembly 将0添加到寄存器会导致bug消失吗?,assembly,x86,x86-64,Assembly,X86,X86 64,我很难找到这个程序集错误,非常感谢您的帮助 我已经追踪到了一个地方,这让我非常困惑: 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 出于

我很难找到这个程序集错误,非常感谢您的帮助

我已经追踪到了一个地方,这让我非常困惑:

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)可以使代码正常工作,没有它,代码就不能正常工作

有人知道这种行为是如何产生的吗?我没有动态地将代码加载到堆中,所以我不相信我会以某种方式无故障地覆盖代码

我正在使用苹果的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>
非对象:
0x000000010001060e:mov 0xabb(%rip),%rbp#0x10000110D0
0x0000000100010615:mov 0x58(%rbp),%rsp
0x0000000100010619:和$0xFFFFFFFFFFF0,%rsp
0x000000010001061d:添加$0x0,%rsp
0x0000000100010621:callq 0x10000173f

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

符号会在其他地方结束吗?意外堆损坏?(可以以各种方式显示)嗯…标志重置?生成的机器代码是什么样子的?在这里刮桶(生成的机器代码(由gdb反汇编)与写入的代码不匹配:非对象:0x000000010001060e:mov 0xabb(%rip),%rbp#0x1000110d0 0x0000000100010615:mov 0x58(%rbp),%rsp 0x0000000100010619:和$0xFFFFFFFFF0,%rsp 0x000000010001061d:添加$0x0,%rsp 0x0000000100010621:callq 0x10000173f我想这意味着我可以排除错误汇编程序作为原因。@user1156849你怎么知道的?你没有显示机器代码。具体是什么“不工作”?您是否尝试过单步跳过gdb中的代码并比较标志?