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中的代码并比较标志?