用于VC+的带内联asm的堆栈漫游+; 我在我的C++代码中插入了下面的ASM代码。我正在使用VC++编译器 char c; curr_stack_return_addr = s.AddrFrame.Offset; //I am doing a stack walk __asm{ push bx mov eax, curr_stack_return_addr mov bl, BYTE PTR [eax - 1] mov c,bl pop bx }

用于VC+的带内联asm的堆栈漫游+; 我在我的C++代码中插入了下面的ASM代码。我正在使用VC++编译器 char c; curr_stack_return_addr = s.AddrFrame.Offset; //I am doing a stack walk __asm{ push bx mov eax, curr_stack_return_addr mov bl, BYTE PTR [eax - 1] mov c,bl pop bx },c++,assembly,inline-assembly,C++,Assembly,Inline Assembly,我在c中为我的函数获得了正确的值,但当它到达堆栈上的系统函数时,它崩溃了。我没有发现编译器错误。我做错了什么 解决:我忘了检查堆栈末尾!最后一帧中的返回地址为0。谢谢大家。当您的程序进入asm块时,您无法知道eax的值。当您的程序进入asm块时,您无法知道eax的值。我在这里看到两个问题: push-bl和pop-bl不存在。您只能推送和弹出word或dwords。顺便说一下,编译器发出了警告 您如何知道eax指向合法地址 我在这里看到两个问题: push-bl和pop-bl不存在。您只能推送和

我在c中为我的函数获得了正确的值,但当它到达堆栈上的系统函数时,它崩溃了。我没有发现编译器错误。我做错了什么


解决:我忘了检查堆栈末尾!最后一帧中的返回地址为0。谢谢大家。

当您的程序进入asm块时,您无法知道eax的值。

当您的程序进入asm块时,您无法知道eax的值。

我在这里看到两个问题:

  • push-bl
    pop-bl
    不存在。您只能推送和弹出word或dwords。顺便说一下,编译器发出了警告

  • 您如何知道eax指向合法地址


  • 我在这里看到两个问题:

  • push-bl
    pop-bl
    不存在。您只能推送和弹出word或dwords。顺便说一下,编译器发出了警告

  • 您如何知道eax指向合法地址


  • 它什么时候坠毁?您如何知道在删除行“mov bl,BYTE PTR[eax-1]”时得到了正确的值。我对汇编没有经验,但我怀疑您可能在这里处理了不正确的内存。您的解决方案可能会围绕这一点。请使用StackWalk64进行堆栈漫游,除非您有多线程+性能关键考虑因素。您不需要
    推送bx
    ,即使您这样做了
    推送ebx
    ,也会更有效率。与GNU C内联asm不同,MSVC内联asm保存您使用的所有寄存器。(另请参见。事实上,我完全不明白为什么您需要内联asm。我可以看到使用它来获取
    esp
    或其他的当前值,但是您可以而且应该使用纯C通过强制转换到指向struct或
    char*
    的指针来实现这一点。它何时崩溃?您如何知道在cTry中删除l时获得了正确的值ine,“mov bl,字节PTR[eax-1]”。我没有汇编方面的经验,但我怀疑您可能在这里寻址了不正确的内存。您的修复可能会围绕这一点。请使用StackWalk64进行堆栈漫游,除非您有多线程+性能关键的考虑因素。您不需要
    推送bx
    ,即使您这样做了
    推送ebx
    ,也会更有效率。U与GNU C内联asm类似,MSVC内联asm保存您使用的所有寄存器。(另请参见。事实上,我完全不明白为什么需要使用内联asm。我可以看到使用它来获取
    esp
    或其他内容的当前值,但是您可以也应该使用纯C,通过强制转换到指向struct或
    char*
    的指针来实现这一点。实际上,
    eax
    可能是最频繁被碰撞的寄存器。eax C包含系统dll中的地址。你认为这是原因吗?@Bruce:从发布的代码中,你不知道eax指向什么。你能发布一个更完整的代码吗?事实上,
    eax
    可能是最经常被破坏的寄存器。eax包含系统dll中的地址。你认为这是原因吗?@Bruce:从发布的代码中,你不能知道eax指向什么。你能发布一个更完整的代码吗?