程序集中无法访问的代码

时间:2016-05-25 22:44:51

标签: c++ c gcc assembly x86

我正在调试linux中的崩溃,并正在进行函数cxa_finalize

的汇编

崩溃发生在看似无法访问的源代码行中:

cmp    %edx,%esi             // f >= &funcs->fns[0]
jae    0xb6e17b88            // enter for loop
jmp    0xb6e17c08            // exit for loop
lea    0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a 
                             // jmp above us, and nothing jumps to here
cmp    %edi,0xc(%esi)        // d == f->func.cxa.dso_handle (jumped to from below)

稍后在此方法中,在lea 0x0(%esi,%eiz,1),%esijmp之后还会显示另一条nop指令,该指令也显示无法访问。在这种情况下,jmp也会退出for循环。

这里是否存在一些无法接入指令的范例?

编辑:原来它并没有在lea指令上崩溃,而是在cmp之后的esi指令处,在onBlur访问内存时崩溃。

1 个答案:

答案 0 :(得分:4)

我找到了答案here

  

有时GCC会在代码流中插入NOP指令,以确保正确对齐和类似的东西。 NOP指令占用一个字节,因此您可以认为可以根据需要添加任意数量的字节。但根据Ian Lance Taylor的说法,芯片执行一条长指令要比许多短指令快。因此,它们不是插入七条NOP指令,而是使用一个奇怪的LEA,它占用了7个字节,在语义上等同于NOP